可以将变量参数传递给自定义EL函数吗?

时间:2013-03-19 11:06:08

标签: facelets el jsf-1.2 variadic-functions

我希望在JSF-1.2中支持带参数的自定义函数调用,并且遇到了这个文档http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaio

但是可以对该函数使用变量参数吗?

我尝试在Tag Library中使用数组,但看起来JSF在这种情况下无法识别该函数。

2 个答案:

答案 0 :(得分:4)

不,EL方法表达式不支持varargs。不在当前EL 2.2 version中,也不在将来EL 3.0 version

您需要寻找替代方法。由于具体的功能要求不清楚,我不能推荐任何一个。


更新:功能要求是:

  

我必须使用我页面中涉及的JavaScript中的Message Bundle中的参数化消息。尝试删除在消息包中参数化的文件的文件时出现错误或警告消息。

嗯,没有聪明的解决方法可以解决这个问题。您有两个选择:

  1. 使用不同数量的参数创建一堆EL函数。

    #{my:format1(...)}
    #{my:format2(...)}
    #{my:format3(...)}
    ...
    
  2. 扩展<h:outputFormat>以将结果存储在请求范围的变量中,而不是将其打印出来。

    <my:outputFormat ... var="foo">
        <f:param ... />
        <f:param ... />
        <f:param ... />
        ...
    </my:outputFormat>
    
    ...
    #{foo}
    
  3. 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

我不知道这是否真的有效。