在JSF页面中从bean计算EL表达式

在JSF页面中从bean计算EL表达式,jsf,el,managed-bean,Jsf,El,Managed Bean,有没有办法在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>

有没有办法在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页面上完成;如果是数据处理,则应该在服务类中作为java逻辑完成

做这种事情(在呈现JSF页面时动态注入逻辑)是非常糟糕的,因为这会使代码很难维护。我相信有更好的方式(更直截了当、更富有表现力、更容易让别人理解)来做你需要的事情

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

或者在getter中使用JSF以编程方式在当前上下文中计算EL表达式。在这种特定情况下,这是可疑的,因为您在控制器/模型中基本上是紧密耦合的视图逻辑

public String getExpr() {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().evaluateExpressionGet(context, "#{emtpy row.prop ? row.anotherProp : row.prop}", String.class);
}
或者在视图中使用JSTL(不带
范围
!)在视图中创建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方法要干净得多

另见:

其主要目标是创建动态表(删除表和使用它们的逻辑的副本)。我还考虑用类包装实体,在这个类中保留所有视图特定的逻辑。但我认为在某些情况下,这种坏把戏会奏效。我不清楚你想做什么。请问另一个关于堆栈溢出的问题,关于如何“创建动态表”,发布一些您拥有的真实代码,描述您想要实现的目标。我相信,如果不将动态逻辑注入JSF中,将有很多答案可以正确地实现这一点