Maven+Spring环境下JSP中EL与JSTL表达式失效求助
我目前在基于Maven和Spring框架开发项目,遇到了一个头疼的问题:JSP页面里的EL表达式完全不生效,直接把表达式文本原样输出了。比如我写${user.name},页面上就显示${user.name}而不是对应的变量值。
JSP本身是能正常运行的,GET、POST请求的功能都没问题,就是系统完全识别不了EL表达式。后来我尝试引入JSTL,结果连JSTL的标签(比如<c:forEach>)也被当作静态文本直接显示在页面上。我已经试过调整各种Maven依赖组合,但都没解决问题,有没有大佬遇到过类似情况,能给点排查思路或者解决方案?
相关文件信息:
- POM.xml
- 启动类Application.java
- Spring配置文件
可能的排查方向和解决方案
我之前也踩过类似的坑,给你整理几个常见的排查点:
1. 先检查JSP页面的page指令
首先确认JSP顶部的page指令有没有开启EL解析——如果不小心设了isELIgnored="true",EL就会被直接忽略:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
有些旧环境默认这个属性是true,所以手动加上isELIgnored="false"大概率能解决基础问题。
2. 核对Servlet/JSP/JSTL的版本兼容性
Maven依赖版本不匹配是重灾区,尤其是Servlet容器(比如Tomcat)和依赖的版本要对应:
- 比如Tomcat 9+对应Servlet 4.0、JSP 2.3、JSTL 1.2;Tomcat 8对应Servlet 3.1,以此类推
- 别同时引入不同版本的同类型依赖,也注意把容器已提供的API(比如servlet-api、jsp-api)的
scope设为provided,避免打包冲突
给你一个靠谱的依赖配置示例:
<!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- JSP API --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
3. 检查Spring MVC视图解析器的配置
如果是Spring MVC项目,确认视图解析器没禁用EL解析:
在配置类里:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); // 这个属性默认是false,允许EL解析,别改成true resolver.setExposeContextBeansAsAttributes(false); return resolver; } }
XML配置的话对应调整即可。
4. 检查Tomcat的全局配置(本地运行的话)
如果你用本地Tomcat,看看conf/web.xml里的JSP Servlet配置有没有全局禁用EL:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>el-ignored</param-name> <param-value>false</param-value> </init-param> </servlet>
如果el-ignored是true,改成false就行。
5. 确认Model数据真的传进去了
有时候不是EL的问题,是Controller里根本没把数据放到Model里!比如要确保:
@GetMapping("/user") public String getUser(Model model) { User user = new User(); user.setName("Alex"); model.addAttribute("user", user); // 这里的key要和JSP里的${user.name}对应上 return "user"; }
6. JSTL标签库引入要正确
如果用JSTL,页面顶部的标签库URI别写错:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
旧版本的URI可能不带jsp前缀,但JSTL 1.2必须用上面这个。
内容的提问来源于stack exchange,提问作者Alex Salfai

