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

Java 學習雜談(九)—— Struts 1 核心架構與設計模式解析

     編輯:Java 相關知識

Struts 1 歷史地位

2001 年 5 月發布,引入 MVC 模式分離視圖 (JSP) 與業務邏輯,一度成為 Web 應用事實標準。優勢:低風險(人才易招)、成熟穩定、XML 配置替代硬編碼路徑。

整體架構:前端控制器模式

  • ActionServlet:唯一前端控制器,web.xml 配置攔截所有 *.do 請求。
  • 職責:接收請求 → RequestProcessor 初始化映射 → 轉發至後端 Action → Action 返回 ActionForward → 轉發/重定向至視圖 JSP。
  • 本質:封裝 Servlet API,實現視圖與業務解耦。

XML 配置驅動

struts-config.xml 維護邏輯名稱 → 實現類映射,修改路徑無需改代碼重編譯,理念延續至今(Spring MVC、Struts 2 均沿用)。

核心組件深度解析

1. 後端控制器 Action

  • 繼承 org.apache.struts.action.Action,覆寫 execute(mapping, form, request, response)。
  • 框架提供 DispatchAction、DynaValidationAction 等變體。

線程安全機制

  • 單例模式:應用生命周期內每個 Action 類僅創建一個實例,所有請求共享。
  • RequestProcessor.processActionCreate() 雙重檢查鎖緩存實例於 HashMap(Key=類名)。
  • 開發者責任:Action 中禁用實例字段,僅用局部變量;若必須用實例字段,需自行同步。

安全角色攔截

  • <action> 元素 roles 屬性指定訪問角色(逗號分隔)。
  • RequestProcessor.processRoles() 調用 request.isUserInRole() 校驗,失敗轉發至 input 指定頁面。

2. 數據傳輸對象 FormBean (ActionForm)

  • DTO 模式:隔離模型層與 Web 層,減少傳輸冗余。
  • 兩種作用域:session(默認)、request。

標準生命周期

  1. 控制器收到請求。
  2. 從 scope 取得/創建 ActionForm 實例。
  3. 調用 reset() 初始化字段。
  4. 放入 scope。
  5. 自動填充表單數據(setter 映射)。
  6. 若配置 validate="true" 且 name 匹配,調用 validate()。
  7. 驗證失敗 → 轉發 input;成功 → 調用 Action.execute()。

reset() 關鍵作用

  • session 作用域下,同一實例服務多請求,reset() 清理殘留數據至關重要。
  • request 作用域每請求新建實例,reset() 相對次要。

3. 驗證框架與國際化 (I18N)

  • 驗證框架:validator.xml 定義規則,validation-rules.xml 映射實現,自動生成 JavaScript 客戶端驗證。評價:生成代碼冗余、彈窗醜陋,實際項目多改用服務端驗證(ActionForm.validate() 或 Action.saveErrors())配合友好提示。
  • 國際化:基於 java.util.Locale + .properties 訊息鍵值對。JSP 使用 <bean:message key="..."/> 取值。不同語言對應不同 properties 文件,需用 native2ascii 轉 Unicode 編碼。

總結

Struts 1 以前端控制器 + XML 配置 + ActionForm 確立了 Java Web MVC 基礎範式。其單例 Action、手動線程安全、驗證框架生成 JS 等設計在當時創新,但也暴露出局限,直接催生了 Struts 2、Spring MVC 等新一代框架。理解其核心模式(Front Controller、DTO、Declaration Configuration)有助於掌握現代框架本質。

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