MVC (Model-View-Controller) là một trong những architectural patterns phổ biến, được sử dụng để tổ chức cấu trúc của một ứng dụng bằng cách phân tách các trách nhiệm khác nhau thành ba thành phần chính là Model, View và Controller. MVC giúp giảm sự phụ thuộc giữa các thành phần và làm cho ứng dụng của chúng ta dễ phát triển, testing và bảo trì hơn. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về mô hình MVC, các bạn nhé!
MVC là gì?
MVC là viết tắt của:
- M – Model
- V – View
- C – Controller
Ý tưởng chính của MVC là separation of responsibilities – phân tách các trách nhiệm trong ứng dụng.
Thay vì để một thành phần duy nhất xử lý tất cả mọi thứ như:
- Nhận input từ người dùng
- Xử lý dữ liệu
- Thực hiện business logic
- Quản lý trạng thái
- Hiển thị kết quả
MVC chia những trách nhiệm này thành các thành phần riêng biệt:
- Model – quản lý trạng thái và dữ liệu của ứng dụng
- View – chịu trách nhiệm hiển thị thông tin
- Controller – xử lý tương tác và điều phối giữa người dùng, Model và View
MVC workflow

Cho một workflow ví dụ trong ứng dụng ngân hàng thì khi người dùng yêu cầu deposit vào tài khoản số tiền là 500$ thì Controller sẽ nhận request này và điều phối quá trình xử lý. Model sẽ cập nhật trạng thái của ứng dụng, ví dụ balance hiện tại của user là 1000$, giờ user deposit thêm 500$ thì balance mới sẽ là 1500$. View sẽ sử dụng trạng thái mới của user để hiển thị balance là 1500$.
Model
Model đại diện cho trạng thái và dữ liệu của ứng dụng.
Model có thể chứa thông tin mà ứng dụng cần để thực hiện các hoạt động của mình.
Ví dụ, hãy tưởng tượng chúng ta đang xây dựng một ứng dụng ngân hàng.
Một Account có thể có:
|
1 2 3 4 5 6 |
Account ---------------- accountNumber customerName balance status |
Ví dụ:
|
1 2 3 4 5 6 |
Account ---------------- accountNumber = "123456" customerName = "John" balance = 1000 status = ACTIVE |
Đây chính là một phần application state mà Model có thể đại diện.
Model không nhất thiết phải là một class duy nhất.
Ví dụ, một ứng dụng có thể có:
|
1 2 3 4 5 6 |
Customer Account Transaction Payment Order Product |
Tất cả những đối tượng này có thể là một phần của Model tùy thuộc vào cách ứng dụng được thiết kế.
Model không nhất thiết phải là Database Entity hay là DTO, các bạn nhé!
View
View chịu trách nhiệm present hoặc hiển thị thông tin cho người dùng.
Ví dụ, với ứng dụng ngân hàng, View có thể hiển thị:
|
1 2 3 4 |
Account Number: 123456 Customer: John Balance: $1,000 Status: ACTIVE |
View tập trung vào cách thông tin được trình bày.
Controller
Controller chịu trách nhiệm xử lý interaction và điều phối quá trình xử lý.
Ví dụ, người dùng thực hiện thao tác:
|
1 |
Deposit $500 |
Controller có thể nhận interaction này và yêu cầu Model thực hiện việc cập nhật trạng thái.
Mô hình MVC nguyên thủy
Mô hình MVC được giới thiệu lần đầu tiên bởi Trygve Reenskaug khi anh ta đang làm việc trong dự án Smalltalk ở công ty Xerox PARC (một công ty ở California, Mỹ) trong những năm 1970. Ở thời điểm đó, mô hình này được áp dụng cho các ứng dụng desktop, các ứng dụng trên máy tính để bàn.
Mô hình MVC nguyên thủy phân chia các lớp trình bày thành các thành phần khác nhau. Mỗi thành phần sẽ đảm nhận một vai trò khác nhau như mình đã chia sẻ ở trên:
- View sẽ sử dụng Model để hiển thị kết quả cho người dùng.
- Dựa vào hành động của người dùng, View sẽ kích hoạt Controller để xử lý thao tác của người dùng.
- Sau đó, Controller sẽ cập nhật dữ liệu cho Model.
- Khi trạng thái của Model thay đổi, View có thể được cập nhật để phản ánh trạng thái mới này.
Mô hình này hoạt động rất tốt với các ứng dụng desktop, nhưng khi đem mô hình này áp dụng cho các ứng dụng web thì không khả thi do bản chất của giao thức HTTP trong các ứng dụng web là request/response.
Với một ứng dụng web thì người dùng thao tác với ứng dụng bằng cách gửi một request tới server chạy ứng dụng web đó. Ứng dụng web sẽ xử lý request này, cập nhật giao diện rồi mới gửi trả lại cho người dùng. Điều này có nghĩa là chúng ta phải có một cách xử lý khác trong môi trường web, thay vì đẩy những thay đổi lên cho View thì những thay đổi này sẽ được lấy về từ server.
Đó là lý do tại sao chúng ta phải có những thay đổi trong mô hình MVC cho môi trường web.
Mô hình MVC trong môi trường web
Để khắc phục khó khăn của mô hình MVC trong môi trường web, một phương pháp phổ biến là sử dụng Front Controller Pattern.
Nói nôm na thì Front Controller sẽ là nơi đầu tiên tiếp nhận các request từ người dùng và nó cũng là nơi sẽ trả kết quả lại cho người dùng. Thay vì mỗi request được gửi trực tiếp đến một Controller riêng biệt, request trước tiên sẽ đi qua Front Controller. Front Controller sau đó có thể xác định Controller nào phù hợp để xử lý request. Các controller này sẽ xử lý request, trả về model và chọn view sẽ sử dụng.
Các bạn hãy xem hình vẽ sau:

Spring MVC triển khai Web MVC architecture bằng cách sử dụng DispatcherServlet làm Front Controller đó các bạn:

DispatcherServlet cung cấp một quy trình xử lý request chung và delegate các công việc cụ thể cho những component khác của Spring MVC.
Một số công việc được Spring MVC delegate bao gồm:
- Tìm Controller phù hợp với request.
- Invoke Controller.
- Xử lý Model và View.
- Resolve View.
- Xử lý exception.
- Chuyển đổi Java object thành HTTP response.
Tổng kết
MVC là một pattern giúp phân tách trách nhiệm trong một ứng dụng thành ba nhóm chính: Model, View và Controller.
Khi áp dụng MVC vào web application, mô hình HTTP request/response làm thay đổi cách các thành phần này tương tác. Một giải pháp phổ biến mà chúng ta có thể sử dụng là Front Controller Pattern.
Các Java framework khác nhau, các bạn có thể sẽ gặp những cách implement mô hình MVC khác nhau, nhưng ý tưởng của chúng thì cũng dựa vào mô hình MVC này đó các bạn!

