1. Giới thiệu

Trong hướng dẫn này, chúng ta sẽ nói về các cách khác nhau để truy cập dữ liệu Spring MVC bằng Thymeleaf.

Chúng tôi sẽ bắt đầu bằng cách tạo một mẫu email bằng Thymeleaf và chúng tôi sẽ nâng cao mẫu đó bằng dữ liệu từ ứng dụng Spring của chúng tôi.

2. Thiết lập dự án

Trước tiên, chúng ta sẽ cần thêm phần phụ thuộc Thymeleaf của mình :

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

Thứ hai, hãy bao gồm trình khởi động web Spring Boot :

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

Sự phụ thuộc này cung cấp cho chúng tôi hỗ trợ REST mà sau này chúng tôi sẽ sử dụng để tạo một số điểm cuối.

Chúng tôi sẽ tạo một số mẫu Thymeleaf để bao gồm các trường hợp ví dụ của chúng tôi và lưu trữ chúng trong resource/mvcdata . Mỗi phần của hướng dẫn sẽ triển khai một mẫu khác nhau:

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

Cuối cùng, chúng ta sẽ cần triển khai một lớp trình điều khiển nơi chúng ta sẽ lưu trữ logic nghiệp vụ của mình:

@Controller
public class EmailController {
    private ServletContext servletContext;

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

Lớp trình điều khiển của chúng tôi không phải lúc nào cũng phụ thuộc vào ngữ cảnh của servlet, nhưng chúng tôi đang thêm nó vào đây để chúng tôi có thể chứng minh một tính năng cụ thể của Thymeleaf sau này.

3. Model Attributes

Các thuộc tính mô hình được sử dụng bên trong các lớp trình điều khiển chuẩn bị dữ liệu để hiển thị bên trong một dạng xem .

Một cách chúng ta có thể thêm các thuộc tính vào mô hình của mình là yêu cầu một phiên bản của Mô hình làm tham số trong phương thức điều khiển.

Hãy chuyển emailData của chúng tôi dưới dạng một thuộc tính:

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

Sau đó, Spring sẽ thêm một phiên bản Model cho chúng tôi khi /email/modelattributes được yêu cầu.

Sau đó, chúng ta có thể tham khảo thuộc tính mô hình emailData của mình trong biểu thức Thymeleaf:

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

Một cách khác chúng ta có thể làm là thông báo cho bộ chứa Spring biết thuộc tính nào được yêu cầu trong chế độ xem của chúng ta bằng cách sử dụng @ModelAttribute :

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

Và sau đó chúng ta có thể biểu diễn dữ liệu theo quan điểm của mình dưới dạng:

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

Để biết thêm ví dụ về dữ liệu Mô hình, vui lòng xem hướng dẫn Model, ModelMap và ModelView trong Spring MVC của chúng tôi .

4. Request Parameters

Một cách khác để truy cập dữ liệu là Request Parameters:

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

Trong khi đó, trong mẫu của chúng tôi, chúng tôi sẽ cần chỉ định tham số nào chứa dữ liệu bằng cách sử dụng từ khóa param :

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

Chúng ta cũng có thể có nhiều tham số yêu cầu có cùng tên:

@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";
}

Sau đó, chúng tôi sẽ có hai tùy chọn để hiển thị dữ liệu.

Đầu tiên, chúng ta có thể sử dụng th:each để duyệt qua từng tham số có cùng tên:

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

Thứ hai, chúng ta có thể sử dụng chỉ mục của mảng tham số của mình:

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

5. Thuộc tính Attributes

Hoặc, chúng ta có thể đặt dữ liệu của mình vào thuộc tính HttpSession :

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

Sau đó, tương tự như các tham số yêu cầu, chúng ta có thể sử dụng từ khóa phiên :

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

6. ServletContext Attributes

Với_ServletContext_ , chúng tôi sẽ không thể sử dụng một biểu thức để truy cập các thuộc tính của emailData .

Để giải quyết vấn đề này, chúng tôi sẽ chuyển từng giá trị dưới dạng một thuộc tính riêng biệt:

@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";
}

Và sau đó, chúng ta có thể truy xuất từng thông qua biến servletContext :

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

7. Beans

Cuối cùng, chúng tôi cũng có thể cung cấp dữ liệu bằng cách sử dụng Beans:

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

Thymeleaf cho phép truy cập bean bằng cú pháp @beanName :

<p th:text="${@emailData.emailSubject}"></p>
  1. Kết luận
    Trong hướng dẫn nhỏ này, chúng ta đã học cách truy cập dữ liệu thông qua Thymeleaf.

Đầu tiên, chúng tôi đã thêm các phụ thuộc thích hợp. Và thứ hai, chúng tôi đã triển khai một số phương thức REST để có thể truyền dữ liệu vào mẫu của mình.

Như mọi khi, mã có sẵn trên GitHub .

Cám ơn bạn đã theo dõi!!!