知識庫 / Spring / Spring MVC RSS 訂閱

Spring MVC 中 Data 和 Thymeleaf 整合

Spring MVC
HongKong
4
01:01 PM · Dec 06 ,2025

1. 簡介

本教程將探討使用 Thymeleaf 訪問 Spring MVC 數據的不同方法。

我們將首先使用 Thymeleaf 創建一個電子郵件模板,並使用我們 Spring 應用程序中的數據對其進行增強。

2. 項目設置

首先,我們需要添加我們的 Thymeleaf 依賴:Thymeleaf 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

第二,讓我們包含 Spring Boot 的 web starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

這個依賴項為我們提供了 REST 支持,我們將使用它來創建一些端點。

我們將創建幾個 Thymeleaf 模板來覆蓋我們的示例用例,並將它們存儲在 resources/mvcdata 中。教程的每個部分都將實現一個不同的模板:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <!-- data -->
</html>

最後,我們需要實現一個控制器類,其中存儲我們的業務邏輯:

@Controller
public class EmailController {
    private ServletContext servletContext;

    public EmailController(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
}

我們的控制器類不一定依賴於servlet上下文,但我們在這裏添加它,以便稍後演示一個特定的Thymeleaf特性。

3. 模型屬性

模型屬性用於在控制器類中,為視圖渲染準備數據。

一種方法是要求控制器方法作為參數接收 Model 實例。

例如,我們可以將 emailData 作為屬性傳遞:

@GetMapping(value = "/email/modelattributes")
public String emailModel(Model model) {
    model.addAttribute("emailData", emailData);
    return "mvcdata/email-model-attributes";
}

Spring 將在請求 email/modelattributes 時注入一個 Model 實例供我們使用。

然後,我們可以使用 Thymeleaf 表達式引用我們的 emailData 模型屬性。

<p th:text="${emailData.emailSubject}">Subject</p>

另一種實現方式是告訴我們的 Spring 容器在視圖中需要哪些屬性,通過使用 @ModelAttribute

@ModelAttribute("emailModelAttribute")
EmailData emailModelAttribute() {
    return emailData;
}

然後,我們可以將數據表示為以下內容:

<p th:each="emailAddress : ${emailModelAttribute.getEmailAddresses()}">
    <span th:text="${emailAddress}"></span>
</p>

對於更多關於模型數據的示例,請查看我們的 Spring MVC 教程中的 Model、ModelMap 和 ModelView。

4. 請求參數

通過請求參數訪問數據的一種方式是:

@GetMapping(value = "/email/requestparameters")
public String emailRequestParameters(
    @RequestParam(value = "emailsubject") String emailSubject) {
    return "mvcdata/email-request-parameters";
}

同時,在我們的模板中,我們需要通過使用關鍵詞 param 來指定 包含數據的參數

<p th:text="${param.emailsubject}"></p>

我們還可以有具有相同名稱的多個請求參數:

@GetMapping(value = "/email/requestparameters")
public String emailRequestParameters(
    @RequestParam(value = "emailsubject") String emailSubject,
    @RequestParam(value = "emailaddress") String emailAddress1,
    @RequestParam(value = "emailaddress") String emailAddress2) {
    return "mvcdata/email-request-parameters";
}

然後,我們將提供兩種選項來顯示數據。

首先,我們可以使用 th:each 遍歷具有相同名稱的每個參數:

<p th:each="emailaddress : ${param.emailaddress}">
    <span th:text="${emailaddress}"></span>
</p>

其次,我們可以使用參數數組的索引:

<p th:text="${param.emailaddress[0]}"></p>
<p th:text="${param.emailaddress[1]}"></p>

5. 會話屬性

或者,我們可以將我們的數據放在 HttpSession 屬性中:

@GetMapping("/email/sessionattributes")
public String emailSessionAttributes(HttpSession httpSession) {
    httpSession.setAttribute("emaildata", emailData);
    return "mvcdata/email-session-attributes";
}

然後,類似於請求參數,我們也可以使用 session 關鍵字:

<p th:text="${session.emaildata.emailSubject}"></p>

由於 Thymeleaf 3.1 以來,為了安全原因,session 對象等已被棄用。
建議的方法是在控制器級別,將模板需要的特定信息添加到模型中,如在 這裏 所示。

6. <em>ServletContext</em> 屬性

使用 <em>ServletContext</em>,我們無法使用表達式來訪問 <em>emailData</em> 的屬性。

為了解決這個問題,我們將每個值作為單獨的屬性傳遞:

@GetMapping("/email/servletcontext")
public String emailServletContext() {
    servletContext.setAttribute("emailsubject", emailData.getEmailSubject());
    servletContext.setAttribute("emailcontent", emailData.getEmailBody());
    servletContext.setAttribute("emailaddress", emailData.getEmailAddress1());
    servletContext.setAttribute("emaillocale", emailData.getEmailLocale());
    return "mvcdata/email-servlet-context";
}

然後,我們可以通過servletContext 變量來檢索它們:

<p th:text="${#servletContext.getAttribute('emailsubject')}"></p>

同樣地,自Thymeleaf 3.1 版本起,servletContext 對象等已被棄用,主要是出於安全考慮。

7. Bean 實例

最後,我們還可以使用上下文 Bean 提供數據:

@Bean
public EmailData emailData() {
    return new EmailData();
}

Thymeleaf 允許使用 @beanName 語法訪問 Bean:

<p th:text="${@emailData.emailSubject}"></p>

8. 結論

在本小教程中,我們學習瞭如何通過 Thymeleaf 訪問數據。

首先,我們添加了適當的依賴項。其次,我們實現了一些 REST 方法,將數據傳遞到我們的模板中。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.