我们如何在Seam托管bean上以编程方式解析JSF EL表达式?我尝试了以下方法,但它不起作用:
private String resolveExpression(String expression){
if(expression == null)
{
return null;
}
javax.faces.context.FacesContext facesCtx = FacesContext.getCurrentInstance();
Application app = facesCtx.getApplication();
try
{
// Here we bind a value expression into the item,
// so it can dynamically change its language
ELContext elCtx = facesCtx.getELContext();
ExpressionFactory ef = app.getExpressionFactory();
ValueExpression ve = ef.createValueExpression(elCtx, expression, String.class);
return (String) ve.getValue(elCtx);
}
catch (ELException ex) {
}
return expression;
}
在我的应用程序中,我有一个名为User
的bean,它在Seam的会话范围内,并且这个bean有一个属性name
。 EL表达式为#{usr.name}
,但此表达式在Facelet文件中正常工作时返回空。
答案 0 :(得分:3)
Seam提供了两个用于处理EL表达式的实用程序组件:Expressions
和Interpolator
。
对于您的特定用例,我认为Interpolator
是正确的选择,因为您实际上并不需要有效的ValueExpression
。 Interpolator
解析EL表达式的整个字符串,并将所有字符串转换为其评估值。
请注意Interpolator#interpolate()
也接受参数(请参阅documentation)。
示例:
@Name("bean")
@Scope(ScopeType.SESSION)
class MyBean {
...
public String getValue() {
return value;
}
...
}
@Name("otherBean")
@Scope(ScopeType.EVENT)
class MyBean {
...
public String getInterpolatedValue() {
return Interpolator.instance().interpolate("#{bean.value}");
}
...
}
答案 1 :(得分:1)
Seam提供了一个Expressions对象。我现在正在使用这个,它运作良好。将您的对象放入事件上下文并调用:
Expressions.instance()。createValueExpression(字符串).getValue()
更新:该类称为表达式