You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:30:03