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

Spring MVC 5 & Tomcat 9 - JSP无法渲染模型属性技术问询

我来帮你排查这个EL表达式不生效的问题——页面显示${name}而非实际值,大概率是JSTL配置、EL解析开关,或者Spring MVC视图设置出了问题。咱们一步步来核对:

1. 先检查pom.xml的JSTL依赖

Tomcat 9自带了EL相关API,但JSTL标签库需要你手动引入正确的依赖,别用过时的版本:

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

注意:别同时引入jstl-api这类重复依赖,会和Tomcat自带的包冲突。

2. 检查home.jsp的关键声明

JSP里必须做两件事才能让EL和JSTL生效:

  • 顶部声明JSTL核心标签库
  • 确保EL没有被禁用

正确的开头应该是这样:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 打印属性时推荐用<c:out>,比直接写${name}更安全,也能验证JSTL是否生效 -->
<h1>Hello, <c:out value="${name}" /></h1>

重点:isELIgnored="false"不能少,默认在某些旧配置里可能会被设为true,直接导致EL表达式不解析。

3. 核对WebConfig的视图解析器配置

Spring MVC必须指定用JstlView来处理JSP视图,否则EL表达式不会被解析。你的WebConfig里要加上这段:

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/"); // 改成你实际存放JSP的路径
    resolver.setSuffix(".jsp");
    resolver.setViewClass(JstlView.class); // 这行是关键!必须加
    registry.viewResolver(resolver);
}

确保前缀和后缀拼接后能找到你的home.jsp,比如前缀是/WEB-INF/views/,那JSP就得放在WEB-INF/views/home.jsp位置。

4. 检查控制器的模型属性设置

确认控制器方法确实把属性放进了Model里:

@GetMapping("/home")
public String home(Model model) {
    model.addAttribute("name", "你的属性值"); // 这里要正确设置值
    return "home"; // 返回的视图名要和视图解析器的规则匹配
}

别写错属性名,比如你存的是username,却在JSP里用${name},那肯定显示不出来。

5. 验证WebAppInitializer的配置

确保DispatcherServlet正确注册并映射了请求:

public class WebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(WebConfig.class);
        
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/"); // 这个映射要覆盖/home路径
    }
}

如果映射写成/app/*之类的,那/home就不会被Spring MVC处理,自然拿不到模型属性。

最后一个小技巧:清理Tomcat缓存

有时候Tomcat的work目录会缓存旧的JSP内容,导致修改不生效。找到Tomcat安装目录下的work/Catalina/localhost/你的应用名文件夹,删除它,然后重启Tomcat试试。

按照上面的步骤逐一排查,尤其是JSTL依赖、JSP的标签库声明、视图解析器的JstlView设置这几点,基本就能解决问题了。

内容的提问来源于stack exchange,提问作者talha06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:00:21