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 方法,將數據傳遞到我們的模板中。