Servlet参数传入JSP时EL表达式${}失效问题排查
问题分析与解决方案
看起来你遇到了EL表达式直接显示字面量、无法获取参数值的问题,我们一步步来排查和解决:
1. 核心问题:Web应用版本导致EL默认禁用
你的web.xml使用的是Servlet 2.3的DTD:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
Servlet 2.3对应的是JSP 1.2版本,而EL表达式是JSP 2.0(对应Servlet 2.4及以上)才引入的特性。在Servlet 2.3的环境下,EL表达式默认会被忽略,直接作为文本输出。
解决方法:升级web.xml到符合依赖的版本
你pom.xml里依赖的是Servlet 3.1.0,所以建议把web.xml升级到Servlet 3.1规范,新版本默认启用EL:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.zurciu.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/logmein</url-pattern> </servlet-mapping> </web-app>
如果暂时无法升级web.xml,也可以在welcome.jsp的page指令里强制开启EL:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
2. 细节问题:Password参数未存入作用域
你的LoginServlet中只把name存入了session,但password没有存入任何作用域,所以即使EL生效,${password}也无法获取到值。同时还有一个隐藏bug:doPost里调用了doGet,而doGet中执行了response.getWriter().append(),这会提前提交响应,导致后续的forward操作可能抛出IllegalStateException。
解决方法:修正LoginServlet的doPost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 移除doGet调用,避免响应提前提交 String name = request.getParameter("name"); String password = request.getParameter("password"); String url = "/welcome.jsp"; HttpSession session = request.getSession(); session.setAttribute("name", name); session.setAttribute("password", password); // 新增:把password存入session getServletContext().getRequestDispatcher(url).forward(request, response); }
3. 快速验证技巧
可以在welcome.jsp里加一个简单的EL表达式测试,比如${1+1}:
Welcome user! ${name} ${password} <br> EL测试:${1+1}
如果页面显示2,说明EL已经生效,问题就出在参数未存入作用域;如果还是显示${1+1},那就是EL未启用的问题。
内容的提问来源于stack exchange,提问作者Dominika
相关产品推荐
相关产品推荐

