1. 概述
Thymeleaf 是Java生态中流行的模板引擎。它帮助将控制器层的数据绑定到视图层。Thymeleaf属性使用表达式设置。在本教程中,我们将讨论各种表达式类型及其示例。
2. 示例设置
我们将使用名为 Dino 的简单Web应用作为示例。这是一个创建恐龙资料的简单Web应用。
首先,我们创建一个模型类来表示我们的恐龙:
public class Dino {
private int id;
private String name;
// constructors
// getter and setter
}
接下来,创建一个控制器类:
@Controller
public class DinoController {
@RequestMapping("/")
public String dinoList(Model model) {
Dino dinos = new Dino(1, "alpha", "red", 50);
model.addAttribute("dinos", dinos);
return "index";
}
}
在我们的示例设置中,我们可以将Dino实例注入到模板文件中。
3. 变量表达式
变量表达式有助于将控制器中的数据注入到模板文件中,它将模型属性暴露给网页视图。
变量表达式的语法结合了美元符号和花括号。我们的变量名称位于花括号内:
${...}
让我们将Dino数据注入到模板文件:
<span th:text="${dinos.id}"></span>
<span th:text="${dinos.name}"></span>
条件表达式和迭代也可以使用变量表达式:
<!-- for iterating -->
<div th:each="dinos : ${dinos}">
<!-- in conditionals -->
<div th:if="${dinos.id == 2}">
4. 选择表达式
*{...}
让我们选择Dino实例的id
和name
并将其注入到模板文件:
<div th:object="${dinos}">
<p th:text="*{id}">
<p th:text="*{name}">
</div>
此外,选择表达式主要用于HTML表单中,它有助于将表单输入与模型属性绑定。
与变量表达式不同,每个输入元素都需要单独处理。以我们的Dino Web应用为例,我们可以创建一个新的Dino实例,并将其绑定到我们的模型属性:
<form action="#" th:action="@{/dino}" th:object="${dinos}" method="post">
<p>Id: <input type="text" th:field="*{id}" /></p>
<p>Name: <input type="text" th:field="*{name}" /></p>
</form>
5. 消息表达式
这个表达式有助于将外部化文本带入我们的模板文件,也称为文本外部化。
外部存储我们文本的位置可以是.properties
文件。当消息表达式带有占位符时,它是动态的。
消息表达式的语法是哈希和花括号的组合。我们的键位于花括号内:
#{...}
例如,假设我们在Dino Web应用的各个页面上都想要显示特定的消息。我们可以在一个messages.properties
文件中放置消息:
welcome.message=welcome to Dino world.
为了将欢迎消息绑定到视图模板,我们可以通过其键引用它:
<h2 th:text="#{welcome.message}"></h2>
我们可以通过在外部文件中添加占位符使消息接受参数:
dino.color=red is my favourite, mine is {0}
在模板文件中,我们可以引用消息并为占位符添加值:
<h2 th:text="#{dino.color('blue')}"></h2>
此外,我们可以通过将变量表达式作为占位符的值使其动态:
<h2 th:text="#{dino.color(${dino.color})}"></h2>
6. 链接表达式
@{...}
URL可以是绝对或相对的。当使用链接表达式与绝对URL一起使用时,它会绑定到以“*http(s)*”开头的完整URL:
<a th:href="@{http://www.baeldung.com}"> Baeldung Home</a>
相对链接则绑定到我们的Web服务器上下文。我们可以轻松地根据控制器定义在模板文件中导航:
@RequestMapping("/create")
public String dinoCreate(Model model) {
model.addAttribute("dinos", new Dino());
return "form";
}
我们可以按@RequestMapping指定的请求页面:
<a th:href="@{/create}">Submit Another Dino</a>
它可以通过路径变量接收参数。假设我们想要提供一个链接来编辑现有的实体。我们可以通过其id
调用我们想要编辑的对象。链接表达式可以接受id
作为参数:
<a th:href="/@{'/edit/' + ${dino.id}}">Edit</a>
链接表达式可以设置协议相关的URL。协议相关的URL类似于绝对URL,URL将使用HTTP或HTTPS协议,取决于服务器的协议:
<a th:href="@{//baeldung.com}">Baeldung</a>
7. 片段表达式
片段表达式可以帮助我们在模板文件之间移动标记。这个表达式使我们能够生成可移动的标记片段。
片段表达式的语法是波浪线和花括号的组合。我们的片段位于花括号内:
~{...}
对于我们的Dino Web应用,我们可以在index.html
文件中创建一个带有fragment
属性的页脚:
<div th:fragment="footer">
<p>Copyright 2022</p>
</div>
现在,我们可以将footer
注入到其他模板文件中:
<div th:replace="~{index :: footer}"></div>
8. 总结
在本文中,我们探讨了Thymeleaf的各种简单表达式及其示例。
如往常一样,示例代码的完整源代码可在GitHub上获取:GitHub。