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

Maven+Spring环境下JSP中EL与JSTL表达式失效求助

JSP中EL表达式(及JSTL)在Maven+Spring项目中无法解析,直接显示文本

我目前在基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:37:30