首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2EE 架構核心模式:MVC (Model 2) 完整解析與 RequestDispatcher 實作指南

     編輯:Java 相關知識

MVC 模式在 Web 應用中的定位

MVC (Model-View-Controller) 實現 Web 系統職能分工:

  • Model (模型層):業務邏輯與資料存取,通常由 JavaBean / EJB 實現。
  • View (視圖層):用戶交互介面,通常由 JSP 實現。
  • Controller (控制層):請求分派、參數解析、調用 Model、選擇 View。充當 Model 與 View 解耦橋樑。

MVC 三大核心優勢

  1. 各司其職,互不干擾:層間變更隔離,修改視圖不影響業務邏輯。
  2. 利於團隊分工:頁面設計師寫 JSP,業務專家寫 Model,架構師寫 Controller。
  3. 組件復用性高:Controller 可獨立為通用分派組件,View 可做通用介面模板。

常見誤區澄清

  • 必須用複雜框架 (Struts/JSF)?錯。簡單/中等應用用內建 RequestDispatcher 即可完美實現 MVC (Model 2)。
  • MVC 影響整個系統設計?錯。可針對單一請求採用 MVC,視為「Model 2 方案」而非全系統框架。

基於 RequestDispatcher 實現 MVC (Model 2) 標準流程

  1. 定義資料承載 JavaBean (Value Object / DTO)。
  2. Servlet 處理請求:讀取參數、驗證、異常處理。
  3. 調用業務邏輯填充 Bean:Servlet 調用 Service/DAO 獲取結果,注入 Bean。
  4. 將 Bean 存入作用域:request.setAttribute("key", bean) / session.setAttribute / application.setAttribute。
  5. 轉發至 JSP:request.getRequestDispatcher("/WEB-INF/view.jsp").forward(req, resp)。
  6. JSP 提取並顯示:<jsp:useBean id="key" type="pkg.Bean" scope="request"/> + <jsp:getProperty name="key" property="field"/>。

JSP 中 useBean 關鍵規範

  • JSP 不創建對象:使用 type 屬性而非 class,確保對象由 Servlet 創建。
  • JSP 不修改對象:僅使用 jsp:getProperty,禁用 jsp:setProperty。
  • 作用域選擇:request (單次請求)、session (用戶會話)、application (全域共享)。MVC 模式通常使用 request 作用域。

三種資料共享範圍實戰對比

場景範圍Servlet 代碼JSP useBean scope
每次請求生成新隨機數Requestrequest.setAttribute("key", val);scope="request"
顯示用戶姓名 (登入後)Sessionsession.setAttribute("key", val);scope="session"
顯示全站共享質數表Applicationsynchronized(this){ app.setAttribute("key", val); }scope="application"

相對 URL 路徑陷阱與解決

問題:forward 對瀏覽器透明,瀏覽器以原 Servlet URL 為基準解析 JSP 中相對路徑 (CSS/JS/圖片/超連結),導致 404。

最簡方案:所有資源引用使用絕對路徑 (以 / 開頭):<link href="/css/style.css">、<a href="/app/page.jsp">。

MVC (Model 2) 適用場景總結

  • 單次提交產生多種視圖 (成功/失敗/錯誤頁)。
  • 多頁面共享大量處理邏輯。
  • 同一資料需多種視圖呈現 (HTML/PDF/Excel/JSON)。
  • 需嚴格分離資料層與表現層,特別適合 GUI 密集型應用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved