【问题标题】:How to invoke a helper method with arguments in EL如何在 EL 中调用带参数的辅助方法
【发布时间】:2013-03-25 06:47:51
【问题描述】:

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

价值观 120 70 30 60

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

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

 Color  color(double percentage){}

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

例如

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

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

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

  2. 然后继续将百分比传递给先前声明的color() 方法,然后将该方法的返回设置为color 属性。

我正在使用 JSF2.0。如何实现?

【问题讨论】:

  • 您不能应用color 算法来处理列表中的给定值,然后再通过getValues bean 方法返回它们吗?恕我直言,您不应该将这种预处理留给 EL 函数,而是留给 bean,如果可能的话,bean 可以返回一个现成的列表。
  • JSP 在 JSF2 中已被弃用,并由 Facelets 继承。确认一下,您是真的使用 JSP 还是将“JSP/EL”粗心地混为“一回事”?如果您真的在使用 JSP,您需要一种与 elias 评论中问题的答案中建议的方法不同的方法来注册自定义 EL 函数。另一种选择是利用新的 EL 2.2 特性,即使用参数调用方法。但为此,我们需要知道目标容器的品牌/版本。
  • @BalusC 我确实在使用 Facelets。对困惑感到抱歉。我已经删除了 JSP 标记。目标容器是 WebLogic Server 12c (12.1.1)

标签: jsf jsf-2 facelets el


【解决方案1】:

有几种方法。

  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);
    // ...
    

【讨论】:

  • 你的第一个第二个和第四个答案都说row.percentage。其实我没有直接的百分比。正如我在问题中提到的那样,它们需要计算。选项 3 是最简单的,但不幸的是我无法控制数据模型。
  • 只需将其替换为需要用作计算基础的值即可。你的问题没有清楚地说明具体的功能要求,所以我只需要“存根”一些东西来使解决方案从根本上变得清晰。
  • 您所说的“webapp 提供的 web.xml 也兼容 Servlet 3.0”是什么意思?
  • 单击第 2 点的链接。所以.. 只是一个与 Servlet 3.0 兼容的根声明(带有version="3.0" 等),而不是例如带有 DTD 的 Servlet 2.5 或 2.4 甚至 2.3。
  • 我不确定如何在不知道最大值的情况下计算我的 color() 方法所需的百分比。有什么想法吗?
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2011-06-28
  • 2012-01-09
  • 2013-09-29
相关资源
最近更新 更多