2014-02-20 39 views
1

評估財產我有一個變量${path}含有字符串「ABC」我想,以評估這個作爲一個對象$ {對象}的屬性:的Java EL上豆

,如果我嘗試${object[path]}它扔了「找不到屬性」

我會寫爲:

${object.a.b.c} 

我可以分裂的 「」並做一個for循環object = object [split [i]]

但是我發現它很醜陋。

我想是這樣的:

eval("object."${path}) 

這可能嗎?

回答

0

您可以創建並使用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)}其中路徑是的表達a.b.c它可以被重寫爲:

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

評價代碼同樣可以成爲服用形式ex:eval(...的功能。

關於使用ELResolver的評論。

  • 你會在ServletContextListener添加ElResolverJspApplicationContext(見上文)。
  • 它會在大多數其他解析器之前被調用 - see order
  • 但現在你在getValue(ELContext, Object, Object)有一些問題。
    • 對於${object[path]}你得到什麼價值路徑解析和需要它和其他屬性來區分(bean屬性/映射值的/ etc。)
    • 尋找含有.一個字符串實例可能就足夠了,只要你檢查基地類型不是地圖
    • 您可能需要拆分字符串並使用反射來查找屬性。
    • 我不認爲嵌套評估(解決ValueExpressionELResolver)支持,但我可能是錯誤的。
+0

我的EL的認識提高,我認爲要解決我的問題的最好辦法是寫一個自定義ELResolver和El Resoler陣列中添加它的最後位置。但現在我不知道該怎麼做。 – jpprade