Srping Controller

Giới thiệu

Về mặt code, Controller chỉ đơn thuần là một bean được đánh dấu với @Controller hoặc @RestController.

Trong Spring Boot, có hai dạng Controller, tương ứng hai annotation trên:

@Controller có thể trả về View qua một String hoặc JSON data trong response body (nếu được chỉ định). Thích hợp cho các controller có routing, chuyển trang các kiểu.
@RestController chỉ có thể trả về data trong response body. Thích hợp cho các controller để cung cấp API.
Do đó, ta có thể nói @RestController = @Controller + @ResponseBody.

@Controller Annotation

Dưới đây là một ví dụ của controller:

HomeController.java

@Controller

public

class

HomeController

{

@GetMapping

(

"/home"

)

public

String

home

(

Model

model

)

{

model

.

addAttribute

(

"name"

,

"John"

)

;

return

"index"

;

}

@GetMapping

(

"/users"

)

@ResponseBody

public

List

<

User

>

getUserList

(

)

{

return

new

ArrayList

<

>

(

)

;

}

@GetMapping

(

"

/

users

/

{

id

}

)

public

ResponseEntity

<

User

>

getUserById

(

@PathVariable

(

"id"

)

String

userId

)

{

return

ResponseEntity

.

status

(

200

)

.

body

(

new

User

(

)

)

;

}

}

Controller Mapping

1. Các loại HTTP request

Bạn nào học về web hẳn đã rõ về khái niệm HTTP request. Mình sẽ không nói sâu về phần này, nhưng tạm hiểu mỗi HTTP request sẽ gồm 2 thông tin quan trọng:

  • Request tới URL nào (request tới đâu)
  • HTTP method là gì (thể hiện hành động gì đấy với URL)

Trong controller, chỉ cần nắm được hai thông tin trên thì sẽ bắt được mọi request được gửi tới, sau đó mới xử lý tiếp.

Trong Rest API design, thì người ta thường dùng danh từ trong URL để chỉ đối tượng được tác động. Còn các HTTP method để đại diện cho hành động nào sẽ áp dụng lên đối tượng đó.

Ví dụ như:

  • Request tới GET /users có đối tượng tác động là users (tất cả user), và hành động là GET (lấy thông tin)
  • Request tới PUT /users/123 có đối tượng là users/123 (user có mã là 123) và hành động là PUT (cập nhật thông tin)

Thường thì theo khuyến nghị người ta sử dụng đúng HTTP method với các hành động CRUD tương ứng:

  • Create: dùng POST method
  • Read: dùng GET method
  • Update: dùng PUT method
  • Delete: dùng DELETE method

2.Bắt các request

Spring Boot dùng các annotation sau, đánh dấu lên từng method của controller, để chỉ định rằng khi HTTP method tương ứng gọi tới thì method sẽ được thực thi.

@RestController

public

class

UserController

{

@GetMapping

(

"/users"

)

public

ResponseEntity

<

?

>

getAllUsers

(

)

{

}

@DeleteMapping

(

"/users/{id}"

)

public

void

deleteUser

(

@PathVariable

(

"id"

)

int

id

)

{

}

}

Ví dụ trên có 2 method, bắt tương ứng hai request là GET /users và DELETE /users/{id}. Khi có request tương ứng gửi tới, thì hai method trên sẽ thực thi và trả về kết quả cho client.

Các annotation phổ biến như @GetMapping, @PostMapping, @PutMapping,… có dạng là tên HTTP method cộng với từ “mapping”. Ngoài ra còn có thể dùng @RequestMapping và chỉ định thuộc tính method như sau.

@RequestMapping

(

value

=

"/users"

,

method

=

RequestMethod

.

GET

)

Ngoài ra, @RequestMapping còn có thể dùng bên trên class controller, để chỉ định endpoint gốc cho toàn bộ method bên trong nó. Ví dụ như sau.

UserController.java

@RestController

@RequestMapping

(

"/users"

)

public

class

UserController

{

@GetMapping

(

"/info"

)

}

Trong bài sau chúng ta sẽ đi sâu hơn về một số Annotaion trong Spring