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

时间:2016-02-27 10:25:48

标签: 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>
        <h:outputText value="#{bean.expr}" />
    </p:column>
</p:dataTable>

2 个答案:

答案 0 :(得分:3)

在getter中使用JSF Application#evaluateExpressionGet()以编程方式评估当前上下文中的EL表达式。在这种特殊情况下,这只是可疑的,因为您在控制器/模型中基本上是紧耦合视图逻辑。

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方式更清晰。

另见:

答案 1 :(得分:2)

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

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

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

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