2015-05-15 2 views
0

Я хотел бы использовать язык выражения JSP для оценки выражений JSP EL внутри сервлета. В идеале я хотел бы использовать тот же ExpressionFactory и контекст, который используется в JSP, чтобы получить доступ к обычным переменным ELSP, таким как $ {param.myParam} или $ {cookie.myCookie}.Как оценить выражение 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

Смежные вопросы