Spring MVC视图显示${message}而非真实传入消息的问题排查
问题:Spring MVC视图页面直接显示EL表达式${message}而非真实消息
提交表单后,视图页面未渲染Controller传入的message属性值,而是直接显示${message}表达式,以下是排查和解决方法:
核心原因分析
- Servlet版本兼容问题:你的
web.xml使用了Servlet 2.3的DTD规范,该版本默认禁用EL表达式解析,导致JSP无法识别${}语法。 - JSP未显式启用EL:即使Servlet版本支持,部分环境下JSP可能默认忽略EL,需要手动开启。
- 依赖版本不稳定:
pom.xml中使用的servlet-api是3.0-alpha-1版本,属于测试版,存在兼容性问题。
解决方案
1. 升级web.xml到Servlet 3.0+规范
替换原web.xml内容为Servlet 3.1的XML Schema版本,默认启用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>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
2. 在JSP页面显式启用EL
在viewpage.jsp和errorpage.jsp的头部添加page指令,强制开启EL解析:
<%@ page isELIgnored="false" %> <html> <head> <meta charset="UTF-8"> </head> <body> ${message} </body> </html>
3. 更换稳定的servlet-api依赖
修改pom.xml中的servlet-api依赖,使用稳定的3.1.0版本,并设置scope为provided(避免与容器自带的API冲突):
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
相关代码参考
Controller代码
@Controller public class HelloController { @RequestMapping("/hello") public String display(@RequestParam("name") String name, @RequestParam("pass") String pass, Model m) { System.out.println("Inside display "); if (pass.equals("admin")) { System.out.println("Inside IF "); String msg = "Hello " + name; m.addAttribute("message", msg); return "viewpage"; } else { System.out.println("Inside ELSE "); String msg = "Sorry " + name + " Wrong Password"; m.addAttribute("message", msg); return "errorpage"; } } }
index.jsp代码
<html> <body> <form action="hello"> Username : <input type="text" name="name"> Password : <input type="password" name="pass"> <input type="submit" name="submit"> </form> </body> </html>
spring-servlet.xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.deepthi" /> <mvc:annotation-driven/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
内容的提问来源于stack exchange,提问作者Deepthi
相关产品推荐
相关产品推荐

