SpringBoot接入Thymeleaf完整指南:语法速查、布局复用与可运行样例
前言
Thymeleaf 是 Spring 官方文档里默认的模板引擎,最大的卖点是原生 HTML 模板:模板文件不经过引擎也能直接用浏览器打开看排版,设计稿改改就能当模板用。FreeMarker 那套见 接入指南 和 语法详解,这篇给 Thymeleaf 同样的一套。
1、引入依赖
|
|
模板默认放 classpath:/templates/,后缀 .html。
2、配置
|
|
mode: HTML 在 Thymeleaf 3 下对未闭合标签容忍度很高,老版本那种要配 legacyhtml5 的做法不用了。
3、第一个页面
Controller(和 FreeMarker 写法一样,SpringMVC 的视图层跟引擎无关):
|
|
模板 templates/user/list.html:
|
|
注意每个 <td> 里的「张三」「20」,那是静态预览用的假数据。Thymeleaf 的 th:* 都是 HTML 属性,这个文件直接双击打开浏览器就能看排版,这是它最舒服的地方。
4、常用语法速查
| 需求 | 写法 |
|---|---|
| 输出文本(转义) | th:text="${user.name}" |
| 输出原文(不转义,慎用) | th:utext="${htmlContent}" |
| 内联表达式 | <p>你好 [[${user.name}]]</p>(转义);[(${...})] 不转义 |
| 循环 | th:each="u, st : ${users}",状态对象 st.index/count/odd/even |
| 判断 | th:if / th:unless / th:switch + th:case |
| 链接 | th:href="@{/users/{id}(id=${u.id})}" → /users/3,自动带 contextPath |
| 对象取值 | th:object="${user}" 之后用 *{name}、*{age} |
| 默认值 | th:text="${user.nick} ?: '匿名'" |
| 日期格式化 | th:text="${#temporals.format(user.birthday, 'yyyy-MM-dd')}" |
| 引入片段 | th:replace="~{common/header :: nav}" |
5、布局复用
common/layout.html:
|
|
页面里引用(replace 是用片段整体替换宿主标签,insert 是插入内容):
|
|
片段还能传参,做「同结构不同数据」的布局。
6、表单绑定和校验展示
|
|
|
|
th:field 一次干了三件事:id、name、value,等价于手写 th:id + th:name + th:value。配合 @Valid + BindingResult 做校验回显是标准套路。
7、内置工具对象
| 对象 | 常用 |
|---|---|
#temporals |
#temporals.format(date,'yyyy-MM-dd')、createNow()(3.1+;旧版用 #dates) |
#strings |
isEmpty()、toUpperCase()、substring()、replace() |
#numbers |
#numbers.formatDecimal(price, 1, 2) |
#lists/#maps |
isEmpty()、size() |
#fields |
表单校验:hasErrors('name')、errors('*') |
8、踩坑记录
- 改模板不生效:
cache: true缓存了,开发期关掉或者上spring-boot-devtools th:text和th:utext别搞混:含 HTML 的富文本用utext,不然标签会显示成转义后的字符串;反过来用户输入千万别utext,XSS 就这么来的- 3.1 起删掉了
#request/#session:模板里直接拿 URL 参数的老写法没了,老老实实在 Controller 里传 - 模板要合法 HTML:HTML 模式容忍度高,但 XML 模式下未闭合标签直接报错
th:field必须在th:object里用:漏了th:object="${userForm}"的话*{name}解析为空- URL 记得用
@{}:手写href="/users"会丢 contextPath
9、和 FreeMarker 怎么选
| 维度 | Thymeleaf | FreeMarker |
|---|---|---|
| 模板形态 | 原生 HTML,设计稿即模板 | 纯文本指令模板,脱离 HTML 没法预览 |
| 学习曲线 | th:* 属性比较直觉 | <#if> 指令 + ?string 这类内建函数,体系更大 |
| 性能 | 3.0 之后接近,略低 | 文本替换引擎,快 |
| 非 HTML 场景(邮件/代码生成) | 弱,TEXT 模式能用但别扭 | 强项,天生纯文本 |
| Spring 生态 | 官方文档默认,示例最多 | 一等支持但示例少 |
| 和设计协作 | 明显占优,前后端可以并行 | 要跑起来才能看效果 |
我的用法:渲染页面用 Thymeleaf,生成邮件、代码片段、配置文件这类纯文本用 FreeMarker,两个共存不冲突。FreeMarker 那边的完整对比也在 接入指南 里有一份。
相关阅读
- 原文作者:Anttu
- 原文链接:https://anTtutu.github.io/post/2024-11-28-springboot-thymeleaf-integration/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。