是否可以使用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
答案 0 :(得分:4)
事实证明,无论你如何声明这个函数,它都被放在Map
中,其名称用作键。所以 - 没有函数重载。
但是,您可以将XML中函数的name
定义为不同,然后您可以使用重载方法。这有点违反直觉。但是,您的功能可以通过页面中的不同名称访问。
通过为重载的方法名称(放在地图中)提供后缀,可以动态地实现相同的功能。无论哪种方式,它都不是一个好的解决方案。
答案 1 :(得分:1)
看起来问题在于如何宣布它。例如,我用它来声明我的方法:
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
之间的键是相同的。 / p>
要解决这个问题,我必须在* .taglib.xml中显式声明方法,除非有人知道动态解决问题的方法。