Thymeleaf的优点
- Java模板引擎,能够处理HTML、XML、JavaScript、CSS甚至是纯文本,类似于JSP、Freemarker
- 自然模板,原型即页面
- 语法优雅易懂,可以使用OGNL、SpringEL
- 遵从WEB标准,支持HTML5
标准方言
<span th:text="...">:需要引入Thymeleaf的命名空间<span data-th-text="...">:HTML5的标准,可以省略引入命名空间
内容
标准表达式
变量表达式
语法:${...}
例子:<span th:text="${对象.属性.属性}">
消息表达式
语法:#{...}
例子:<th th:text="#{header.address.city}">...</th>
也叫做文本外部化、国际化或者i18n
选择表达式
语法:*{...}
与变量表达式的区别:它们是在
当前选择的对象而不是整个上下文变量映射上执行相对变量表达式有一定优化作用
链接表达式
语法:@{...}
表达式路径可以是:
- 相对路径:
<a th:href="@{../documents/report}">...</a> - WEB应用路径:
<a th:href="@{/documents/report}">...</a> - 服务器相对路径:
<a th:href="@{~/documents/report}">...</a> - 协议相对:
<a th:href="@{//static.ydblog.com/documents/report}">...</a> - 绝对路径:
<a th:href="@{https://www.ydblog.com/documents/report}">...</a>
分段表达式
语法:th:insert或者th:replace
声明片段:
<div th:fragment="copy">...</div>
使用:<div th:insert="~{模板名:片段名}">...</div>
字面量(文字)
例子:
<span th:text="'application'">...</span><span th:text="1024">...</span><span th:if="xxx==false">...</span><span th:if="xxx==null">...</span>+,-,*,/,%<,>,<=,>=或者gt,lt,ge,le(解决标签冲突)==,!=或者eq,nexxx?true:false三目运算符_无操作,例子:<span th:text="${user.isNull()}?'存在':_">如果不存在,取原文本</span>
还有一个
th:utext:th:utext会解析Html,而th:text不会解析
设置属性值
设置任意属性值
例子:
<form th:attr="action=@{/project}">...</form><input type="submit" value="submit" th:attr="value=#{submit.value}"/>
相较于指定的属性值,这种方法可以自定义属性
设置指定的属性值
例子:
<form th:action="@{/project}">...</form><input type="submit" value="submit" th:value="#{submit.value}"/>
常见:th:href,th:value,…
支持的指定属性可以查看官方文档
固定值布尔属性
例子:
Html:<select>...<option selected="selected">...</option>...</select>
Thymeleaf:<select>...<option th:selected="${option.isSelected}">...</option>...</select>
常见:th:selected,th:readonly,th:required,th:disabled,…
迭代器
基本:th:each
例子:<li th:each="book : ${books}" th:text="${book.title}">...</li>
状态变量:
index从0开始count从1开始size迭代器元素总数current当前元素even/odd奇数/偶数first是否为第一个last…
条件语句
th:if、th:unless
th:switch和th:case
模板布局
定义片段:th:fragment
引用片段:
th:insert:保留自己的主标签,保留fragment的主标签th:replace:不要自己的主标签,使用fragment的主标签th:include:保留自己的主标签,不要fragment的主标签,3.0版本之后不推荐使用
th:insert="~{模板名:片段名}"也可以简写成:th:insert="模板名:片段名"也可以使用ID选择器来:
引用片段:
th:insert="~{模板名:#选择器名}"
属性优先级
看看官方文档:

注释
标准的Html/XML注释
1 | <!-- info --> |
Thymeleaf解析器级注释块
<!--/*和*/-->之间的内容
1 | <!--/*--> |
原型注释块
<!--/*/和/*/-->之间的内容
1 | <!--/*/ |
内联
内联表达式
语法:
[[...]]对应th:text[(...)]对应th:utext
禁用内联
语法:th:inline="none"
例子:<p th:inline="none">这是一个二维数组:[[1,2,3],[4,5,6]]</p>
JavaScript内联
例子:
1 | <script th:inline="javascript"> |
结果
1 | <script> |
css内联
1 | <style th:inline="css"> |
1 | <style> |
表达式的基本对象
基本对象
#ctx上下文对象,是org.thymeleaf.context.IContext或者org.thymeleaf.context.IWebContext的实现#locale直接访问与java.util.Locale的关联对象request检索请求session检索session属性application用于检索application/servlet上下文属性
Web上下文对象
#request对应javax.servlet.http.HttpServletRequest对象#session对应javax.servlet.http.HttpSession对象#servletContext对应javax.servlet.ServletContext对象
工具对象(常用)
Datas
1 | ${#datas.format(date,"dd/MMM/yyyy HH:mm:ss")} |
Strings
1 | ${#strings.isEmpty(name)} |
集合
1 | ${#arrays.toArray(object)} |