Skip to content

2.4 Làm việc với view controller

Cho đến thời điểm này, bạn đã viết ba controller cho ứng dụng Taco Cloud. Mặc dù mỗi controller phục vụ một mục đích riêng biệt trong chức năng của ứng dụng, nhưng tất cả chúng đều tuân theo mô hình lập trình sau:

  • Tất cả đều được chú thích với @Controller để chỉ ra rằng chúng là các lớp controller và nên được Spring tự động phát hiện thông qua component scanning và khởi tạo như các bean trong Spring application context.
  • Ngoại trừ HomeController, tất cả đều được chú thích với @RequestMapping ở cấp lớp để định nghĩa một mẫu yêu cầu cơ bản mà controller sẽ xử lý.
  • Tất cả đều có một hoặc nhiều phương thức được chú thích với @GetMapping hoặc @PostMapping để chỉ rõ phương thức nào sẽ xử lý loại yêu cầu nào.

Hầu hết các controller bạn viết sẽ tuân theo mẫu này. Nhưng khi một controller đủ đơn giản đến mức không cần khởi tạo model hay xử lý đầu vào — như trường hợp của HomeController — thì có một cách khác để bạn định nghĩa controller. Hãy xem đoạn mã tiếp theo để thấy cách bạn có thể khai báo một view controller — một controller chỉ đơn giản là chuyển tiếp yêu cầu đến một view.

Liệt kê 2.16 Khai báo một view controller

java
package tacos.web;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("home");
  }

}

Điều đáng chú ý nhất về WebConfig là nó triển khai giao diện WebMvcConfigurer. WebMvcConfigurer định nghĩa một số phương thức để cấu hình Spring MVC. Mặc dù nó là một interface, nhưng nó cung cấp các cài đặt mặc định cho tất cả các phương thức, vì vậy bạn chỉ cần override những phương thức mà bạn cần. Trong trường hợp này, bạn override phương thức addViewControllers().

Phương thức addViewControllers() được truyền vào một đối tượng ViewControllerRegistry mà bạn có thể sử dụng để đăng ký một hoặc nhiều view controller. Ở đây, bạn gọi addViewController() trên registry, truyền vào “/” — đây là đường dẫn mà view controller sẽ xử lý các yêu cầu GET. Phương thức đó trả về một đối tượng ViewControllerRegistration, trên đó bạn gọi ngay setViewName() để chỉ định view có tên là home mà yêu cầu đến “/” sẽ được chuyển tiếp đến.

Và chỉ với vài dòng trong một lớp cấu hình, bạn đã có thể thay thế HomeController. Bạn giờ đây có thể xóa HomeController, và ứng dụng vẫn sẽ hoạt động như trước. Thay đổi duy nhất còn lại là bạn cần cập nhật lại HomeControllerTest trong chương 1, loại bỏ tham chiếu đến HomeController khỏi chú thích @WebMvcTest, để lớp test có thể biên dịch mà không gặp lỗi.

Ở đây, bạn đã tạo một lớp cấu hình mới có tên WebConfig để chứa phần khai báo view controller. Nhưng bất kỳ lớp cấu hình nào cũng có thể triển khai WebMvcConfigurer và override phương thức addViewController. Ví dụ, bạn có thể thêm khai báo view controller tương tự vào lớp khởi động TacoCloudApplication như sau:

java
@SpringBootApplication
public class TacoCloudApplication implements WebMvcConfigurer {

  public static void main(String[] args) {
    SpringApplication.run(TacoCloudApplication.class, args);
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("home");
  }

}

Bằng cách mở rộng một lớp cấu hình hiện có, bạn có thể tránh việc tạo thêm một lớp cấu hình mới, giúp giảm số lượng thành phần trong dự án. Tuy nhiên, tôi thích tạo một lớp cấu hình riêng cho từng loại cấu hình (web, dữ liệu, bảo mật, v.v.) để giữ cho lớp cấu hình khởi động của ứng dụng luôn sạch sẽ và đơn giản.

Nói về view controller — và nói rộng hơn là các view mà controller chuyển tiếp yêu cầu đến — cho đến nay bạn đã sử dụng Thymeleaf cho tất cả các view của mình. Tôi rất thích Thymeleaf, nhưng có thể bạn thích một mô hình template khác cho các view của ứng dụng. Hãy cùng xem các tùy chọn view được Spring hỗ trợ.

Released under the MIT License.