[Bài đọc] Annotation @Controllers

2. Spring MVC

Controller là lớp được hiện thực (implemented) từ Interface Controller. Trong phiên bản Spring 2.5 sẽ giới thiệu một cách mới để tạo Controller bằng cách sử dụng các annotation.

Khi xây dựng Controller, sử dụng annotation sẽ mang lại một số lợi thế cho bạn. Đầu tiên là mỗi lớp controller có thể xử lý nhiều action.( Ngược lại với việc mỗi controller hiện thực (implements) từ interface Controller chỉ có thể xử lý một action). Nghĩa là những action có liên quan với nhau có viết vào trong cùng một lớp controller, do vậy sẽ giảm được số lượng lớp trong ứng dụng của bạn.

Thứ hai là với các controller sử dụng annotation thì các request mapping không cần phải chứa trong file cấu hình. Sử dụng loại annotation RequestMapping, một phương thức có thể chú thích để tạo ra một phương thức xử lý request.

Annotation @Controller là loại annotation quan trọng trong thư viện (API) của Spring MVC.

Annotation @Controller

Annotation org.springframework.stereotype.Controller sử dụng để chú thích ở một lớp Java để chỉ cho Spring biết các thể hiện của lớp là các controller. Dưới đây là ví dụ một lớp chú thích bởi @Controller.

@Controller
public class ProductController {

@Autowired
private ProductService productService;

@GetMapping("/products")
public ModelAndView listProducts() {
List<Product> products = productService.findAll();
ModelAndView modelAndView = new ModelAndView("/product/list", "products", products);
return modelAndView;
}
}

Spring sử dụng một cơ chế quét để tìm tất cả các lớp controller trong một ứng dụng.

Để đảm bảo Spring có thể tìm thấy các controller thì bạn cần làm hai điều như sau. Đầu tiên bạn cần khai báo spring-context trong file cấu hình của Spring MVC như dưới:

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

Thứ hai, bạn cần sử dụng annotation @ComponentScan trong lớp cấu hình của bạn.

@ComponentScan("basePackage")

Trong annotation @ComponentScan, thông tin chỉ định cho “base package” sẽ là package chứa các lớp controller của bạn. Ví dụ nếu bạn đặt tất cả các lớp controller trong package com.codegym và trong package con của package này thì bạn cần viết annotation @ComponentScan như sau: 

@ComponentScan("com.codegym")

Sau khi thêm annotation @ComponentScan, lớp cấu hình của bạn sẽ như sau:

@ComponentScan("com.codegym")
public class ApplicationConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware{
private ApplicationContext applicationContext;

// Cấu hình để sử dụng các file nguồn tĩnh (html, image, ..)
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

// Image resource.
registry.addResourceHandler("/images/**") //
.addResourceLocations("/WEB-INF/resources/image/");

// Css resource.
registry.addResourceHandler("/styles/**") //
.addResourceLocations("/WEB-INF/resources/css/");

}
}

Vào cùng một thời điểm, bạn không nên chỉ định “base package” quá rộng ( ví dụ thay chỉ định package com.codegym bằng chỉ định package com ) bởi vì điều này sẽ làm Spring MVC quét các package không liên quan.

Leave a Reply

Your email address will not be published. Required fields are marked *