在Seam托管bean上以编程方式解析EL表达式

时间:2011-10-20 09:12:04

标签: java jsf seam

我们如何在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文件中正常工作时返回空。

2 个答案:

答案 0 :(得分:3)

Seam提供了两个用于处理EL表达式的实用程序组件:ExpressionsInterpolator

对于您的特定用例,我认为Interpolator是正确的选择,因为您实际上并不需要有效的ValueExpressionInterpolator解析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()

更新:该类称为表达式