【问题标题】:Resolve EL expressions programmatically on Seam managed beans在 Seam 托管 bean 上以编程方式解析 EL 表达式
【发布时间】:2011-10-20 09:12:03
【问题描述】:

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

【问题讨论】:

  • 你试过#{usr.username}吗?
  • 对不起 'name' 不是 'username' :D
  • 也许你不应该在这里删除ELException。尝试记录该异常,也许这会给您一些提示。
  • 我按照你的建议记录了这个异常,但这里没有异常:(

标签: java jsf seam


【解决方案1】:

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}");
     }

     ...

}

【讨论】:

    【解决方案2】:

    Seam 提供了一个 Expressions 对象。我目前正在使用这个,它运作良好。将您的对象放入事件上下文并调用:

    Expressions.instance().createValueExpression(string).getValue()

    更新:该类称为表达式

    【讨论】:

    • 嗨。您确定您正在访问一个现有的变量吗?如果你得到一个空的结果,这通常意味着某些东西正在解析为空。尝试类似 createValueExpression("#{'hello'}").getValue() 之类的简单方法 由于 hello 在此表达式中定义为字符串(带有单引号),因此必须返回 hello。我使用这种方法从模板创建电子邮件,我可以使用创建时可用的任何东西。工厂。成分。打开包装。任何上下文中的变量。
    • 我尝试用同一个用户注销并再次登录,我得到了这个值,但是当我用其他用户再次登录时,我得到了前一个用户的信息。 :( :(
    • 我还将 bean 打印到日志文件中,第一次它什么也不显示。我第二次登录,它显示了该 bean 的详细信息。 :( :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2011-10-08
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多