Thymeleaf 是一种 Java XML / XHTML / HTML5 模板引擎,可以在 Web 和非 Web 环境中使用。它更适合在基于 MVC 的 Web 应用程序的视图层提供 XHTML / HTML5,但即使在脱机环境中,它也可以处理任何 XML 文件。它提供了完整的 Spring Framework 集成。
开发环境#
引入依赖#
主要增加 spring-boot-starter-thymeleaf 依赖:
spring-boot-starter-thymeleaf:自动装配 Thymeleaf 模板引擎
配置 Thymeleaf#
application.yml
从 org.thymeleaf.templatemode.TemplateMode 中可见 Thymeleaf 从 3.0.0 版本开始使用 HTML 替代 HTML5、LEGACYHTML5、XHTML、VALIDXHTML。如果还在使用 3.0.0 以前的版本,想要使用非严格的 HTML,需要做以下配置:
- 在
pom.xml中引入nekohtml依赖 - 在
application.yml中配置spring.thymeleaf.mode=LEGACYHTML5
更多属性配置请参考「Appendix A. Common application properties」中 # THYMELEAF (ThymeleafAutoConfiguration) 模块的属性介绍。(TIPS:使用 CTRL + F 进行快速定位)
创建测试 Controller#
创建一个 Controller,为 message 属性赋值并设置跳转,代码如下:
IndexController.java
创建测试 HTML 页面#
在 templates 目录下创建 index.html 文件,并在 html 标签中声明 Thymeleaf 命名空间 xmlns:th="http://www.thymeleaf.org",代码如下:
index.html
其中关键的代码是:
xmlns="http://www.thymeleaf.org"
主要是让 IDE 识别 Thymeleaf 命名空间,这样在标签里输入 th: 后,IDE 会提示相应的语法,方便开发!不加入这句代码也不会影响 Thymeleaf 模板引擎的渲染,以及页面的正常显示。
测试访问#
启动成功后,访问 http://127.0.0.1:8080,即可看到效果:
访问结果:Hello Thymeleaf!
Thymeleaf 常用语法#
- JAVA 源码路径:TagsController.java
- HTML 源码路径:
templates目录
获取变量值#
可以看出获取变量值用 $ 符号,对于 JavaBean 的话使用 变量名.属性名 方式获取,这点和 EL 表达式一样。
另外 $ 表达式只能写在 th 标签内部,不然不会生效,上面例子就是使用 th:text 标签的值替换 <p>...</p> 标签里面的值,至于 p 里面的原有的值只是为了给前端开发时做展示用的。这样的话很好的做到了前后端分离。
内容信息输出:th:text 与 th:utext#
th:text:以纯文本的方式输出th:utext:以 HTML 标签的方式输出,浏览器能正常渲染
HTML 代码:
JAVA 代码:
引用 URL#
对于 URL 的处理是通过语法 @{…} 来处理的:
HTML 代码:
JAVA 代码:
类似的标签有:th:href 和 th:src
字符串替换#
很多时候可能我们只需要对一大段文字中的某一处地方进行替换,可以通过字符串拼接操作完成:
可以用另一种更简洁的方式:
文字替换本身可以和与其他表达式联合使用:
当然这种形式限制比较多,|…| 中只能包含变量表达式 ${…},不能包含其他常量、条件表达式等。
HTML 代码:
JAVA 代码:
运算符#
在表达式中可以使用各类算术运算符,例如 +, -, *, /, %:
逻辑运算符 >, <, <=, >=, ==, != 都可以使用,唯一需要注意的是使用 <, > 时需要用它的 HTML 转义符:
HTML 代码:
JAVA 代码:
条件判断#
th:if, th:unless#
使用 th:if 和 th:unless 属性进行条件判断,下面的例子中,标签只有在 th:if 中条件成立时才显示:
th:unless 于 th:if 恰好相反,只有表达式中的条件不成立,才会显示其内容。
th:switch, th:case#
支持多路选择 Switch 结构:
默认属性 default 可以用 * 表示:
消息表达式:
#{...},也称为文本外部化、国际化或 i18n
HTML 代码:
JAVA 代码:
循环#
渲染列表数据是一种非常常见的场景,例如现在有 n 条记录需要渲染成一个表格,该数据集合必须是可以遍历的,使用 th:each 标签:
HTML 代码:
可以看到,需要在被循环渲染的元素(这里是)中加入 th:each 标签,其中 th:each="prod : ${prods}" 意味着对集合变量 prods 进行遍历,循环变量是 prod 在循环体中可以通过表达式访问。
JAVA 代码:
更多标签用法请参考「Thymeleaf 常用语法」、「Thymeleaf 参考手册」解锁更多技巧 😜