【问题标题】:Passing variable arguments to custom EL function possible?可以将变量参数传递给自定义 EL 函数吗?
【发布时间】:2013-03-08 00:35:23
【问题描述】:

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

但是是否可以在该函数中使用可变参数?

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

【问题讨论】:

    标签: facelets el jsf-1.2 variadic-functions


    【解决方案1】:

    不,EL 方法表达式不支持可变参数。现在不在EL 2.2 version,以后也不在EL 3.0 version

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


    更新:功能要求如下:

    我必须在我的页面所涉及的 JavaScript 中使用来自消息包的参数化消息。尝试删除在消息包中具有参数化文件名的文件时出现错误或警报消息。

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

    1. 创建一组采用不同数量参数的 EL 函数。

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

      <my:outputFormat ... var="foo">
          <f:param ... />
          <f:param ... />
          <f:param ... />
          ...
      </my:outputFormat>
      
      ...
      #{foo}
      

    JSF2 的OmniFaces JSF utility library 既有&lt;o:outputFormat&gt; component 风格的解决方案,又有几个of:formatX() functions。它在 JSF 1.x 上不可用,但它是开源的,应该提供一些见解。

    【讨论】:

    • 感谢您这么快的回复,@Balusc!实际上,我必须在我的页面所涉及的 JavaScript 中使用来自 Message Bundle 的参数化消息。尝试删除在消息包中具有参数化文件名的文件时出现错误或警报消息。
    【解决方案2】:

    您可以将列表或数组传递给自定义函数。

    警告:此代码未经测试,可能会让您感到肮脏 - 这是一个完整的 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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多