Thymeleaf不生效:${name}直接显示在HTML页面中
我之前也碰到过一模一样的问题,折腾了好半天——明明配置了TemplateEngine,结果输出的HTML里${name}、${address}全原封不动,完全没被替换。结合你给出的配置代码片段,咱们一步步来排查:
1. 最可能的原因:TemplateEngine没关联模板解析器(TemplateResolver)
你贴的代码里只初始化了SpringTemplateEngine,但没给它绑定负责读取模板文件、识别模板语法的解析器。这就好比给了厨师锅,但没给他食材,自然做不出菜。
补全你的ThymeleafConfig配置,加上TemplateResolver的Bean,并且把它注入到TemplateEngine里:
@Configuration public class ThymeleafConfig { @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); // 模板文件存放路径,比如放在resources/templates下 resolver.setPrefix("classpath:/templates/"); // 模板文件后缀,比如.html resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); // 开发阶段关闭缓存,修改模板后不用重启服务 resolver.setCacheable(false); return resolver; } @Bean public SpringTemplateEngine springTemplateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); // 关键!把上面的解析器绑定到引擎上 templateEngine.setTemplateResolver(templateResolver()); // 如果用到了特殊方言(比如Spring Security的方言),还要在这里添加 // templateEngine.addDialect(new SpringSecurityDialect()); return templateEngine; } // 如果是通过Controller返回视图名的方式渲染,还要配置视图解析器 @Bean public ThymeleafViewResolver viewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(springTemplateEngine()); resolver.setCharacterEncoding("UTF-8"); return resolver; } }
2. 手动渲染时,有没有把变量传入上下文?
如果你不是通过Controller返回ModelAndView,而是自己调用TemplateEngine.process()来生成HTML,一定要记得把变量放到Context对象里:
// 示例:手动渲染模板的正确姿势 Context thymeleafContext = new Context(); // 把变量放入上下文 thymeleafContext.setVariable("name", "张三"); thymeleafContext.setVariable("address", "北京市朝阳区"); // 传入模板名和上下文,生成渲染后的HTML String renderedHtml = springTemplateEngine().process("your-template-file-name", thymeleafContext);
要是忘了传Context,或者传了空的Context,模板里的变量自然不会被替换。
3. 检查模板文件的语法和命名空间
虽然不影响渲染,但模板文件最好加上Thymeleaf的命名空间,避免IDE报错,同时确保变量表达式是正确的${xxx}格式:
<!DOCTYPE html> <!-- 加上Thymeleaf命名空间 --> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>测试页面</title> </head> <body> <!-- 用th:text来替换内容,而不是直接写${name}在标签里 --> <p>姓名:<span th:text="${name}">默认姓名</span></p> <p>地址:<span th:text="${address}">默认地址</span></p> </body> </html>
注意:不要直接把${name}写在标签内容里(比如<p>${name}</p>),要用Thymeleaf的属性(比如th:text)来绑定变量,否则会被当成普通文本输出。
4. 检查依赖是否完整(Spring Boot项目)
如果是Spring Boot项目,确保你引入的是完整的starter依赖,而不是单独的thymeleaf-core:
<!-- Maven依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
单独的core包缺少Spring整合的相关组件,也会导致变量无法渲染。
先从上面这几点排查,尤其是第一点——绝大多数情况下都是TemplateEngine没绑定解析器导致的问题!
内容的提问来源于stack exchange,提问作者Kaigo

