Spring MVC 5 & Tomcat 9 - JSP无法渲染模型属性技术问询
我来帮你排查这个EL表达式不生效的问题——页面显示${name}而非实际值,大概率是JSTL配置、EL解析开关,或者Spring MVC视图设置出了问题。咱们一步步来核对:
Tomcat 9自带了EL相关API,但JSTL标签库需要你手动引入正确的依赖,别用过时的版本:
<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
注意:别同时引入jstl-api这类重复依赖,会和Tomcat自带的包冲突。
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表达式不解析。
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位置。
确认控制器方法确实把属性放进了Model里:
@GetMapping("/home") public String home(Model model) { model.addAttribute("name", "你的属性值"); // 这里要正确设置值 return "home"; // 返回的视图名要和视图解析器的规则匹配 }
别写错属性名,比如你存的是username,却在JSP里用${name},那肯定显示不出来。
确保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的work目录会缓存旧的JSP内容,导致修改不生效。找到Tomcat安装目录下的work/Catalina/localhost/你的应用名文件夹,删除它,然后重启Tomcat试试。
按照上面的步骤逐一排查,尤其是JSTL依赖、JSP的标签库声明、视图解析器的JstlView设置这几点,基本就能解决问题了。
内容的提问来源于stack exchange,提问作者talha06

