MVC三層架構
- MVC 是什么?
- 三層架構的組成(View、Controller、Model)
- 各層職責劃分
- 示例說明
- 面試高頻問題與參考答案
MVC(Model-View-Controller)是一種經典的軟件設計模式,廣泛應用于 Web 應用開發中,尤其是 Java Web(Servlet + JSP)、Spring MVC 等框架。
什么是 MVC?
MVC 全稱是 Model-View-Controller,它將應用程序分為三個核心部分:
層級 | 英文名 | 中文名 | 職責 |
---|---|---|---|
M | Model | 模型 | 處理數據、業務邏輯 |
V | View | 視圖 | 用戶界面(如 HTML 頁面) |
C | Controller | 控制器 | 接收請求,調用模型,返回視圖 |
MVC 在 Java Web 中的三層架構詳解
在實際開發中,我們通常把 MVC 擴展為 三層架構(3-tier architecture),分別是:
表現層(View / UI Layer)
- 技術實現:JSP、HTML、CSS、JavaScript
- 作用:
- 展示數據給用戶
- 接收用戶輸入
- 不處理復雜邏輯,只負責展示和跳轉
控制層(Controller Layer)
- 技術實現:Servlet、Spring MVC 的
@Controller
或@RestController
- 作用:
- 接收用戶的 HTTP 請求
- 調用 Service 層處理業務邏輯
- 根據結果選擇跳轉的頁面(Forward/Redirect)
示例代碼(Servlet):
@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");UserService userService = new UserService();User user = userService.login(username, password);if (user != null) {request.setAttribute("user", user);request.getRequestDispatcher("welcome.jsp").forward(request, response);} else {response.sendRedirect("login.jsp");}}
}
業務邏輯層(Service Layer)
- 技術實現:Java 類(如
UserService
、OrderService
) - 作用:
- 處理具體的業務規則(如登錄驗證、訂單計算)
- 調用 DAO 層獲取或保存數據
示例代碼:
public class UserService {private UserDao userDao = new UserDao();public User login(String username, String password) {return userDao.findByUsernameAndPassword(username, password);}
}
數據訪問層(DAO Layer / Persistence Layer)
- 技術實現:Java 類(如
UserDao
),配合 JDBC、MyBatis、Hibernate 等 - 作用:
- 與數據庫交互(增刪改查)
- 封裝底層 SQL 操作
示例代碼:
public class UserDao {public User findByUsernameAndPassword(String username, String password) {// 連接數據庫查詢// 返回 User 對象}
}
MVC 分層結構
+---------------------+
| Browser |
+----------+----------+|| HTTP Requestv
+----------+----------+
| Controller | ←→ 調用 Service 層
+----------+----------+|| 調用 DAO 層v
+----------+----------+
| Service |
+----------+----------+|| 操作數據庫v
+----------+----------+
| DAO |
+----------+----------+|| 數據庫操作v
+----------+----------+
| Database |
+---------------------+
MVC 的優勢
優點 | 說明 | |
---|---|---|
分工明確 | 各層職責清晰,便于團隊協作 | |
易于維護 | 修改某一層不影響其他層 | |
可擴展性強 | 可以替換某一層而不影響整體架構 | |
降低耦合 | 各層之間通過接口通信,松耦合設計 | |
提高復用性 | Service 層可被多個 Controller 復用 |
簡單案例演示
場景:用戶登錄功能
View(login.jsp)
<form action="login" method="post">用戶名:<input type="text" name="username"><br>密碼:<input type="password" name="password"><br><input type="submit" value="登錄">
</form>
Controller(LoginServlet)
@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");UserService userService = new UserService();User user = userService.login(username, password);if (user != null) {request.setAttribute("user", user);request.getRequestDispatcher("welcome.jsp").forward(request, response);} else {response.sendRedirect("login.jsp");}}
}
Service(UserService.java)
public class UserService {private UserDao userDao = new UserDao();public User login(String username, String password) {return userDao.findByUsernameAndPassword(username, password);}
}
DAO(UserDao.java)
public class UserDao {public User findByUsernameAndPassword(String username, String password) {// 查詢數據庫并封裝成 User 對象return user;}
}
View(welcome.jsp)
<h1>歡迎你,${user.username}</h1>
面試高頻問題
Q1:MVC 和三層架構的區別是什么?
A:MVC 是一種設計模式,強調的是 用戶交互流程;而三層架構是從 系統架構角度 劃分的層次結構,兩者結合后形成完整的 Web 應用結構。
Q2:為什么要在項目中使用 MVC?
A:為了實現 前后端分離、邏輯清晰、易于維護、提高開發效率。各層分工明確,便于多人協作開發。
Q3:Servlet 在 MVC 中屬于哪一層?JSP 呢?
A:
- Servlet 屬于 Controller 層,用于接收請求和控制流程;
- JSP 屬于 View 層,用于展示數據和頁面渲染。
Q4:如果不用 MVC,會有什么問題?
A:會出現大量業務邏輯混雜在 JSP 頁面中,導致代碼難以維護、不易測試、安全性差等問題。
Q5:如何保證各層之間的低耦合?
A:通過接口編程、依賴注入等方式,使各層之間僅依賴接口而非具體實現類。