2013-04-25 135 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

相關問題