2015-05-15 44 views
0

我想利用JSP表达式语言来评估servlet中的JSP EL表达式。 理想情况下,我想使用与JSP中使用的完全相同的ExpressionFactory和上下文,以便访问常见的JSP EL变量,如$ {param.myParam}或$ {cookie.myCookie}。如何评估servlet中的JSP EL表达式

到目前为止,我想出了以下内容:

package test; 

import java.io.IOException; 
import javax.el.ELContext; 
import javax.el.ExpressionFactory; 
import javax.el.StandardELContext; 
import javax.el.ValueExpression; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.jsp.JspApplicationContext; 
import javax.servlet.jsp.JspFactory; 

@WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"}) 
public class NewServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     response.setContentType("text/plain;charset=UTF-8"); 
     ServletContext svc = getServletContext(); 
     JspFactory jspf = JspFactory.getDefaultFactory(); 
     JspApplicationContext jspContext = jspf.getJspApplicationContext(svc); 
     ExpressionFactory expressionFactory = jspContext.getExpressionFactory(); 
     ELContext context = new StandardELContext(expressionFactory); 
     ValueExpression expression = expressionFactory.createValueExpression(context, "hello ${param.x}", Object.class); 
     response.getWriter().println(expression.getValue(context)); 
    } 

} 

其失败:

ELResolver cannot handle a null base Object with identifier 'param' 

的问题似乎在于找到适当的ELContext。

回答

0

您是否需要将ImplicitObjectELResolver添加到您的上下文中?

StandardELContext context = new StandardELContext(expressionFactory); 
context.addELResolver(new javax.servlet.jsp.el.ImplicitObjectELResolver()); 

UPDATE

添加以下得到它的工作(你可能需要改变某些参数)

context.putContext(JspContext.class, jspf.getPageContext(this /*the current servlet*/, request, response, "/error", false, 8192, false)); 
+0

谢谢,我甚至不知道这样一类的存在。这无疑是正确的轨道上,但是这失败: 显示java.lang.NullPointerException 在javax.servlet.jsp.el.ImplicitObjectELResolver $ ImplicitObjects.getImplicitObjects(ImplicitObjectELResolver.java:612) 一些更神奇似乎​​有需要以便ImplicitObjectELResolver访问隐式对象。 – Remi

+0

我改编了我的答案 –

+0

很好,这个作品,感谢魔术! – Remi