您可以創建並使用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的評論。
我的EL的認識提高,我認爲要解決我的問題的最好辦法是寫一個自定義ELResolver和El Resoler陣列中添加它的最後位置。但現在我不知道該怎麼做。 – jpprade