hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 05: Spring MVC: request, Controller, Model và View
Java và Spring Boot – MVC và REST API

Spring Boot bài 05: Spring MVC: request, Controller, Model và View

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 3/12: Spring MVC và dữ liệu hiển thị · Bài 05/28 · Biên soạn tháng 10/2026.

← Bài 04 · Mục lục 12 chương · Bài 06 →

Mục lục

  • Mục tiêu bài học
  • Request được ánh xạ vào phương thức nào?
  • Model là dữ liệu của lần render này
  • Phân biệt đường dẫn, query string và request body
  • Dùng DevTools của trình duyệt để quan sát
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Theo dõi một request GET từ tham số URL đến template Thymeleaf và hiểu ý nghĩa của tên view.

Request được ánh xạ vào phương thức nào?

Trình duyệt gửi GET /courses?q=Spring&page=0. Hạ tầng Spring MVC tìm phương thức có mapping phù hợp, chuyển kiểu tham số rồi gọi Controller. @GetMapping chỉ định đường dẫn và HTTP method; không nên dùng cùng một endpoint GET để thay đổi dữ liệu vì trình duyệt, cache hoặc công cụ tìm kiếm có thể gọi lại nó.

Trong ví dụ, q là từ khóa, page là chỉ số trang bắt đầu từ 0, size là số dòng và sort là trường sắp xếp. @RequestParam lấy tham số query string; defaultValue giúp URL ngắn vẫn có giá trị hợp lệ. Service tiếp tục kiểm tra giới hạn thay vì tin mọi số do client gửi lên.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/CourseWebController.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@GetMapping({"/","/courses"})
String list(@RequestParam(defaultValue="") String q,@RequestParam(defaultValue="0") int page,@RequestParam(defaultValue="10") int size,@RequestParam(defaultValue="id") String sort,Model model){
    model.addAttribute("result",service.search(q,page,size,sort));model.addAttribute("q",q);model.addAttribute("sort",sort);return "courses/list";
}

Model là dữ liệu của lần render này

Model chứa các tên mà template sẽ đọc: result, q và sort. Tên chuỗi courses/list được view resolver hiểu là template courses/list.html trong resources/templates. Nó không phải URL để trình duyệt truy cập trực tiếp và cũng không phải nội dung trả ra màn hình.

Controller chỉ cần chuẩn bị dữ liệu đã sẵn sàng hiển thị. Không để template tự gọi Repository hoặc mở transaction. Trong mẫu, Service trả Page<CourseDto>; mỗi DTO có tên khóa học, giá và tên danh mục. Việc chuyển đổi hoàn thành trước khi render nên không phụ thuộc lazy loading trong template.

Phân biệt đường dẫn, query string và request body

/courses/12 chỉ một tài nguyên; @PathVariable nhận 12. /courses?q=Java là thao tác tìm kiếm và @RequestParam đọc q. Khi gửi biểu mẫu hoặc JSON, dữ liệu thường nằm trong body. Chọn annotation theo dạng request, không theo cảm giác tên tham số giống nhau.

Nếu URL chứa /courses/abc trong khi phương thức cần Long, lỗi chuyển kiểu xảy ra trước khi nghiệp vụ chạy. Nếu id có kiểu đúng nhưng không tồn tại, Service ném CourseNotFound và ứng dụng trả 404. Hai tình huống này khác nhau và nên có cách phản hồi tương ứng.

Dùng DevTools của trình duyệt để quan sát

Mở tab Network, tải /courses rồi chọn request dạng document. Bạn sẽ thấy URL, method GET, mã 200 và response HTML. Trang CSS có request riêng. Việc có HTML trong response cho thấy server đã render; không cần viết JavaScript để tạo bảng cho cách làm này.

Thử đổi q trong URL và quan sát ô tìm kiếm giữ lại giá trị. Nếu Controller trả được 200 nhưng bảng trống, hãy kiểm tra model và dữ liệu. Nếu nhận 404, kiểm tra mapping; nếu lỗi template, đọc tên template và biểu thức được nêu trong log. Đừng xóa Security hay đổi toàn bộ cấu hình chỉ vì một đường dẫn bị gõ sai.

Lỗi thường gặp và lưu ý

  • Trong @Controller, return "courses/list" là tên view; trong @RestController, cùng chuỗi có thể trở thành nội dung response.
  • @PathVariable và @RequestParam không thay thế tùy tiện cho nhau.

Ghi nhớ

Luồng MVC là request → Controller → Service → Model → template HTML. Biết luồng này giúp khoanh vùng lỗi nhanh hơn.

Tài liệu đối chiếu

  • Annotated Controllers

← Bài 04 · Mục lục 12 chương · Bài 06 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 20: REST Controller, JSON và DTO cho API danh sách
Java và Spring Boot – MVC và REST API
Spring Boot bài 21: REST CRUD: POST, PUT, DELETE và mã trạng thái
Java và Spring Boot – MVC và REST API
Spring Boot bài 22: Validation API, ProblemDetail và hợp đồng lỗi
Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×