问题描述
是否可以执行从JSF页中的bean接收到的EL表达式?
Is there any way to execute EL expression received from bean in JSF page?
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 在getter中以编程方式在当前上下文中评估EL表达式。在这种特定情况下,这只是可恶的,因为您基本上是在控制器/模型中紧密耦合视图逻辑。
Either use JSF Application#evaluateExpressionGet()
in getter to programmatically evaluate an EL expression on the current context. This is in this specific case only fishy as you're basically tight-coupling view logic in the controller/model.
public String getExpr() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{emtpy row.prop ? row.anotherProp : row.prop}", String.class);
}
或使用JSTL (没有 scope
!),以便在视图中创建EL表达式的别名,以防您真正关心的是EL表达式的长度。
Or use JSTL <c:set>
(without scope
!) in view to create an alias of an EL expression in the view in case your actual concern is the length of the EL expression.
<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方法更简洁。
Needless to say that JSTL way is way much cleaner.
- Defining and reusing an EL variable in JSF page
- JSTL in JSF2 Facelets... makes sense?
这篇关于在JSF页面中从bean评估EL表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!