MVC (Model-View-Controller) 設計模式是 J2EE Web 應用開發的主流架構基石。本文系統介紹 MVC 核心概念、分析 Apache Struts 框架優缺點,並提出一種輕量化的新型框架 WebFramework,詳細闡述其分層架構、核心組件設計與關鍵技術實現,旨在降低開發複雜度、提升可維護性與擴展性。
隨著開源生態蓬勃,Struts 等框架大幅降低 J2EE 開發門檻。但實務中暴露出:學習曲線陡峭、配置檔膨脹、表現層與業務層耦合度高、缺乏前端驗證方案等痛點。WebFramework 應運而生,目標為結構清晰、易理解、低耦合、高擴展、低成本。
MVC 將互動式應用分解為三大職責分離的組件:
| 組件 | 職責 | 關鍵特徵 |
|---|---|---|
| Model (模型) | 封裝業務邏輯、資料狀態與持久化操作 | 無 UI 依賴、可複用、支援多種 View |
| View (視圖) | 呈現資料、提供使用者介面 | 被動顯示、從 Model 讀取資料、JSP/Template Engine |
| Controller (控制器) | 接收請求、協調 Model 與 View、控制流程 | 請求分派、導航控制、輸入驗證入口 |
核心價值:關注點分離 → 並行開發、單元測試容易、技術遷移風險低 (如換 View 引擎不動 Model)。
ActionServlet (Front Controller) 接收所有請求struts-config.xml 映射至 Action 類別Action 呼叫業務邏輯 (Model),封裝結果於 ActionFormvalidation.xml),增強健壯性struts-config.xml 中的 <forward> 使業務流程可視化html:, logic:, bean: 標籤提升 JSP 開發效率| 問題 | 影響 |
|---|---|
| 學習曲線陡峭 | Taglib、ActionForm、Validator、Tiles 等概念多,新手上手慢 |
| 業務層與表現層耦合高 | Action 直接操作 HttpServletRequest/Response,難以單元測試與複用 |
| 缺乏前端驗證整合 | 僅伺服器端驗證,用戶體驗差,須自行整合 JS 框架 |
| 配置檔過度膨脹 | 專案增大時 struts-config.xml 動輒數千行,維護困難 |
┌─────────────────────────────────────┐
│ Presentation Layer (表示層) │
│ ┌──────────────┐ ┌────────────────┐ │
│ │ View Format │ │Presentation Ctrl│ │ ← 細分 View 與控制邏輯
│ │ Layer │ │ Logic Layer │ │
│ └──────────────┘ └────────────────┘ │
├─────────────────────────────────────┤
│ Business Layer (業務邏輯層) │
│ ┌──────────────┐ ┌────────────────┐ │
│ │Business Session│ │Business Persist│ │ ← 會話外觀 + 持久化分離
│ │ Layer │ │ Layer │ │
│ └──────────────┘ └────────────────┘ │
├─────────────────────────────────────┤
│ Data Layer (資料層) │
│ Database / File / External Systems │
└─────────────────────────────────────┘
| 層次 | 子層 | 職責 | 技術實現 |
|---|---|---|---|
| 表示層 | 視圖格式層 | 僅保留構建客戶端視圖所需的顯示格式與事件觸發 | JSP / Velocity / FreeMarker / Thymeleaf |
| 表示控制邏輯層 | 人機交互控制邏輯、部分業務會話邏輯 | Servlet / Controller / Command Pattern | |
| 業務層 | 業務會話層 | 封裝完整業務活動,保證事務一致性與效率 | Session Facade / EJB / Spring Service |
| 業務持久化層 | 提供資料持久化操作,隔離資料庫細節 | DAO / Hibernate / iBATIS / JPA | |
| 資料層 | — | 資料治理:建立、儲存、查詢、更新、刪除、安全、備份 | JDBC / File API / JCA |
取代 Struts ActionForm,使用純 POJO 作為層間傳輸載體:
// Controller
public class UserController extends BaseController {
public void execute(HttpServletRequest req, HttpServletResponse res) {
UserVO vo = new UserVO();
vo.setName(req.getParameter("name"));
vo.setEmail(req.getParameter("email"));
UserService service = ServiceFactory.getUserService();
UserVO result = service.register(vo); // 業務層回傳 VO
req.setAttribute("user", result);
forward("/success.jsp"); // 轉向 View
}
}
優勢:無框架特定基類、易單元測試、序列化支援遠端呼叫。
required, pattern, data-*)// 以註解取代龐大 XML
@Controller
@RequestMapping("/user")
public class UserController {
@ActionMapping("/register")
@Validate(RegisterValidator.class) // 伺服器端驗證
public String register(UserVO vo) {
// ...
return "forward:/success.jsp";
}
}
配置檔僅保留資料源、事務管理等基礎設施設定,業務映射零配置。
| 服務方式 | 適用資料類型 | 存取介面 |
|---|---|---|
| 資料庫方式 | 結構化業務資料 (訂單、會員、商品) | JDBC / DataSource / Connection Pool |
| 檔案方式 | 非結構化資料 (文件、圖片、報表、影音) | OS File API / NIO.2 / Cloud Storage SDK |
資料層對業務層提供標準化介面,支援事務、備份/還原、安全控管。
WebFramework 通過細分表示層、解耦業務會話與持久化、引入 VO 傳遞、簡化配置,有效解決 Struts 時代的痛點。其核心思想——關注點分離、慣例優於配置、POJO 化業務邏輯——與後續 Spring MVC、Spring Boot 設計哲學一脈相承。雖技術棧已演進,但分層架構原則與框架設計思維對現代微服務、Serverless 架構同樣具指導意義。
註:文中圖片路徑為原始文檔佔位符,實際部署時請替換為對應圖片資源。