JavaWeb 架構經歷了 **JSP 巨石 → Model 1 → Model 2 (MVC) → 三層架構 → 微服務** 的演進。本文通過對比 **Model 1、Model 2、MVC、三層架構** 的核心差異、職責劃分、代碼組織形式,幫你建立清晰的架構認知地圖。
<%-- login.jsp --%>
<%
// 1. 獲取參數
String username = request.getParameter("username");
String password = request.getParameter("password");
// 2. 直連數據庫 (JDBC 代碼內嵌)
Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE username=? AND password=?");
ps.setString(1, username); ps.setString(2, password);
ResultSet rs = ps.executeQuery();
// 3. 邏輯判斷 & 頁面跳轉
if (rs.next()) {
session.setAttribute("user", username);
response.sendRedirect("index.jsp");
} else {
out.println("登入失敗");
}
%>
四大痛點: HTML/Java 強耦合、邏輯與視圖混淆、難以單元測試、前後端協作地獄。
| 維度 | Model 1 (Page-Centric) | Model 2 (Servlet-Centric) |
|---|---|---|
| 核心差異 | **JSP 同時充當 Controller 和 View** | **Servlet 做 Controller,JSP 專職 View** |
| 流程控制 | JSP 內嵌 <% ... %> 控制跳轉 | Servlet 處理請求、調用 Model、選擇 JSP |
| 數據傳遞 | JSP 直接調用 JavaBean | Servlet 創建 Bean 放入 request/session,JSP 取出渲染 |
| 優點 | 簡單、開發快、適合極小項目 | 職責分離、可測試、支撐大型應用 |
| 缺點 | JSP 依然臃腫、邏輯分散 | Servlet 編寫繁瑣 (後由 Struts/Spring MVC 解決) |
DispatcherServlet (前端控制器) 攔截。Controller (Action)。Service 處理業務,獲取 Model 數據。View (JSP/Thymeleaf),將 Model 暴露給 View。MVC = Model + View + Controller,是 Model 2 的規範化稱呼。
| 角色 | 職責 | 典型技術 |
|---|---|---|
| Model (模型) | 業務數據 + 業務規則封裝。JavaBean、Entity、DTO、Service 返回值。 | POJO、JPA Entity、MyBatis ResultMap |
| View (視圖) | 數據展示、用戶交互。模板引擎渲染動態數據。 | JSP、Thymeleaf、FreeMarker、Velocity、React/Vue (前後端分離) |
| Controller (控制器) | 請求分發、參數校驗、調用 Service、選擇 View、異常處理。 | Servlet、Struts Action、Spring MVC @Controller/@RestController |
現代框架本質:
DispatcherServlet 做前端控制器。Filter (StrutsPrepareAndExecuteFilter) 做前端控制器。三層 ≠ MVC**。MVC 是 **Web 表現層內部** 的設計模式;三層架構是 **整個應用系統** 的宏觀邏輯分層。
| 層次 | 別名 | 核心職責 | 包含內容 |
|---|---|---|---|
| 表現層 | UI Layer / Web Layer | 接收請求、參數綁定、調用業務、視圖渲染/JSON 序列化 | Controller、View、Filter、Interceptor、DTO/VO |
| 業務邏輯層 | BLL / Service Layer | 核心業務規則、事務控制、跨 DAO 協調、權限校驗 | Service、Domain Service、@Transactional |
| 數據訪問層 | DAL / DAO Layer | CRUD、SQL 構建、連接池、緩存一致性 | Mapper、Repository、JdbcTemplate、RedisTemplate |
┌─────────────────────────────────────┐ │ 表現層 (UI Layer) │ ←→ MVC 整體運行在這一層 │ ┌───────────────────────────────┐ │ │ │ Controller (Servlet/Action) │ │ │ │ View (JSP/Thymeleaf) │ │ │ │ Model (DTO/VO/Form Bean) │ │ │ └───────────────────────────────┘ │ ├─────────────────────────────────────┤ │ 業務邏輯層 (BLL) │ │ Service, Domain Model, Transaction │ ├─────────────────────────────────────┤ │ 數據訪問層 (DAL) │ │ DAO/Mapper, Repository, ORM │ └─────────────────────────────────────┘
關鍵認知:
Model 1:JSP 包辦一切 → 耦合度極高。
Model 2 / MVC:引入 Controller 分離流程控制 → Web 表現層內部分工。
三層架構:將業務邏輯、數據訪問從表現層**物理剝離** → 整體系統邏輯解耦。
微服務 / DDD:按業務域劃分獨立服務 → 組織級解耦。
每一次演進都是為了**將變化點隔離、將穩定點復用**。理解每一層的「職責邊界」與「依賴方向」,比背誦定義更能指導實戰架構決策。