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
,ne
xxx?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)} |