Thymeleaf 中的表達類型
一、概述
Thymeleaf是 Java 生態系統中流行的模板引擎。它有助於將數據從控制器層綁定到視圖層。 Thymeleaf 屬性使用表達式設置。在本教程中,我們將通過示例討論表達式類型。
2. 示例設置
我們將使用一個簡單的 Web 應用程序 Dino 作為示例。這是一個用於創建恐龍檔案的簡單網絡應用程序。
首先,讓我們為我們的恐龍創建一個模型類:
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.變量表達式
變量表達式有助於將控制器中的數據注入到模板文件中。它將模型屬性暴露給 Web 視圖。
變量表達式語法是美元符號和花括號的組合。我們的變量名位於花括號內:
${...}
讓我們將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網絡應用程序為例,讓我們創建一個新的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 網絡應用程序的整個頁面中顯示特定消息。我們可以將消息放在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>
這種表達也稱為國際化。它可以幫助我們調整我們的 Web 應用程序以適應不同的語言。
6.鏈接表達
鏈接表達式在 URL 構建中是不可或缺的。 此表達式綁定到指定的 URL 。
鏈接表達式語法是“at”符號和花括號的組合。我們的鏈接位於花括號內:
@{...}
URL 可以是絕對的或相對的。當使用帶有絕對 URL 的鏈接表達式時,它會綁定到以“ http(s)
”開頭的完整 URL:
<a th:href="@{http://www.baeldung.com}"> Baeldung Home</a>
另一方面,相對鏈接綁定到我們的網絡服務器的上下文。我們可以輕鬆地瀏覽控制器中定義的模板文件:
@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 將使用 HTTP 或 HTTPS 協議方案,具體取決於服務器的協議:
<a th:href="@{//baeldung.com}">Baeldung</a>
7. 片段表達
片段表達式可以幫助我們在模板文件之間移動標記。該表達式使我們能夠生成可移動的標記片段。
片段表達式語法是波浪號和大括號的組合。我們的片段位於花括號內:
~{...}
對於我們的 Dino 網絡應用程序,讓我們在我們的index.html
文件中創建一個頁腳,其中包含一個fragment
屬性:
<div th:fragment="footer">
<p>Copyright 2022</p>
</div>
我們現在可以將footer
註入到其他模板文件中:
<div th:replace="~{index :: footer}"></div>
八、結論
在本文中,我們查看了各種 Thymeleaf 簡單表達式和示例。
與往常一樣,示例的完整源代碼可在 GitHub 上獲得。