1 怎么引入thymeleaf?
1.1 html中引入
<html xmlns:th="http://www.thymeleaf.org">
1.2 Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2 简单表达式
2.1 变量表达式:$ {…}
例:<span th:text = ${user.userName}></span>
2.2 选择变量表达式:* {…}
例:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
</div>
2.3 消息表达式:#{…}
例:<p th:text="#{home.welcome}">欢迎使用模版引擎!</p>
查找和模板文件位于同级目录,且具有和模板文件相同名字的.properties文件。模板/WEB-INF/templates/home.html在渲染时,会根据local设置,使用下面的消息源文件:
/WEB-INF/templates/home_zh_CN.properties for中文
/WEB-INF/templates/home_en.properties for英文
/WEB-INF/templates/home.properties 如果特定的lcoal不可用时使用
2.4 链接⽹址表达式:@ {…}
例:<script th:src="@{/static/layui/layui.js}"></script>
2.5 ⽚段表达式:〜{…}
详见10
3 css和js等引入
<link rel="stylesheet" th:href="@{/static/layui/css/layui.css}">
<script th:src="@{/static/layui/layui.js}"></script>
4 基本表达式对象
当对上下⽂变量计算OGNL表达式时,某些对象可⽤于表达式以获得更⾼
的灵活性。 这些对象将被引⽤(按照OGNL标准),从#符号开始:
#ctx:上下⽂对象。
#vars:上下⽂变量。
#locale:上下⽂区域设置。
#request :(仅在Web Contexts中)HttpServletRequest对象。
#response:(仅在Web上下⽂中)HttpServletResponse对象。
#session :(仅在Web上下⽂中)HttpSession对象。
#servletContext :(仅在Web上下⽂中)ServletContext对象。
例:
<span th:text="${#locale.country}">中国</span>
<span th:text="${#locale.country} == 'CN' ? '中国' : '未知城市'"></span>
<span th:text="${#locale.country == 'CN' ? '中国' : '未知城市'}"></span>
5 ⼯具表达式对象
除了这些基本的对象之外,Thymeleaf将为我们提供⼀组⼯具对象,这些
对象将帮助我们在表达式中执⾏常⻅任务。
#execInfo:有关正在处理的模板的信息。
#messages:⽤于在变量表达式中获取外部化消息的⽅法,与使⽤#{...}语法获得的⽅式相同。
#uris:转义URL / URI部分的⽅法
#conversions:执⾏配置的转换服务(如果有的话)的⽅法。
#dates:java.util.Date对象的⽅法:格式化,组件提取等
#calendars:类似于#dates,但对于java.util.Calendar对象。
#numbers:⽤于格式化数字对象的⽅法。
#strings:String对象的⽅法:contains,startsWith,prepending /
appending等
#objects:⼀般对象的⽅法。
#bools:布尔评估的⽅法。
#arrays:数组的⽅法。
#lists:列表的⽅法。
#sets:集合的⽅法。
#maps:地图⽅法。
#aggregates:在数组或集合上创建聚合的⽅法。
#ids:处理可能重复的id属性的⽅法(例如,作为迭代的结果)
例:<span th:text="${#calendars.format(today,'dd MMMM yyyy')}"></span>
6 取值问题
6.1 对象取值
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
6.2 遍历List
<tr th:each="prod : ${prods}">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
6.3 遍历Map
<th th:each="userhead : ${userhead}" th:text="${userhead.key}"></th>
<th th:each="userhead : ${userhead}" th:text="${userhead.value}"></th>
我们称$ {prods}迭代表达式或被迭代变量。
我们称prod为迭代变量或简单的iter变量。
7 条件判断
7.1 if和unless的简单条件判断
<a href="comments.html" th:href="@{/product/comments(prodId=${prod.id})}"
th:if="${not #lists.isEmpty(prod.comments)}">查看</a>
th:if属性不仅只以布尔值作为判断条件。 它的功能有点超出这⼀
点,它将按照这些规则判定指定的表达式值为true:
如果表达式的值不为null:
如果值为布尔值,则为true。
如果值是数字,并且不为零
如果值是⼀个字符且不为零
如果value是String,⽽不是“false”,“off”或“no”
如果值不是布尔值,数字,字符或字符串。
(如果表达式的值为null,th:if将判定此表达式为false)
此外,th:if还有⼀个反向属性,th:unless,我们可以在前⾯的例⼦中使
⽤,⽽不是在OGNL表达式中使⽤:
<a href="comments.html" th:href="@{/comments(prodId=${prod.id})}"
th:unless="${#lists.isEmpty(prod.comments)}">查看</a>
7.2 switch语句
还有⼀种使⽤Java中等效的switch语句结构有条件地显示内容的⽅法:
th:switch / th:case。
<div th:switch="${user.role}">
<p th:case="'admin'">User is an administrator</p>
<p th:case="#{roles.manager}">User is a manager</p>
</div>
8 局部变量
<div th:with="firstPer=${persons[0],secondPer=${persons[1]}}">
<p>第一个人的名字是
<span th:text="${firstPer.name}">Julius Caesar</span>.</p>第二个人的名字是
<span th:text="${secondPer.name}">Julius Caesar</span>.
</p>
</div>
9 内联表达式
<p>Hello, [[${session.user.name}]]!</p>
10 模版布局
10.1 ⽚段规范语法
⽚段表达式的语法是⾮常简单的。 有三种不同的格式:
“〜{templatename :: selector}” 包含在名称为templatename的模板上应⽤指定的标签选择器匹配的⽚段。 请注意,选择器可以只是⼀个⽚段名称,因此您可以像〜{footer :: copy}中的〜{templatename ::fragmentname}指定⼀些简单的东⻄。
标记选择器语法由底层的AttoParser解析库定义,类似于XPath表达式或CSS选择器。 有关详细信息,请参阅附录C.
“〜{templatename}” 包含名为templatename的整个模板。
请注意,您在th:insert/th:replace标签中使⽤的模板名称必须由Template Engine当前正在使⽤的Template Resolver可解析。
〜{:: selector}“或”〜{this :: selector}“ 包含在同⼀模板中的匹配指定选择器的⽚段
例:footer.html⽂件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div th:fragment="copy">
共创智慧药学新时代
</div>
</body>
</html>
在其他页面引用可以这么做
<body>
...
<div th:insert="~{footer :: copy}"></div>
</body>