Thymeleaf是一种现代化的服务器端Java模板引擎,可用于将模板文件转换成HTML、XML、JavaScript、CSS等文本格式。它可以为Java Web开发带来更加友好舒适的编码体验,同时也有很好的可扩展性和高可用性。Thymeleaf 可以轻松集成到Spring Framework 中,为开发人员提供了更加便利的开发体验。相对于其他模板引擎,Thymeleaf 是一款优秀的选择,并且在近年来得到了越来越广泛的使用。
Thymeleaf 的使用可以分为以下几个步骤:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
创建 Thymeleaf 模板:Thymeleaf 模板可以是 HTML、XML 或者其他文本格式。模板中可以使用 Thymeleaf 提供的标签、属性等功能。
集成 Thymeleaf:在 Spring Boot 中,可以在 application.properties
文件中配置 Thymeleaf 就可以使用了。在配置文件中添加以下配置:
# 打开 Thymeleaf 的缓存模式
spring.thymeleaf.cache=true
# 模板文件的根目录
spring.thymeleaf.prefix=classpath:/templates/
# 模板文件的后缀
spring.thymeleaf.suffix=.html
# 模板文件的字符编码
spring.thymeleaf.encoding=UTF-8
@Controller
public class MyController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "world");
return "hello";
}
}
其中,hello
指的是 hello.html
模板文件的名称,这个文件位于 classpath:/templates/
目录下。
hello.html
模板中使用表达式来显示数据:DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hellotitle>
head>
<body>
<h1>Hello, [[${name}]]!h1>
body>
html>
其中,[[${name}]]
使用表达式来访问数据,name
是 hello
方法中所添加的模型数据。最终渲染出的页面为:
Hello, world!
hymeleaf 提供了简洁易用的表达式语言,可以用来访问模型中的数据、迭代集合、控制条件等。
Thymeleaf 的表达式语言可以使用 ${}
和 #{}
两种方式来表示。
${}
表示表达式中的值会被输出到 HTML 中:
Name: ${user.name}
#{}
表示表达式中的值不会输出到 HTML 中,但是可以用于一些特殊的操作:
User Info
在表达式中可以访问对象的属性,也可以执行方法,比如:
User Name
表达式还支持一些运算符和条件语句,比如:
User Age
这个例子中,如果 user.age
大于 18,则输出 “Adult”,否则输出 “Minor”。
表达式还支持使用 null
安全符号 ?
,比如:
User Name
这个例子中,如果 user
对象为 null
,则不会出现空指针异常,输出为空。
总之,Thymeleaf 的表达式语言是一种十分强大和灵活的语言,可以用来访问服务器端数据、控制模板的渲染等各种操作。在使用 Thymeleaf 开发 Web 应用程序时,可以充分利用这种语言,提高开发效率。
thymeleaf 提供了一些标签,比如 th:if
和 th:each
,可以用来控制模板中的显示和隐藏、迭代集合等操作。
Thymeleaf 中的标签主要分为两类:标准标签和扩展标签。标准标签用于基本的页面渲染和数据绑定,而扩展标签提供了一些额外的功能,比如循环和条件判断等。
标准标签
1.1 th:text
:用于将表达式的值插入到模板中,替换原来的文本内容。
User Name
1.2 th:attr
:用于设置 HTML 元素的属性值。
1.3 th:each
:用于循环遍历集合,重复渲染相同的 HTML 块。
1.4 th:if
和 th:unless
:用于条件判断,控制页面渲染。
Admin
Not Admin
1.5 th:href
:用于设置链接的地址。
User Info
扩展标签
2.1 th:switch
和 th:case
:用于多分支判断,类似于 Java 中的 switch 语句。
Admin
User
Other
2.2 th:with
:用于定义变量,可以在后面的表达式中使用。
2.3 th:inline
:将表达式的值嵌入到 HTML 中。
Hello, [[${user.name}]]!
2.4 th:fragment
和 th:include
:用于将模板片段进行重用。
Page Header
总之,Thymeleaf 提供了丰富的标签和功能,可以用来实现各种复杂的页面渲染和数据绑定需求。在开发过程中,熟悉和掌握这些标签和功能是非常有帮助的。
Thymeleaf 中有一些特殊的标记,比如 th:text
和 th:src
,可以将数据或者资源文件填充到 HTML 元素中,实现模板渲染。
下面对 Thymeleaf 可执行的标记进行详细讲解:
th:text:用于设置元素的文本内容,可用于输出动态内容。例如:
<span th:text="${user.name}">Namespan>
上面的代码会将 user
对象的 name
属性的值输出到 元素中。
th:utext:用于设置元素的不转义文本内容,可用于输出 HTML 标签。例如:
<span th:utext="${user.description}">Descriptionspan>
如果 user
对象的 description
属性的值是含有 HTML 标签的字符串,使用 th:text
会将 HTML 标签转义,而使用 th:utext
则不会进行转义,直接输出 HTML 标签。
th:if:用于控制元素的显示与隐藏,类似于 JavaScript 中的 if 语句。例如:
<div th:if="${user.age >= 18}">Adultdiv>
<div th:if="${user.age < 18}">Minordiv>
上面的代码会根据 th:switch、th:case、th:default:用于实现 switch 语句的功能,根据不同的条件展示不同的内容。例如: 上面的代码会根据 th:each:用于实现循环遍历,类似于 Java 中的 foreach 循环。例如: 上面的代码会遍历 th:href、th:src、th:action:用于设置链接地址、图片地址和表单提交地址等,可以动态地生成 URL。例如: 上面的代码会动态地生成链接、图片和表单提交地址。 th:attr:用于设置元素的属性。例如: 上面的代码会设置 th:class、th:id、th:style:用于设置元素的 class、id 和样式等属性。例如: 上面的代码会根据 th:object:用于设置当前表单对象的属性,可以简化表单对象的访问。例如: 上面的代码会将 th:fragment:用于定义页面代码片段,可以在其他页面中进行引用和复用。例如: 上面的代码定义了三个页面片段,可以在其他页面中通过 Thymeleaf 提供了布局功能,可以将一些常用的 HTML 片段抽象成布局,然后在模板中引用。 Thymeleaf 布局使用一般采用模版继承的方式,比较常用的模版继承的方式有两种: 下面就具体讲解一下 Thymeleaf 布局的使用。 首先需要创建一个模板布局,定义网页的公共部分,通常包括头部、尾部和主要内容区域。例如: 上面的代码定义了一个模板布局,包括头部、尾部和主要内容区域,其中主要内容区域使用了 Thymeleaf 的片段标记 接下来定义一个页面模版,继承上面的模板布局,并覆盖主要内容区域 上面的代码定义了一个页面模版,使用了 最后,在控制器中通过 Thymeleaf 引擎渲染页面。例如: 上面的代码使用了 通过上面的步骤,就可以使用 Thymeleaf 实现网页布局的公共部分复用,并且可以自定义覆盖公共部分的内容。 Thymeleaf 支持一些预处理器,比如文本缩减器、XML 命名空间处理器、DTD 处理器等,可以让模板更加简洁易懂。 Thymeleaf 预处理器是用来处理特殊语法的,这些特殊语法不是传统的 HTML 标签,而是以 下面对 Thymeleaf 常用的预处理器进行详细讲解。 Thymeleaf 变量表达式以 上面的代码中, Thymeleaf 选择表达式以 上面的代码中, Thymeleaf URL 表达式以 上面的代码中, Thymeleaf 消息表达式以 上面的代码中, Thymeleaf 片段表达式以 上面的代码中, Thymeleaf 布尔表达式以 上面的代码中, 以上就是 Thymeleaf 常用的预处理器,它们能够极大地简化 HTML 页面的开发工作,提高开发效率。 Thymeleaf 提供了一些实用工具,比如日期格式化、字符串处理、国际化等,可以让模板更加灵活和便捷。 Thymeleaf 提供了一些实用工具,可以帮助开发者更方便地操作数据和生成 HTML 页面。下面对这些工具进行详细讲解。 Thymeleaf 提供了一个 上面的代码中, Thymeleaf 提供了一个 上面的代码中, Thymeleaf 提供了一个 上面的代码中, Thymeleaf 提供了一个 上面的代码中, Thymeleaf 提供了一个 Welcome, " 上面的代码中, 以上就是 Thymeleaf 提供的一些实用工具,它们可以帮助开发者更方便地操作数据和生成 HTML 页面。在实际开发中,可以根据需求选择适合的工具进行使用。 在使用 Thymeleaf 进行开发时,需要注意以下几点: Thymeleaf 仅适用于服务器端(后端)渲染,不支持客户端(前端)渲染。 在使用 Thymeleaf 时,需要引入相应的 Thymeleaf 包和相关依赖,否则会出现找不到相应的类或方法等问题。 Thymeleaf 中的表达式不能跨级访问。例如, Thymeleaf 中的注释需要使用 在使用 Thymeleaf 中的 URL 相关表达式时,需要使用 在使用 Thymeleaf 中的条件表达式时,需要使用 在使用 Thymeleaf 的模板布局时,需要注意使用 总之,在使用 Thymeleaf 进行开发时,需要仔细阅读相关文档和 API,遵循 Thymeleaf 的规范和约定,以免出现不必要的错误。 Thymeleaf 是一种服务器端的 Java 模板引擎,主要用于与 Spring 框架配合使用,生成 HTML、XML、JavaScript、CSS 等动态内容。它的主要使用场景如下: 服务器端渲染:Thymeleaf 适用于服务器端渲染,通过在后端生成 HTML 内容,再传递到前端进行渲染。这种方式可以有效地减少前后端的交互次数,提高网站性能。 Web 开发:Thymeleaf 可以用来生成 Web 页面,包括表单、列表、分页等常见页面元素。它支持 HTML5、CSS3 和 JavaScript 特性,可以很方便地实现常见的界面效果和交互逻辑。 邮件模板:Thymeleaf 支持生成邮件模板,可以用来发送带有格式化样式的邮件,同时也可以支持动态数据的插入。 PDF 生成:Thymeleaf 可以与 Apache FOP 等 PDF 生成工具配合使用,生成 PDF 格式的文件。 因此,如果你正在使用 Spring 框架进行 Web 应用程序开发,并且需要使用 Java 模板引擎来生成前端页面,那么 Thymeleaf 是一个非常好的选择。user
对象的 age
属性的值,只显示符合条件的 <div th:switch="${user.gender}">
<p th:case="'M'">Malep>
<p th:case="'F'">Femalep>
<p th:default>Unknownp>
div>
user
对象的 gender
属性的值,显示相应的 元素。
<ul>
<li th:each="book : ${books}" th:text="${book.title}">Book Titleli>
ul>
books
列表中的每个元素,将每个元素的 title
属性的值输出为一个列表项。<a th:href="@{/user/{id}/profile(id=${user.id})}">Profilea>
<img th:src="@{${user.avatarUrl}}"/>
<form th:action="@{/user/save}" method="post">form>
<button th:attr="data-id=${user.id}">Editbutton>
元素的
data-id
属性为 user
对象的 id
属性的值。<div th:class="${user.gender} == 'M' ? 'male' : 'female'">div>
<form th:id="'form-' + ${user.id}">form>
<p th:style="'color:' + ${user.color} + ';font-size:' + ${user.fontSize} + 'px;'">p>
user
对象的属性设置元素的 class、id 和样式等属性。<form th:object="${user}" method="post">
<input type="text" th:field="*{name}"/>
<input type="text" th:field="*{age}"/>
form>
user
对象作为表单对象,并设置两个文本框分别绑定到 name
和 age
属性。<html>
<head>
<title>Page Titletitle>
head>
<body>
<div th:fragment="header">
<h1>Headerh1>
<p>Descriptionp>
div>
<div th:fragment="content">
...
div>
<div th:fragment="footer">
<p>Footerp>
div>
body>
html>
th:replace
或 th:insert
引用和复用。3.4 Thymeleaf 布局
th:replace
和 th:insert
。
DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="${title}">Page Titletitle>
<link rel="stylesheet" th:href="@{/css/style.css}"/>
head>
<body>
<header>
<h1>Headerh1>
<nav>
<ul>
<li><a th:href="@{/}">Homea>li>
<li><a th:href="@{/about}">Abouta>li>
<li><a th:href="@{/contact}">Contacta>li>
ul>
nav>
header>
<main>
<section th:fragment="content">
<h2>Page Contenth2>
<p>Page Descriptionp>
section>
main>
<footer>
<p th:text="${footer}">Footerp>
footer>
body>
html>
th:fragment
。
th:fragment
的内容。例如:DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:replace="layout :: layout(~{::content}, 'Page Title')">
<head>
<title>Page Titletitle>
head>
<body>
<section th:fragment="content">
<h2>About Ush2>
<p>About Us Descriptionp>
section>
body>
html>
th:replace
标记继承上面的模板布局,同时覆盖了主要内容区域 th:fragment
的内容。
@GetMapping("/about")
public String about(Model model) {
model.addAttribute("title", "About Us");
model.addAttribute("footer", "Copyright");
return "about";
}
Model
对象将数据传递到页面模版中,并返回模版名称 "about"
。Thymeleaf 引擎会根据模版名称 "about"
查找对应的视图文件,渲染出最终的 HTML 页面。3.5 Thymeleaf 预处理器
th:
开头的属性或指令。这些属性或指令会在页面渲染前被 Thymeleaf 引擎解析并执行,最终生成有效的 HTML 代码。
${}
开头,用于在 HTML 标签中输出数据。例如:<p>Welcome, <span th:text="${user.name}">Userspan>!p>
${user.name}
表示输出 user
对象的 name
属性值。
*{}
开头,用于在表单控件中绑定数据。例如:<input type="text" name="username" th:value="*{user.username}"/>
*{user.username}
表示将 user
对象的 username
属性值绑定到表单控件的 value
属性上。
@{}
开头,用于生成动态 URL 地址。例如:<a th:href="@{/user/details(id=${user.id})}">User Detailsa>
@{/user/details(id=${user.id})}
表示生成一个动态 URL 地址,其中 user.id
会被替换为实际的值。
#{}
开头,用于国际化处理。例如:<p th:text="#{welcome.message}">Welcome to our website!p>
#{welcome.message}
表示输出国际化消息资源文件中的 welcome.message
属性值。
~{}
开头,用于引用片段模版。例如:<div th:insert="~{common/fragment :: header}">div>
~{common/fragment :: header}
表示将名为 common/fragment
的片段模版中 header
片段的内容插入到当前位置。
th:if
和 th:unless
开头,用于条件判断。例如:<div th:if="${user.isAdmin}">Admindiv>
<div th:unless="${user.isAdmin}">Normal Userdiv>
th:if
表示条件成立的情况下输出该标签内容,th:unless
表示条件不成立的情况下输出该标签内容。3.6 Thymeleaf 实用工具
VariableExpressionUtils
工具类,可以方便地获取变量表达式的值。例如:Object value = VariableExpressionUtils.evaluate("user.name", model);
model
是包含 user
对象的模型数据,VariableExpressionUtils.evaluate
方法会返回 user.name
表达式的值。
IterationUtils
工具类,可以方便地进行集合遍历和分页。例如:List<User> userList = new ArrayList<>();
/* 添加用户数据 */
int currentPage = 1;
int pageSize = 10;
List<User> pageList = IterationUtils.subList(userList, currentPage, pageSize);
IterationUtils.subList
方法可以将集合按指定的分页参数进行切分,返回指定页码的数据列表。
LinkExpressionUtil
工具类,可以方便地生成 URL 地址。例如:String url = LinkExpressionUtil.getLink(context, "/user/details", "id", user.getId(), "name", user.getName());
LinkExpressionUtil.getLink
方法会生成一个带参数的 URL 地址,其中 context
是当前应用的 IContext
实例。
StringUtils
工具类,可以方便地进行字符串操作。例如:String result = StringUtils.substring("hello world", 0, 5);
StringUtils.substring
方法可以截取字符串的一部分,返回结果为 hello
。
SafeString
类,可以方便地处理 HTML 特殊字符和 XSS 攻击。例如:String username = "";
SafeString safeUsername = new SafeString(username);
String html = "
SafeString
类可以将字符串中的 HTML 特殊字符进行转义,防止 XSS 攻击。4. 注意事项
这种方式是不支持的,需要分别使用
user
和 address
表达式来获取数据。 的方式进行注释,不能使用
// 或 /* */
的方式。@{}
符号来包围 URL。例如, 这种方式可以生成带参数的 URL 地址。
th:if
或 th:unless
标签来判断逻辑条件,而不能使用普通的 if 或者三目运算符等方式。th:fragment
和 th:insert
标签,以及指定相应的布局文件名称等。详细使用方法可以参考官方文档。5. 使用场景