2013-04-25 72 views
2

有没有办法以编程方式在java代码中注册自定义taglib参考?
我正在使用JSF 1.2_09,丰富的面孔3.3.3,jsf-facelets 1.1.14。以编程方式注册taglib参考

具体做法是:

在此代码,JSF表达式语言来为我们做了一些工作,像2个结果在一个领域或类似的东西拼接..的

FacesContext ctx = FacesContext.getCurrentInstance(); 
Application app = ctx.getApplication(); 
ExpressionFactory ef = app.getExpressionFactory(); 
ELContext elContext = ctx.getELContext(); 
ValueExpression valueExpression = new OverrideValueExpression(singleResult.getClass(), singleResult); 
elContext.getVariableMapper().setVariable("row", valueExpression); 

for (int i = 0; i < jsfDisplayValue.size(); i++){ 
    Object value = ef.createValueExpression(elContext, jsfDisplayValue.get(i), Object.class).getValue(ctx.getELContext()); 
//Do something with value... 
} 

例如,元素jsfDisplayValue可以是:
“#{row.name}#{row.surname}”, “{#} row.age”,"#{tagfoo:fooFunction(row.age)}" ...
当表达式包含函数,如突出显示,tagfoo:fooFunction出现问题。

堆栈跟踪:

javax.el.ELException: Function 'tagfoo:fooFunction' not found 
    at org.apache.el.lang.ExpressionBuilder.visit(ExpressionBuilder.java:198) 
    at org.apache.el.parser.SimpleNode.accept(SimpleNode.java:147) 
    at org.apache.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:155) 
    at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:173) 
    at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:217) 
    at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:67) 

ELContext不承认自定义函数,它无法解析功能,因为是未知的ELContext。 如何在java类中注册taglib引用,使ELContext可以识别自定义函数?

在JSF页面,我这样做:

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" 
xmlns:tagfoo="http://tagfoo.org/tags"> 

附:
我的自定义函数在jsf页面上正常工作。

回答

2

对不起,我有点晚了,但今天我偶然发现了同样的问题。

检查ElContext和FunctionMapper实例,我已经看到他们肯定是标准抽象类的自定义实现。因为我想保持我的代码的可移植性,所以我决定不参与编写特定实现的代码,并且由于抽象类只定义了读合同并省略了写事物的一面,所以我只写了一个自定义FunctionMapper。这里是meaningfull代码:

public void register(String prefix, String function, Method method) { 
    register.put(prefix + ":" + function, method); 
} 

@Override 
public Method resolveFunction(String prefix, String localName) { 
    if (register.containsKey(prefix + ":" + localName)) { 
     return register.get(prefix + ":" + localName); 
    } 
    for (FunctionMapper it : delegates) { 
     final Method current = it.resolveFunction(prefix, localName); 
     if (current != null) { 
      return current; 
     } 
    } 
    return null; 
} 

通过包装标准FunctionMapper,我可以轻松地添加自己的功能,并保持标准的环境确定。在我的情况下,我也必须编写一个自定义的ElContext实现,基本上克隆默认的ElContext并包装FunctionMapper。

我很满意结果,希望这有助于。

+0

感谢您的回复。我想我自己,我需要重写'resolveFunction'方法。难道你不认为更好的解决方案会是你的代码自动找到所有taglib并使用它们来解析函数吗? – 2013-07-23 13:32:24

相关问题