Spring Web Annotations

Người dịch : Nguyễn Xuân Trường - Học viên lớp Java08
Email liên hệ: truongnx.work@gmail.com
Bài viết gốc: https://www.baeldung.com/spring-mvc-annotations

Bài viết này nằm trong series Spring Annotations
Spring Core Annotations
Spring Web Annotations (bài viết hiện tại)
SpringBoot Annotations

1. Tổng quan

Trong bài viết này, chúng ta sẽ khám phá các annotation của Spring Web từ package org.springframework.web.bind.annotation

2.@RequestMapping

Nói một cách đơn giản, @RequestMapping đánh dấu yêu cầu xử lý các phương thức bên trong các lớp @Controller; nó có thể được cấu hình bằng cách sử dụng:
*đường dẫn hoặc bí danh, têngiá trị của nó: URL mà phương thức được ánh xạ tới

  • phương thức: các phương thức HTTP tương thích
  • tham số: lọc các yêu cầu dựa trên sự hiện diện, vắng mặt hoặc giá trị của các tham số HTTP
  • tiêu đề: lọc các yêu cầu dựa trên sự hiện diện, vắng mặt hoặc giá trị của tiêu đề HTTP
  • comsume: loại phương tiện nào mà phương thức có thể sử dụng trong phần thân yêu cầu HTTP
  • produces: loại phương tiện nào mà phương thức có thể tạo ra trong phần thân phản hồi HTTP
    Dưới đây là một ví dụ nhanh về nó trông như thế nào:
@Controller
class VehicleController {

    @RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
    String home() {
        return "home";
    }
}

Chúng ta có thể cung cấp cài đặt mặc định cho tất cả các phương thức xử lý trong class @Controller nếu chúng ta áp dụng annotation này ở cấp độ class. Ngoại lệ duy nhất là URL mà Spring sẽ không ghi đè với phương thức cài đặt theo bậc nhưng nối hai phần đường dẫn.
Ví dụ: cấu hình sau có tác dụng tương tự như cấu hình ở trên:

@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {

    @RequestMapping("/home")
    String home() {
        return "home";
    }
}

Hơn nữa, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping@PatchMapping là các biến thể khác nhau của @RequestMapping với phương thức HTTP đã được đặt thành GET, POST, PUT, DELETE và PATCH tương ứng.
Chúng có sẵn kể từ phiên bản Spring 4.3.

3.@RequestBody

Hãy chuyển sang @RequestBody - ánh xạ phần thân của yêu cầu HTTP tới một đối tượng:

@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
    // ...
}

Quá trình giải mã hóa là tự động và phụ thuộc vào loại nội dung của yêu cầu.

4.@PathVariable

Tiếp theo, hãy nói về @PathVariable.
Annotation này chỉ ra rằng một đối số phương thức được liên kết với một biến mẫu URI. Chúng ta có thể chỉ định mẫu URI với chú thích @RequestMapping và liên kết đối số phương thức với một trong các phần mẫu bằng @PathVariable.
Chúng ta có thể đạt được điều này với tên hoặc bí danh của nó, giá trị của đối số:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
    // ...
}

Nếu tên của phần trong mẫu khớp với tên của đối số phương thức, chúng ta không phải chỉ định nó trong annotation:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
    // ...
}

Hơn nữa, chúng ta có thể đánh dấu path variable tùy chọn bằng cách đặt đối số bắt buộc thành false:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
    // ...
}

5.@RequestParam

Chúng ta sử dụng @RequestParam để truy cập các tham số yêu cầu HTTP:

@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
    // ...
}

Nó có các tùy chọn cấu hình giống như annotation @PathVariable.
Ngoài các cài đặt đó, với @RequestParam, chúng ta có thể chỉ định một giá trị được đưa vào khi Spring không tìm thấy giá trị nào hoặc trống trong yêu cầu. Để đạt được điều này, chúng ta phải đặt đối số defaultValue.
Việc cung cấp giá trị mặc định được đặt hoàn toàn bắt buộc thành false:

@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
    // ...
}

Bên cạnh các tham số, có những phần yêu cầu HTTP khác mà chúng ta có thể truy cập: cookie và tiêu đề. Chúng ta có thể truy cập chúng bằng các annotation @CookieValue@RequestHeader tương ứng.
Chúng ta có thể định cấu hình chúng theo cách tương tự như @RequestParam.

6.Phản hồi xử lý các Annotation

Tiếp theo, chúng ta sẽ thấy các annotation phổ biến nhất để thao tác các phản hồi HTTP trong Spring MVC.

6.1.@ResponseBody

Nếu chúng ta đánh dấu một phương thức xử lý yêu cầu bằng @ResponseBody, Spring sẽ coi kết quả của phương thức là chính phản hồi.

@ResponseBody
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

Nếu chúng ta chú thích một class @Controller bằng annotation này, tất cả các phương thức xử lý yêu cầu sẽ sử dụng nó.

6.2.@ExceptionHandler

Với annotation này, chúng ta có thể khai báo một phương thức xử lý lỗi tùy chỉnh. Spring gọi phương thức này khi một phương thức xử lý yêu cầu ném bất kỳ ngoại lệ nào được chỉ định.
Ngoại lệ đã bắt có thể được truyền cho phương thức dưới dạng đối số:

@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

6.3.@ResponseStatus

Chúng ta có thể chỉ định trạng thái HTTP mong muốn của phản hồi nếu chúng ta chú thích một phương thức xử lý yêu cầu với annotation này. Chúng ta có thể khai báo mã trạng thái với đối số mã hoặc bí danh của nó, đối số giá trị.
Ngoài ra, chúng ta có thể cung cấp lý do bằng cách sử dụng đối số reason.
Chúng tôi cũng có thể sử dụng nó cùng với @ExceptionHandler:

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

7.Một số Web Annotations khác

Một số annotation không quản lý trực tiếp các yêu cầu hoặc phản hồi HTTP. Trong phần tiếp theo, chúng ta sẽ tìm hiểu về những cái phổ biến nhất.

7.1.@Controller

Chúng ta có thể xác định Spring MVC controller với @Controller.

7.2.@RestController

@RestControllersự kết hợp của @Controller@ResponseBody.
Do đó, các khai báo sau là tương đương:

@Controller
@ResponseBody
class VehicleRestController {
    // ...
}
@RestController
class VehicleRestController {
    // ...
}

7.3.@ModelAttribute

Với annotation này, chúng ta có thể truy cập các phần tử đã có trong mô hình của MVC @Controller, bằng cách cung cấp khóa mô hình:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
    // ...
}

Giống như với @PathVariable@RequestParam, chúng ta không phải chỉ định khóa mô hình nếu đối số có cùng tên:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
    // ...
}

Ngoài ra, @ModelAttribute còn có một công dụng khác: nếu chúng ta chú thích một phương thức với nó, Spring sẽ tự động thêm giá trị trả về của phương thức vào mô hình:

@ModelAttribute("vehicle")
Vehicle getVehicle() {
    // ...
}

Giống như trước đây, chúng ta không phải chỉ định khóa mô hình, Spring sử dụng tên của phương thức theo mặc định:

@ModelAttribute
Vehicle vehicle() {
    // ...
}

Trước khi Spring gọi một phương thức xử lý yêu cầu, nó gọi tất cả các phương thức được chú thích @ModelAttribute trong class.

7.4.@CrossOrigin

@CrossOrigin cho phép giao tiếp miền chéo cho các phương thức xử lý yêu cầu có chú thích:

@CrossOrigin
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

Nếu chúng ta đánh dấu một class với nó, nó sẽ áp dụng cho tất cả các phương thức xử lý yêu cầu trong đó.
Chúng Ta có thể tinh chỉnh hành vi CORS bằng các đối số của annotation này.

8.Tổng kết

Trong bài viết này, chúng ta đã biết cách xử lý các yêu cầu và phản hồi HTTP với Spring MVC.