[英]Is it possible overload an EL method in JSF 1.1 / Facelets
是否可以使用Facelets作為視圖處理程序來重載JSF 1.1中的EL方法? 如果是這樣,怎么辦?
例如,我有這段代碼定義了我的EL方法(在命名空間k中定義):
public static String doStuff( String s ) {
return doStuff( null, s );
}
public static String doStuff( Map<String,String> m, String s ) {
...
return something;
}
當我嘗試從Facelets頁面調用#{k:doStuff("hey!")}
,出現以下錯誤:
Function 'k:doStuff' specifies 2 params, but 1 was declared
事實證明,無論您如何聲明該函數,都將其放置在Map
,其名稱用作鍵。 所以-沒有函數重載。
但是,可以將XML中的函數name
定義為不同的名稱,然后可以重載方法。 這有點違反直覺。 但是,您的功能將通過頁面中的不同名稱進行訪問。
通過為重載的方法名稱(在映射中放置)提供后綴,可以動態地實現同一目標。 無論哪種方式,它都不是一個好的解決方案。
看起來問題在於如何聲明它。 例如,我使用它來聲明我的方法:
public class KTagLib extends AbstractTagLibrary {
public static final String NAMESPACE = "http://mysite.blah/tags";
public static final KTagLib INSTANCE = new KTagLib();
public KTagLib() {
super(NAMESPACE);
try{
try {
Method[] methods = KTags.class.getMethods();
for (int i = 0; i < methods.length; i++) {
if (Modifier.isStatic(methods[i].getModifiers())) {
this.addFunction(methods[i].getName(), methods[i]);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
並使用以下配置:
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<library-class>mypackage.KTagLib</library-class>
</facelet-taglib>
但是, this.addFunction()
本質上是在java.util.Map對象上調用put()
,因此不能添加重復的方法,因為doStuff
之間的鍵是相同的。
要解決此問題,除非有人知道動態解決問題的方法,否則我將不得不在* .taglib.xml中顯式聲明這些方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.