Spring MVC+Thymeleaf集成Java EE8时模型数据显示为null求助
问题解决指南:Spring MVC + Thymeleaf(非Spring Boot)集成问题
一、Model数据在Thymeleaf模板显示为null的解决步骤
1. 验证Spring MVC配置类的正确性
确保配置类启用Spring MVC注解驱动,并正确配置Thymeleaf视图解析器:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.yourpackage.controller") // 替换为你的Controller所在包 public class SpringMvcConfig implements WebMvcConfigurer { @Bean public TemplateResolver templateResolver() { ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(); resolver.setPrefix("/WEB-INF/templates/"); // 模板文件存放路径 resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); return resolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver()); return engine; } @Override public void configureViewResolvers(ViewResolverRegistry registry) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setCharacterEncoding("UTF-8"); registry.viewResolver(resolver); } }
- 重点:必须添加
@EnableWebMvc注解,否则Spring MVC的@Controller等注解不会生效。 - 确认
@ComponentScan的包路径包含你的Controller类。
2. 检查Controller的注解与代码
- 必须使用
@Controller而非@RestController(@RestController会直接返回JSON/文本,不走视图解析流程):
@Controller public class HomeController { @RequestMapping("/") public String index(Model model) { model.addAttribute("currentDate", new Date()); model.addAttribute("message", "Hello Thymeleaf"); model.addAttribute("count", 100); return "index"; // 返回视图名称,对应templates下的index.html } }
- 确认Model中添加的变量名与模板中的表达式完全一致(大小写敏感),比如模板用
${currentDate},Controller里不能写成currentdate。
3. 验证Thymeleaf模板的语法与位置
- 模板文件必须放在配置类中
templateResolver.setPrefix()指定的路径下(如/WEB-INF/templates/index.html)。 - 模板中正确使用变量表达式,且必须添加Thymeleaf命名空间:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Index</title> </head> <body> <p>当前日期:<span th:text="${currentDate}"></span></p> <p>消息:<span th:text="${message}"></span></p> <p>计数:<span th:text="${count}"></span></p> </body> </html>
4. 检查web.xml中的DispatcherServlet配置
确保DispatcherServlet加载正确的Spring配置类,且拦截路径设置为/:
<servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value>com.yourpackage.config.SpringMvcConfig</param-value> <!-- 替换为你的配置类全类名 --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
二、去掉war包名,直接用localhost:8080访问index页面
1. 修改Maven打包配置(生成ROOT.war)
在pom.xml的<build>节点下添加maven-war-plugin配置,将war包名称改为ROOT:
<build> <finalName>ROOT</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <warName>ROOT</warName> </configuration> </plugin> </plugins> </build>
Tomcat默认会将ROOT.war部署为根上下文(即localhost:8080/)。
2. 配置默认访问页面
两种方式任选其一:
- 方法一:web.xml配置欢迎页
<welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>
- 方法二:通过Controller映射根路径(如上面HomeController中的
@RequestMapping("/")方法)
3. IDE部署配置(可选)
如果在IDE中直接部署,需将项目的Context Root设置为/:
- IDEA:Run/Debug Configurations → Tomcat → Deployment → 修改Application context为
/ - Eclipse:Servers视图 → 右键Tomcat → Add and Remove → 选择项目 → Edit → 修改Context root为
/
内容的提问来源于stack exchange,提问作者kyleryan1291
相关产品推荐
相关产品推荐

