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

Struts 框架核心架構與開發指南:MVC 模式實戰詳解

     編輯:Java 相關知識

前言

Apache Struts 作為早期 Java Web 開發的標杆框架,完整實現了 Model-View-Controller (MVC) 設計模式,將業務邏輯、頁面展示與請求調度清晰分離。本指南系統梳理 Struts 1.x 的核心組件、開發流程與最佳實踐,助您快速構建可維護的企業級應用。

一、MVC 在 Struts 中的映射

1.1 Model:系統狀態與業務邏輯

Model 層由 JavaBeans 構成,分為系統狀態 Bean(如購物車、用戶信息)與業務邏輯 Bean(封裝具體操作,如結帳、庫存扣減)。Struts 建議將「做什麼」(業務邏輯)與「決定做什麼」(Action 類)分離,支持普通 JavaBeans、EJB 或 Spring 管理的服務對象。

1.2 View:JSP 與標籤庫

視圖層以 JSP 為主,結合 Struts 提供的豐富自定義標籤庫(HTML 表單標籤、邏輯標籤、Bean 標籤等)實現國際化、表單自動回顯與驗證錯誤顯示。頁面中僅包含模板文本與標籤,動態數據由框架自動注入。

1.3 Controller:ActionServlet 與 ActionMapping

核心控制器 ActionServlet 接收所有請求,根據 struts-config.xml 中的 <action> 映射,實例化對應的 Action 類執行業務邏輯,最後通過 ActionForward 轉發至目標視圖。映射支持邏輯名稱(如 success、failure),實現控制邏輯與具體頁面路徑的解耦。

二、Model 組件開發詳解

2.1 JavaBeans 與作用域

Web 應用中 Bean 可存放於四種作用域:page、request、session、application。理解生命週期與可見性對正確共享數據至關重要。例如,購物車宜置於 session;只讀配置數據適合 application。

2.2 ActionForm Bean:表單數據載體

  • 實現 ActionForm 接口,僅包含屬性 Getter/Setter,不含業務邏輯。
  • 框架自動完成:檢查實例 → 創建/復用 → 屬性自動填充(同 <jsp:setProperty property="*">) → 傳遞給 Action.perform()。
  • 驗證邏輯建議放在 Action 或業務 Bean 中;Form Bean 保留用戶輸入以便錯誤回顯。
  • 一個邏輯表單(可能跨多個 JSP 頁面)對應一個 ActionForm,提交至同一 Action,便於頁面重組無需改動後端。

2.3 系統狀態 Bean 與業務邏輯 Bean

狀態 Bean 映射數據庫記錄(如 CustomerBean 對應 CUSTOMERS 表),可為自容器管理或需外部持久化。業務邏輯 Bean 封裝具體操作(如 checkout()),設計時避免依賴 Servlet API,以便復用於非 Web 環境(批處理、Swing 客戶端等)。

2.4 數據庫連接池最佳實踐

  1. 啟動 Servlet (load-on-startup) 初始化連接池,存入 ServletContext (application 作用域)。
  2. Action 從池獲取連接 → 傳給業務 Bean 執行操作 → finally 塊中必須歸還連接,防止洩漏。
  3. 業務 Bean 方法簽名包含 Connection 參數,不自行獲取連接,實現環境無關性。

三、View 組件構建技巧

3.1 國際化 (i18n) 支持

基於 java.util.ResourceBundle 與 Struts MessageResources,通過 ApplicationResources.properties 及語言變體文件(如 _zh_TW.properties)管理文案。JSP 中使用 <struts:message key="..."/> 動態取值,用戶切換語言只需變更 Session 中的 Locale。

3.2 表單標籤庫:告別手工 HTML

對比傳統 <input value="<%=bean.getProp()%>">,Struts 標籤 <struts:text name="prop"/> 自動綁定 FormBean 屬性,極大簡化頁面開發。完整示例見 logon.jsp:<struts:form> 關聯 logonForm,<struts:text>/password 自動回顯,<struts:errors/> 統一展示錯誤。

3.3 進階表單功能

  • 自動驗證:實現 ValidatingActionForm,重寫 validate() 返回錯誤鍵值數組,框架自動轉回輸入頁並顯示 <struts:errors>。
  • 豐富輸入類型:checkbox、radio、select/option、textarea、hidden 等全覆蓋。
  • 輔助標籤:iterate 遍歷集合、link 自動維護 Session ID、property 唯讀顯示等。

3.4 組件化頁面設計

使用 <jsp:include page="..." flush="true"/> 實現運行時動態組裝(如門戶頁的搜索框、新聞區、郵件提醒),支持條件包含;靜態片段用 <%@ include file="..." %>。圖表生成可採用 Servlet 輸出圖片流或 Applet 方案。

四、Controller 組件配置與編程

4.1 Action 類編寫規範

public ActionForward perform(ActionServlet servlet,
                             ActionMapping mapping,
                             ActionForm form,
                             HttpServletRequest request,
                             HttpServletResponse response)
    throws IOException, ServletException;

核心職責:檢查登錄態 → 表單驗證(若未自動驗證) → 調用業務 Bean → 更新請求/會話屬性 → 返回 ActionForward。關鍵原則:

  • 線程安全:僅使用局部變量,避免實例變量。
  • 異常處理:捕獲業務異常,記錄日誌 (servlet.log()),轉向友好錯誤頁。
  • 資源釋放:在轉發前關閉數據庫連接等稀缺資源。
  • 薄 Action:業務邏輯委派給獨立 Bean,避免 Action 膨脹難維護。

4.2 ActionMapping 擴展

內建 ActionMappingBase 滿足基本需求;若需額外屬性(如例子中的 success/failure 邏輯視圖名),可繼承並配置於 struts-config.xml,框架自動注入屬性值。

4.3 struts-config.xml 映射文件

<action-mappings>
  <forward name="logon" path="/logon.jsp"/>
  <action path="/logon"
          actionClass="org.apache.struts.example.LogonAction"
          formAttribute="logonForm"
          formClass="org.apache.struts.example.LogonForm"
          inputForm="/logon.jsp">
    <forward name="success" path="/mainMenu.jsp"/>
  </action>
</action-mappings>

<forward> 定義邏輯視圖名,Action 中通過 mapping.findForward("success") 獲取,實現頁面重命名不影響 Java 代碼。

4.4 web.xml 部署描述符關鍵配置

  1. ActionServlet 定義:指定 config (映射文件)、application (資源包基類)、mapping (自定義 Mapping 類)、debug、load-on-startup 等初始化參數。
  2. Servlet 映射:擴展匹配 (*.do) 或 前綴匹配 (/execute/*)。
  3. 標籤庫聲明:<taglib> 指向 /WEB-INF/struts.tld。
  4. 文件部署:struts.jar 放入 WEB-INF/lib,struts.tld 放入 WEB-INF。

總結

Struts 通過嚴格的 MVC 分層、標準化的控制器調度、強大的標籤庫與國際化支持,為早期 Java Web 開發確立了工程化規範。雖然現代框架 (Spring MVC, Struts2) 已演進,但其核心思想——關注點分離、配置驅動、標籤封裝——仍值得深入理解與借鑑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved