Thymeleaf简介
前两天学习springboot遇到了thymeleaf,本着不懂就学的原则,网上查资料了解了以下,整理了一些网上的大家整理的资料,做一下记录。
Thymeleaf(读音)是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。
Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。以上内容引用至这位大神的博客
示例模板(摘自官网):
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Good Thymes Virtual Grocery</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" media="all"
href="../../css/gtvg.css" th:href="@{/css/gtvg.css}" />
</head>
<body>
<p th:text="#{home.welcome}">Welcome to our grocery store!</p>
</body>
</html>
Thymeleaf的优势
摘至https://blog.csdn.net/u011244202/article/details/54605165
- Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。(当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。)
- Thymeleaf 开箱即用的特性。(它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果。)
- Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
另外,Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。
SpringBoot引用Thymeleaf
- 引入下面的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- control层代码
package com.banana.sprintbootday1.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/demo2")
public String demo1(Model map) {
map.addAttribute("MyName","Fanco");
return "index";
}
}
- index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"><!--引入thymeleaf-->
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${MyName}">Hello World</h1>
</body>
</html>
直接打开页面的话显示的是helloworld,如果启动项目访问的话,显示MyName的值。
Thymeleaf 的配置
thymeleaf可以在项目的application.properties中进行配置
# 是否开启模板缓存,默认true
spring.thymeleaf.cache=true
# 检查模板位置是否存在
spring.thymeleaf.check-template-location=true
# Content-Type value
spring.thymeleaf.content-type=text/html
# 是否启用MVC-Thymeleaf视图
spring.thymeleaf.enabled=true
# 模板编码
spring.thymeleaf.encoding=UTF-8
# 应该从解析中排除的视图名称列表(用逗号分隔)
spring.thymeleaf.excluded-view-names=
# 要应用于模板的模板模式。另请参见StandardTemplateModeHandlers。
spring.thymeleaf.mode=HTML5
# 在链接网址时预先查看名称的前缀。
spring.thymeleaf.prefix=classpath:/templates/
# 链接网址时附加到视图名称的后缀。
spring.thymeleaf.suffix=.html
# 指定模板的解析顺序,默认为第一个.
spring.thymeleaf.template-resolver-order=
# 指定使用模板的视图名,多个以逗号分隔
spring.thymeleaf.view-names=
Thymeleaf的用法
文本、字面值和国际化文本
文本
文本需要th:text属性来设置。我们可以在文本元素中添加默认值,这样当Thymeleaf引擎处理失败的时候页面会显示默认值。${...}是变量表达式,将括号中的变量替换为其值。
<p th:text="${hello}">你好<p>
字面值
在th:text中我们可以使用各种字面值,下面列举如下。
- 字符串字面值。如果需要连接多个字符串使用+即可。
<span th:text="'字符串字面值需要用单引号包括'">默认值</span>
- 数字字面量。我们可以使用运算符计算数字的值。
<span th:text="2012 + 5">2017</span>
- 布尔值字面量。
<p th:text="true==true"></p>
国际化文本
默认情况下,我们可以在与视图文件相同的目录下编写properties文件,然后使用消息语法#{home.welcome}来引用文件中的字符串。可以有多个属性文件,对应不同的区域,例如home_en.properties代表英文区域,home_es.properties代表西班牙区域。下面是一个示例属性文件。
home.welcome=你好
默认情况下Thymeleaf会在与视图相同的文件下寻找同名的属性文件来加载消息。我们也可以自定义消息解析器,用自己的策略从任何地方加载消息。
内插字符串
内插字符串可以将一个字符串中给定部分替换为实际的字符串,内插字符串使用|包括,在|中只能包括${}表达式,不能包括其他表达式
<span th:text="|你好,${name}!|">
<span th:text="‘你好,+’${name}'+'!'">
算术、比较和逻辑运算
thymeleaf支持常用的算术运算,如果使用除/或者取余%运算符的话,还可以使用div或mod代替。
<p th:text="(17%5)-2"></p>
对于比较和逻辑运算符使用gt(>),ge(>=),le(<=),not(!),eq(==),neq/ne(!=)
<p th:text="1 gt 2"></p>
条件表达式
<p th:text="true?'真':'假'"></p>
无操作标记
<p th:text="_">不进行任何操作</p>
选择表达式(星号语法)
星号表达式和美元表达式的作用都是求变量的值。不过它们之间有一些区别,星号表达式作用于被选择的对象。被选择的对象需要使用th:object指定。下面是Thymeleaf的一个例子。
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
等效于使用${..}。
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>
当存在选择对象的时候,我们可以使用美元表达式${#object}来访问选择对象,也可以同时使用星号表达式和美元表达式。选择表达式的主要作用是在表达式比较长例如${session.users.address.street.fullname}的时候,简化表达式。
选择块
条件选择块
在开发Web程序的时候, 很常见的需求就是根据某个值的真假,显示或隐藏某个HTML元素。这可以使用th:if="${exp}"
实现。需要注意和JSTL中的<c:if>
不同,Thymeleaf会根据条件显示或隐藏包含th:if
的整个标签块,而不仅是它的子标签块。
<div th:if="true">....</div>
需要注意th:if
的表达式不仅支持Java式的纯条件判断,还支持C语言式的真值判断,即当一个变量不为空或者整数不是0的时候,也认为是真值。另外还有一个th:unless
执行和th:if
相反的判断。
多重选择块
如果需要多重选择,可以使用th:switch
。需要注意一旦有一个子条件匹配,Thymeleaf就不会继续检查其他条件了。如果需要提供默认值的话,可以这样写,th:case="*"
。
<div th:switch="${number}">
<p th:case="1'">这是1</p>
<p th:case="2">这是2</p>
<p th:case="*">其他值</p>
</div>
迭代块
有时候我们需要遍历一个数组中的元素。这可以使用th:each
实现。在th:each
中我们要指定迭代元素和被迭代集合。被迭代集合可以是:数组,任何实现了java.util.Iterable
的对象,任何实现了java.util.Enumeration
的对象,任何实现了java.util.Iterator
的对象,任何实现了java.util.Map
的对象。需要注意的是,和JSTL的<c:forEach>
标签不同,Thymeleaf会迭代包含<th:each>
的整个标签块,而不仅仅是它的子标签块。
<tr th:each="user : ${users}">
<td th:text="${user.name}"></td>
<td th:text="${user.age}"></td>
<td th:text="${user.birthday}"></td>
</tr>
Thymeleaf还提供了迭代状态变量来检测当前迭代的状态,只需要在th:each
中声明iterStat
即可。假如没有显式声明状态变量,Thymeleaf也会创建一个状态变量,名称是迭代元素添加后缀Stat
。上面的代码中,Thymeleaf会创建一个名为userStat
的状态变量。
<tr th:each="user,iterStat : ${users}">
<td th:text="${user.name}"></td>
<td th:text="${user.age}"></td>
<td th:text="${user.birthday}"></td>
</tr>
状态变量包含以下属性;
- index属性,以0开始的迭代元素索引。
- count属性,以1开始的迭代元素索引。
- size属性,迭代集合的总元素数。
- iter属性,当前迭代元素。
- even和odd两个布尔值,表明当前index的奇偶。
- first和last两个布尔值,表明当前元素是否是第一个/最后一个。
删除代码段
以下是Thymeleaf的一个例子。我们可以使用th:remove来删除指定的部分,这在原型设计和调试的时候很有用。
<tr th:remove="all">
<td>Mild Cinnamon</td>
<td>1.99</td>
<td>yes</td>
<td>
<span>3</span> comment/s
<a href="comments.html">view</a>
</td>
</tr>
th:remove可接受的值有5个:
- all: 移除标签和所有子元素
- body: 移除所有子元素,保留标签
- tag: 移除标签,保留子元素
- all-but-first: 保留第一个子元素,移除所有其他
- none : 什么也不做。这个值在动态求值的时候会有作用
以下内容来自于https://blog.csdn.net/u011054333/article/details/55260754,我只记录了比较常用的,要知道更多可以去这看,或者看官方文档。
更多详细内容建议参考官方文档https://www.thymeleaf.org/documentation.html