【问题标题】:Java EL evaluate property on beanJava EL 评估 bean 上的属性
【发布时间】:2014-02-20 13:34:56
【问题描述】:

我有一个变量${path},其中包含一个字符串“a.b.c”,我想将其评估为对象 ${object} 的属性:

如果我尝试${object[path]},它会抛出“找不到属性”

我会写成:

${object.a.b.c}

我可以在“。”上拆分。并做一个 for 循环 object = object[split[i]]

但我觉得它很丑。

我想要类似的东西:

eval("object."${path})

这可能吗?

【问题讨论】:

    标签: java jsp el


    【解决方案1】:

    您可以使用 bean 或函数作为中介来创建和评估 ValueExpression:

    package hoteval;
    
    import javax.el.*;
    import javax.enterprise.context.ApplicationScoped;
    import javax.inject.Named;
    import javax.servlet.jsp.*;
    
    @ApplicationScoped
    @Named
    public class Expr {
      public Object eval(PageContext pageContext, String expression) {
        ExpressionFactory factory = JspFactory.getDefaultFactory()
                .getJspApplicationContext(pageContext.getServletContext())
                .getExpressionFactory();
        ELContext elCtxt = pageContext.getELContext();
        ValueExpression ve = factory
                         .createValueExpression(elCtxt, expression, Object.class);
        return ve.getValue(elCtxt);
      }
    }
    

    调用语法如下所示:

    ${expr.eval(pageContext, "${bean.prop}")}
    

    针对 Glassfish 4.0 编写/测试。


    上面的代码只是一个例子。要提供 ${expr.eval(pageContext, object, path)} 形式的表达式,其中 path 是 a.b.c,它可以重写为:

      public Object eval(PageContext pageContext, Object o, String path) {
        expression = "${_tmpRootObject."+expression+"}";
        pageContext.setAttribute("_tmpRootObject", o);
        //etc.
    

    评估代码同样可以成为ex:eval(...形式的函数。

    关于使用 ELResolver 的评论。

    • 您可以在ServletContextListener 中向JspApplicationContext(见上文)添加一个ElResolver。
    • 它将在大多数其他解析器之前被调用 - see order。
    • 但是现在你在getValue(ELContext, Object, Object) 中遇到了一些问题。
      • 对于${object[path]},您会得到path 解析的任何值,并且需要区分它和其他属性(bean 属性/映射值/等)
      • 只要检查基本类型不是Map,查找包含. 的字符串实例可能就足够了。
      • 您可能必须拆分字符串并使用反射来查找属性。
      • 我认为不支持嵌套评估(在 ELResolver 中解析 ValueExpression),但我可能错了。

    【讨论】:

    • 随着我对 EL 知识的提高,我认为解决我的问题的最佳方法是编写一个自定义 ELResolver 并将其添加到 El Resoler 数组的最后位置。但现在我不知道该怎么做。
    猜你喜欢
    • 2013-03-09
    • 2012-10-31
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多