如何在EL中调用带参数的辅助方法

时间:2013-04-03 14:27:03

标签: jsf jsf-2 facelets el

我在托管bean中有一个值列表。

Values

120
70
30
60

然而,要求是将这些值映射到红色之间的颜色(0% )和绿色(100%)。我需要将此转换后的颜色值提供给数据驱动组件的列(类似于h:dataTable),该组件具有 color 属性,该属性可以是EL(表达式语言)表达式。< / p>

因此,对于颜色转换的百分比,我可以使用给定here的简单算法。虽然它是在JavaScript中,但它可以很容易地用Java编写。让我们调用这个方法color()并让它在具有原始List(值)的托管bean中声明。

 Color  color(double percentage){}

现在我的问题是如何首先将百分比传递给此方法,然后在运行时将转换后的Color值传递回组件。

例如

<nameSpace:dataTable  values="#{bean.Values} var="row" ...>
   <nameSpace:column  color="#{expression language syntax}" -->

所以这种表达语言应该能够:

  1. 首先计算百分比(因此对于值30,百分比应为((30/120)* 100)= 25,然后将此百分比传递给color()函数。

    < / LI>
  2. 然后继续将百分比传递给先前声明的color()方法,然后将该方法的返回值设置为color attrbute。

  3. 我正在使用JSF2.0。如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

有几种方法。

  1. Create a custom EL function

    <nameSpace:column color="#{f:color(row.percentage)}">
    
  2. Utilize EL 2.2 feature of invoking methods with arguments(Weblogic 12c与Servlet 3.0兼容,因此只要webapp提供的web.xml兼容Servlet 3.0,这应该可以。)

    <nameSpace:column color="#{bean.color(row.percentage)}">
    
  3. 直接在模型中准备所需的数据。

    <nameSpace:column color="#{row.color}">
    
  4. 以编程方式评估getter方法中的EL表达式#{row}

    <nameSpace:column color="#{bean.color}">
    

    Double percentage = context.getApplication().evaluateExpressionGet(context, "#{row.percentage}", Double.class);
    // ...