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实例的idname并将其注入到模板文件:

<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