在 JSF 页面中评估 bean 的 EL 表达式

Evaluate EL expression from bean in JSF page

有什么方法可以在JSF页面中执行从bean接收到的EL表达式吗?

Bean 方法

public class Bean {

    public String getExpr() {
        return "#{emtpy row.prop ? row.anotherProp : row.prop}";
    }

}

JSF 页面:

<p:dataTable value="#{bean.items}" var="row">
    <p:column>
        <h:outputText value="#{bean.expr}" />
    </p:column>
</p:dataTable>

是有,但你不应该这样做。

如果是渲染就应该在JSF页面上完成,如果是数据处理就应该在服务class中作为java逻辑来完成。

做这种事情(在JSF页面渲染时动态注入逻辑)真的很不好,因为这会让这段代码很难维护。我确信有更好的(更直接、更富有表现力且更容易被其他人理解)的方式来做你需要的事情。

这只是关于创建好的代码的建议,因为你的问题显然是关于做一些应该以非常复杂的方式保持简单的事情。

在 getter 中使用 JSF Application#evaluateExpressionGet() 以编程方式评估当前上下文中的 EL 表达式。在这种特定情况下,这只是可疑的,因为您基本上是 controller/model.

中的紧耦合视图逻辑
public String getExpr() {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().evaluateExpressionGet(context, "#{emtpy row.prop ? row.anotherProp : row.prop}", String.class);
}

或者使用 JSTL <c:set>(没有 scope!)在视图中创建 EL 表达式的别名,以防您真正关心的是 EL 表达式的长度。

<c:set var="expr" value="#{emtpy row.prop ? row.anotherProp : row.prop}" />

<p:dataTable value="#{bean.items}" var="row">
    <p:column>
        <h:outputText value="#{expr}" />
    </p:column>
</p:dataTable>

不用说 JSTL 方式更简洁。

另请参阅:

  • Defining and reusing an EL variable in JSF page
  • JSTL in JSF2 Facelets... makes sense?