Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

  114 Lượt xem

Controller trong Spring Boot

GitGradleJavaSpringBoot

Xin chào mọi người!
Chúng ta sẽ cùng tìm hiểu tất tần tật về Controller trong Spring Boot trong bài viết này.

MVC là gì

Trước khi nói về Controller, tôi sẽ giải thích về MVC trước.
MVC là một trong những framework ứng dụng. Nó lấy chữ cái đầu tiên của Model, View và Controller, và chia toàn bộ xử lý thành ba phần này.

Tiếp theo, chúng ta sẽ giải thích về vai trò của từng phần.

Model

Model đảm nhận vai trò chính trong quá trình xử lý. Nó chịu trách nhiệm cho dữ liệu mà ứng dụng sử dụng và xử lý đối với cơ sở dữ liệu.

View

View đảm nhận vai trò nhập và xuất từ phía khách hàng. Thymeleaf được giải thích từ bài 15 đến bài 17, là một ví dụ về việc View thực hiện các công việc này.

Controller

Controller đảm nhận vai trò giao tiếp giữa hai phần trên. Nó nhận đầu vào từ người dùng thông qua View và sau đó truyền chỉ thị này đến Model. Sau đó, nó chuyển giá trị nhận được từ Model đến View và áp dụng nó vào giao diện.

Như đã nói ở trên, trong MVC, xử lý trong chương trình được phân công và quản lý.

Mối quan hệ giữa Spring Boot và MVC

Dựa trên MVC đã nêu trên, framework Spring MVC đã được tạo ra. Tuy nhiên, Spring MVC gặp khó khăn khi sử dụng do thư viện quá lớn và cấu hình phức tạp. Do đó, Spring Boot đã được tạo ra để giúp việc sử dụng Spring MVC trở nên đơn giản hơn.

Cách viết Controller

Trong Spring Boot, chúng ta sẽ giải thích cách viết Controller.

Lớp Controller

Bằng cách viết chú thích @Controller hoặc @RestController trên một lớp, Spring Boot sẽ nhận diện lớp đó là Controller.

@Controller
public class Controller {
    ...
}
@RestController
public class RestController {
    ...
}

Với @RestController, không chuyển hướng đến View, giá trị trả về từ phương thức trực tiếp trở thành nội dung của phản hồi. Trong khi đó, với @Controller, có thể sử dụng chú thích @ResponseBody để thực hiện cùng một quy trình, nhưng không cần phải viết @ResponseBody. Thông thường, chúng ta sẽ sử dụng @Controller, nhưng với Controller dành cho WebAPI trả về JSON hoặc XML, chúng ta sẽ sử dụng @RestController.

@RequestMapping

Bằng cách chú thích @RequestMapping, chúng ta có thể ánh xạ phương thức hoặc bộ xử lý cho yêu cầu từ người dùng. Thông thường, chúng ta sẽ ánh xạ cho một URL cụ thể, nhưng chúng ta cũng có thể ánh xạ theo phương thức như GET hoặc POST bằng cách sử dụng các thuộc tính sau.

@RequestMapping("/test")
public string test() {
    return "test";
}

@RequestMapping có thể được sử dụng cho cả lớp và phương thức. Khi được sử dụng cho lớp, giá trị được cấu hình sẽ hoạt động như một tiền tố. Trong trường hợp này, phương thức sẽ mặc định ánh xạ vào yêu cầu đến URL của tiền tố. Khi sử dụng cho phương thức, chúng ta có thể cấu hình cả đường dẫn tương đối và đường dẫn tuyệt đối.

Về thuộc tính

Bằng cách sử dụng các thuộc tính của @RequestMapping, chúng ta có thể xác định điều kiện ánh xạ.

@RequestMapping(value="/test", method=RequestMethod.GET, headers="Accept=application/*", params="id=002")
    • value: Xác định đường dẫn URL.
    • method: Chỉ định phương thức như GET hoặc POST.
    • headers: Chỉ định các tiêu đề HTTP. Nếu chỉ xác định tên tiêu đề, ánh xạ sẽ được xác định dựa trên sự có mặt của tiêu đề đó. Nếu cả tên và giá trị đều được xác định, ánh xạ sẽ được xác định dựa trên việc tiêu đề có giá trị đó hay không.
    • params: Xác định các tham số của yêu cầu. Cách sử dụng giống như headers.

Giá trị trả về

Controller có thể trả về nhiều loại giá trị khác nhau.

String

Trả về tên View. Tên View này sẽ được chuyển đổi thành tên thực tế của tệp thông qua ViewResolver và trả về cho khách hàng. Ngoài ra, nếu sử dụng các tiền tố như “forward:” hoặc “redirect:”, chúng ta có thể thực hiện chuyển tiếp hoặc chuyển hướng.

@RequestMapping("/test")
public string test() {
    return "test";
}

void

Không trả về giá trị. Thường được sử dụng khi phương thức trực tiếp trả về xử lý cho khách hàng.

@RequestMapping("/test")
public void test(@RequestBody String body, Writer writer) throws IOException {
   writer.write(body);
}

Chú thích @RequestBody trong ví dụ trên sẽ được giải thích sau, cho phép chúng ta nhận dữ liệu trong phần thân của yêu cầu.

@ResponseBody

Mặc dù không phải là một loại lớp, khi chú thích @ResponseBody trên phương thức, giá trị trả về sẽ trở thành nội dung của phản hồi mà không cần xử lý qua ViewResolver. Chúng ta đã sử dụng nó trong Bài 2 đã tạo Hello World.

@RequestMapping("/test")
@ResponseBody
public string test() {
    return "Hello World";
}

Trong ví dụ trên, chúng ta chỉ đơn giản đặt một chuỗi, nhưng @ResponseBody cho phép chúng ta cấu hình giá trị trả về chi tiết hơn. Chi tiết về cách cấu hình này sẽ được giải thích trong bài tiếp theo.

ModelAndView

Là một lớp chứa cả Model và tên View. Nó cho phép chúng ta truyền Model cho View cũng như giá trị trả về.

@RequestMapping("/test")
public ModelAndView test(ModelAndView mav) {
    mav.addObject("model", "model"));
    mav.setViewName("test");
    return mav;
}

Trong các bài viết tiếp theo, chúng ta sẽ sử dụng ModelAndView cho giá trị trả về của Controller để giữ mã nguồn dễ hiểu.

Các chú thích sử dụng được trong Controller

Chú thích cho phương thức

Ngoài @RequestMapping@ResponseBody đã nói ở trên, có nhiều chú thích khác có thể được sử dụng cho phương thức.

@ModelAttribute

Sử dụng khi chúng ta muốn nhận một lớp Model do chúng ta tự tạo làm tham số. @ModelAttribute sẽ được gọi trước mỗi lần yêu cầu, trước @RequestMapping, và liên kết với Model và đối tượng tương ứng. Chú thích này sẽ được giải thích chi tiết trong bài tiếp theo.

Chú thích cho tham số

Phương thức có thể nhận nhiều giá trị từ View thông qua các tham số. Các chú thích dưới đây có thể được sử dụng cho các tham số.

@PathVariable

Nhận tham số từ yêu cầu URL. Ví dụ dưới đây là khi URL chứa ID người dùng và muốn nhận giá trị đó.

@RequestMapping("/test/{userId}")
public ModelAndView test(@PathVariable("userId") String userId, ModelAndView mav) {
    ...
}

@RequestHeader

Nhận các tiêu đề yêu cầu. Thuộc tính required xác định xem nó là bắt buộc hay không. Mặc định là true, do đó, nếu tiêu đề không tồn tại, đó sẽ là lỗi. Để tránh điều này, chúng ta cần đặt required thành false.

@RequestMapping("/test")
public ModelAndView test(@RequestHeader(value="User-Agent", required=false) String agent, ModelAndView mav) {
  ...
}

@CookieValue

Nhận giá trị cookie. Trong ví dụ dưới đây, chúng ta cũng đặt required thành false giống như @RequestHeader.

@RequestMapping("/test")
public ModelAndView test(@CookieValue(value="SESSIONID", required=false) String sid, ModelAndView mav) {
  ...
}

@RequestBody

Nhận nội dung của phần thân yêu cầu.

@RequestMapping("/test")
public ModelAndView test(@RequestBody String body, ModelAndView mav) {
  ...
}

Tổng kết

Trên đây là tất tần tật về Controller trong Spring Boot rồi.Ở bài viết tiếp theo, chúng ta sẽ tiếp tục giải thích về Controller. Chúc mọi người gặp nhiều may mắn!

dev_pro_it
Đang làm IT tại Japan

Bình luận

Bài viết chưa có bình luận. Hãy trở thành người bình luận đầu tiên!
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic