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

Thymeleaf不生效:${name}直接显示在HTML页面中

Thymeleaf变量未渲染?模板输出和原文件一模一样的排查方案

我之前也碰到过一模一样的问题,折腾了好半天——明明配置了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:26:47