SpringMVC5集成Thymeleaf3布局方言模板装饰页面不生效求助
1 核心配置错误:视图解析器冲突
你同时配置了InternalResourceViewResolver和ThymeleafViewResolver,Spring MVC默认会优先使用优先级更高的视图解析器处理请求,你的InternalResourceViewResolver前缀直接指向/WEB-INF/views/,会直接匹配到home.html返回,完全不会走Thymeleaf的渲染逻辑,布局方言自然不会生效。
2 模板解析器路径配置错误
你当前的thymeleafTemplateResolver前缀设置为/WEB-INF/views/layout/,只能解析layout目录下的模板文件,存放在views根目录的业务页面home.html根本无法被Thymeleaf识别加载。
3 布局方言未生效
你在templateEngine配置中注释了LayoutDialect的注册代码,即使后续请求走到Thymeleaf处理逻辑,也无法识别layout:开头的布局属性。
4 依赖版本不兼容
你使用的thymeleaf-layout-dialect 3.0.0需要搭配Thymeleaf 3.1及以上版本使用,你当前Thymeleaf版本为3.0.12,存在版本兼容问题。
修复步骤
步骤1:修改WebConfig配置
@Configuration @ComponentScan(basePackages = {"packages"}) @EnableWebMvc public class WebConfig { // 如果没有JSP需求,直接删除InternalResourceViewResolver的配置即可 /* @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".html"); viewResolver.setExposeContextBeansAsAttributes(true); viewResolver.setOrder(Integer.MAX_VALUE); // 保留的话要设置最低优先级 return viewResolver; } */ @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.addDialect(new LayoutDialect()); // 取消注释,注册布局方言 templateEngine.setTemplateResolver(thymeleafTemplateResolver()); return templateEngine; } @Bean public SpringResourceTemplateResolver thymeleafTemplateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setTemplateMode("HTML5"); templateResolver.setPrefix("/WEB-INF/views/"); // 前缀修改为views根目录,可匹配所有子目录的模板 templateResolver.setSuffix(".html"); templateResolver.setCacheable(false); // 开发阶段关闭缓存方便调试 return templateResolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver() { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine()); viewResolver.setOrder(1); // 设置更高优先级 viewResolver.setCharacterEncoding("UTF-8"); return viewResolver; } }
步骤2:修复home.html配置
取消html标签中layout相关配置的注释,完整代码如下:
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/template}"> <body> <th:block th:fragment="page_content"> <h2>Home page</h2> <p>Hello home page</p> </th:block> </body></html>
th:block是Thymeleaf的原生合法标签,IntelliJ提示无法识别是因为未给当前模块开启Thymeleaf Facet,可在IDEA的项目设置中为模块添加Thymeleaf支持即可消除提示,不影响代码运行。
步骤3:调整依赖版本
修改pom.xml中布局方言的版本为适配Thymeleaf3.0.x的版本:
<dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> <version>2.5.3</version> </dependency>
完成上述修改后重新启动项目即可正常实现布局装饰效果。
内容的提问来源于stack exchange,提问作者Thomas_Mylonas

