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

浙公網(wǎng)安備 33010602011771號