我希望在JSF-1.2中支持带参数的自定义函数调用,并且遇到了这个文档http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaio。
但是可以对该函数使用变量参数吗?
我尝试在Tag Library
中使用数组,但看起来JSF在这种情况下无法识别该函数。
答案 0 :(得分:4)
不,EL方法表达式不支持varargs。不在当前EL 2.2 version中,也不在将来EL 3.0 version。
您需要寻找替代方法。由于具体的功能要求不清楚,我不能推荐任何一个。
更新:功能要求是:
我必须使用我页面中涉及的JavaScript中的Message Bundle中的参数化消息。尝试删除在消息包中参数化的文件的文件时出现错误或警告消息。
嗯,没有聪明的解决方法可以解决这个问题。您有两个选择:
使用不同数量的参数创建一堆EL函数。
#{my:format1(...)}
#{my:format2(...)}
#{my:format3(...)}
...
扩展<h:outputFormat>
以将结果存储在请求范围的变量中,而不是将其打印出来。
<my:outputFormat ... var="foo">
<f:param ... />
<f:param ... />
<f:param ... />
...
</my:outputFormat>
...
#{foo}
JSF2的OmniFaces JSF utility library包含<o:outputFormat>
component和几个of:formatX()
functions的解决方案。它在JSF 1.x上不可用,但它是开源的,应该提供一些见解。
答案 1 :(得分:0)
您可以将列表或数组传递给自定义函数。
警告:此代码未经测试,可能会让您感觉很脏 - 这是一个完整的黑客攻击。
我们需要将两个人工制品注册为托管bean。
1)颠覆的Map
类型:
/** Important: must be none-scoped */
public class ArrayBuilder extends AbstractMap<Object, Object> {
private List<Object> list = new ArrayList<Object>();
@Override public Object get(Object entry) {
if(entry instanceof MakeArray) {
return list.toArray();
} else {
list.add(entry);
return this;
}
}
@Override public Set<Entry<Object, Object>> entrySet() {
return Collections.emptySet();
}
}
触发阵列创建的毒丸:
/** should be application scoped bean */
public final class MakeArray {
}
EL表达式:
#{fn:foo(arrayBuilder['one']['two']['three'][makeArray])}
代码的目的是将包含三个字符串的Object
数组传递给函数foo
。
我不知道这是否真的有效。