在JSF页面中从bean计算EL表达式
有没有办法在JSF页面中执行从bean接收到的EL表达式 Bean方法在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>
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方法要干净得多
另见: