Thymeleaf 中 th:text 和 th:value 之间的区别

1、概览

Thymeleaf 是一种流行的 Java 模板引擎,它允许我们创建动态网页。它提供了多种属性,用于将数据从模型绑定到视图。

在本教程中,我们将了解 Thymeleaf 中 th:textth:value 属性之间的主要区别。

2、th:text 属性

Thymeleaf 中的 th:text 属性用于设置元素的文本内容。

它还取代了标准的 HTML text 属性。因此,我们可以把它放在任何支持文本内容的 HTML 元素中,如标题、段落、标签等。

我们还可以使用该属性来显示动态文本内容,例如网页上的标题。

假设我们想在 HTML 页面上显示 controller 提供的 title 属性。

首先,让我们创建一个 controller 类和一个指定模型属性的方法:

@GetMapping
public String show(Model model) {
    model.addAttribute("title", "Baeldung");
    return "attributes/index";
}

接下来,我们将在标题元素中显示值:

<h1 th:text="${title}"/>

在这里,Thymeleaf 会计算表达式 ${title},并将该值插入标题元素。

我们将得到的 HTML 如下:

<h1>Baeldung</h1>

此外,与标准 HTML text 属性不同,th:text 属性支持表达式。除了变量,这些表达式还可能包括运算符和函数。

例如,让我们在没有提供 title 属性的情况下指定默认值:

<h1 th:text="${title} ?: 'Default title'"/>

3、th:value 属性

另一方面,th:value 属性用于设置通常需要用户输入的元素的值。输入框、复选框、单选按钮和下拉按钮等元素都属于此类。

我们可以在任何有 value 属性的元素中使用该属性来代替标准的 HTML value 属性。因此,在不支持该属性的元素(例如段落)中添加该属性不会有任何效果。

首先,让我们创建一个简单的表单,其中包含一个 email input 字段:

<form th:action="@{/attributes}" method="post">
    <input type="email" th:value="${email}">
    <input type="submit" value="Submit"/>
</form>

接下来,让我们修改 controller 中的方法,并添加 email 属性:

@GetMapping
public String show(Model model) {
    model.addAttribute("title", "Baeldung");
    model.addAttribute("email", "default@example.com");
    return "attributes/index";
}

最后,Thymeleaf 会显示 input 元素内的值:

<input type="email" value="default@example.com">

由于我们在 input 字段中使用 th:value,因此我们更可能希望在表单提交时将值传回 controller。要传递值,我们需要指定 input 字段的 th:name 与 controller 方法中变量的名称一致:

<input th:name="email" type="email" th:value="${email}">

现在,我们可以在 controller 中添加一个 POST 方法来读取用户的输入:

@PostMapping
public String submit(String email) {
    logger.info("Email: {}", email);
    return "attributes/index";
}

该属性也支持表达式:

<input type="email" th:value:"${email} ?: 'default@email.com'"/>

4、总结

在本文中,我们了解了Thymeleaf 中 th:textth:value 属性之间的区别。我们使用 th:text 属性指定元素的文本内容,使用 th:value 属性设置元素的值(value)。


参考:https://www.baeldung.com/java-thymeleaf-text-vs-value