Thymeleaf

简单介绍

Thymeleaf是一个模板引擎,采用Java开发。

Thymeleaf对网络环境要求不严格,既能用于Web环境,也能用于非Web环境。在非Web环境(即不开启服务器,只打开该文件)下,可以直接显示模板的静态数据;在Web环境下,可以像JSP一样从后台接受数据,并替换掉模板的静态数据,它是基于HTML的,以HTML为载体,Thymeleaf要寄托在HTML标签下才可以实现。

SpringBoot集成了Thymeleaf技术,SpringBoot官方也推荐使用Thymeleaf来代替JSP技术。但它本身并不属于SpringBoot。

该模板文件可以直接在任何浏览器内正确显示,浏览器会自动忽略不能理解的属性。但是这并不是一个真正有效的HTML5文档,因为HTML5文档没有th:*这些非标准属性的。需要Thymeleaf解析后才会变成一个标准的HTML文档。

Thymeleaf的简单使用

首先要加入Thymeleaf的起步依赖,可以在创建SpringBoot项目时就直接添加该依赖。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

然后创建html文件,并且需要在文件中添加:

1
<html xmlns:th="http://www.thymeleaf.org">

即html文件变成:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

</body>
</html>

并且默认将该模板文件放在resources/templates目录中,将其他静态资源文件如js,css,图片等放在resources/static目录中。

Thymeleaf基础语法

所有有关Thymeleaf的属性开头都是th:**代表任意属性。有些浏览器不支持该写法。也可以使用data-th-*来代替th:*语法。

显示文本

使用th:textth:utext来显示数据。

两者不同是:

th:text属性不解析html元素,传来什么数据就显示什么数据。

th:utext属性将解析HTML元素。如传来的数据是<p>一个段落</p>,那么该属性会识别到

是一个html标签,进行解析。

简单表达式

语法描述作用
${..}变量表达式取出上下文变量的值
*{..}选择变量表达式取出选择的对象的属性值
#{..}消息表达式能够从外部源(.properties文件)获得属性值,一般用于国际化消息
@{..}链接表达式用于表示各种超链接地址
~{..}片段表达式引用一段公共的代码片段

变量表达式

语法:${变量名}

说明:标准变量表达式用于访问容器上下文环境的变量。Thymeleaf使用变量表达式来获取Controller传过来的Model中的数据。

可以是简单变量String,Integer,这时候直接使用变量名即可。

也可以是引用变量,这时候要使用${变量名.属性名}的方式。

${..}的作用域是面向整个上下文。

一个例子:

控制器方法:

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/thymeleaf")
public String getIndex(Model model) {
User user = new User();
user.setId(1);
user.setName("张三");
user.setAddress("河北省石家庄市");
model.addAttribute("data", "测试Thymeleaf成功");
model.addAttribute("user", user);
return "index";
}

html文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Thymeleaf</title>
</head>
<body>
<p th:text="${data}"></p><br>
用户的ID是:<span th:text="${user.id}"></span><br>
用户的姓名是:<span th:text="${user.name}"></span><br>
用户的地址是:<span th:text="${user.address}"></span><br>

</body>
</html>

运行结果:
image-20210123193016754

选择变量表达式

不推荐使用。

语法:*{…}

说明:也叫星号变量表达式。使用th:object属性来绑定对象。

然后使用*来代表这个对象,*后面的{}中的值时此对象的属性。

选择变量表达式*{..}类似于标准变量表达式${..}表示变量的写法。

选择变量表达式是在执行时在选择的对象上求解,而标准变量表达式是在上下文的Model上求解。

这种写法比较繁琐,不推荐使用。

选择变量表达式*{..}的作用域是父标签th:object

例子:

控制器方法不用改,html文件改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Thymeleaf</title>
</head>
<body>
<h2 th:text="*{data}"></h2>
<div th:object="${user}">
用户ID:<span th:text="*{id}"></span>
用户姓名:<span th:text="*{name}"></span>
用户地址:<span th:text="*{getAddress()}"></span>
</div>
</body>
</html>

也可以不使用th:object绑定对象,直接使用*{变量名.属性名},和${}用法一样。

消息表达式

消息表达式#{..}用于国际化文字信息,也就是根据语言改变显示文字,.properteis文件命名规则一般是:

  • basename.properties
  • basename_language.properties
  • basename_language_country.properties

其中:basename是自定义的资源文件名称,language和country是Java支持的语言和国家。如中国中文是messages_zn_CN.properties

basename.properties是缺省加载的资源文件,当客户端根据本地语言查找不到相关资源文件,则使用该配置文件。

资源文件应该放在resources目录中。

SpringBoot加载资源文件的默认名称是messages。并且默认放在resources目录中。如果放在其他目录或者名称不是messages,那么在application.properties中修改spring.messages.basename属性来修改。如放在resources/i18n目录中,basename是message,那么属性应变为spring.messages.basebame=i18n/message

一个例子

创建一个资源文件文件名为messages_zn_CH.properties

1
welcome.message=欢迎你!

在html文件中:

1
<p th:text="#{welcome.message}"></p>

这样就可以调用到属性值。

使用占位符

消息表达式#{..}不允许直接处理静态文本消息,例如调用变量。但是可以在资源文件中使用占位符{}来处理费静态文本消息:

资源文件配置:

1
2
welcome.message={0}, 欢迎你!
encoding={0}

然后在html中以参数形式传递变量:

1
2
<p th:text="#{welcome.message('Jack')}"></p><br>
字符编码是:<span th:text="#{encoding(${#request.getCharacterEncoding()})}"></span>

如果一个属性中有多个占位符,如encoding={0} {1},那么在参数传递时,使用逗号,来分割不同参数。

即:`<span th:text="#{encoding(‘字符编码是:’,$


Thymeleaf
https://zhaoquaner.github.io/2022/05/11/SpringBoot/11-Thymeleaf/
更新于
2022年11月27日
许可协议