我希望在 JSF-1.2 中支持带有参数的自定义函数调用,并遇到了这个文档http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaio。
但是是否可以对该函数使用可变参数?
我尝试使用数组,Tag Library
但看起来 JSF 在这种情况下无法识别该函数。
我希望在 JSF-1.2 中支持带有参数的自定义函数调用,并遇到了这个文档http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaio。
但是是否可以对该函数使用可变参数?
我尝试使用数组,Tag Library
但看起来 JSF 在这种情况下无法识别该函数。
不,EL 方法表达式不支持可变参数。当前的EL 2.2版本中没有,未来的EL 3.0版本中也没有。
您需要寻找替代方法。由于具体的功能要求不清楚,我不能推荐任何一个。
更新:功能要求是:
我必须在我的页面所涉及的 JavaScript 中使用来自消息包的参数化消息。尝试删除在消息包中具有参数化文件名的文件时出现错误或警报消息。
好吧,没有聪明的解决方法可以解决这个问题。您有 2 个选项:
创建一组采用不同数量参数的 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 实用程序库具有<o:outputFormat>
组件风格的解决方案和多个of:formatX()
功能。它在 JSF 1.x 上不可用,但它是开源的,应该提供一些见解。
您可以将列表或数组传递给自定义函数。
警告:此代码未经测试,可能会让您感到肮脏 - 这是一个完整的 hack。
我们需要两个注册为托管 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
。
我不知道这是否真的有效。