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

Struts 控制器核心機制:Action 線程安全、Resource Wrapper 與內建 Action 類詳解

     編輯:Java 程式設計入門

一、Action 線程安全模型

Struts 採用 單例模式 管理 Action 類:ActionServlet 為多線程,每個 Action 類在應用中僅有一個實例。為確保線程安全,框架採用 Lazy Singleton + 同步塊:首次請求時檢查實例是否存在,不存在則同步創建。

開發鐵律:Action 絕不能使用實例變量存儲請求狀態

  • 錯誤示範:private String userName; 在 execute() 中賦值 → 併發請求相互覆蓋。
  • 正確做法:所有請求相關數據使用 局部變量,或放入 ActionForm、HttpSession、request 作用域。

二、Resource Wrapper 機制:配置驅動運行時行為

Struts 大量採用 包裝器模式 將配置文件(XML)映射為記憶體物件,實現「修改 XML 即時生效,無需重編譯」:

三、Action 類職責邊界

Action 僅作為控制層薄包裝:接收請求 → 封裝參數 → 委派給模型組件(BO/Service) → 根據返回結果選擇 ActionForward。嚴禁在 Action 中編寫業務邏輯、SQL 或複雜演算法。

四、Struts 內建 5 大 Action 類詳解

1. ForwardAction - 簡單頁面跳轉

  • 無需編寫 Java 類,配置 parameter="/path/to/page.jsp" 直接轉發。
  • 適用:靜態頁面導航、幫助頁、錯誤頁跳轉。

2. IncludeAction - 頁面片段包含

  • 對應 RequestDispatcher.include(),將目標資源輸出合併至當前響應。
  • 適用:頁面公共片段(Header/Footer)組合,但現代開發多用 JSP Include 指令或 Tiles/Template 引擎。

3. DispatchAction - 多方法分派(核心推薦)

  • 一個 Action 類聚合同一業務模塊的多個操作(如 add()、edit()、delete()、list())。
  • 配置 parameter="method",請求帶 ?method=add 觸發對應方法。
  • 限制:方法必須 public、返回 ActionForward、參數固定 (mapping, form, request, response);底層用反射調用,性能略低於直接調用。

4. LookupDispatchAction - 國際化友好的分派

  • 繼承 DispatchAction,不直接用方法名,而是用 request 參數值 反向查找 ApplicationResources 鍵值,匹配方法名。
  • 優勢:按鈕顯示「新增」「修改」等本地化文字,無需在 URL 暴露英文方法名。

5. SwitchAction - 模組間跳轉

  • 支援 Struts 多模組架構下的模組切換。
  • 參數:page(目標路徑)、prefix(源模組前綴)。

五、常用工具類速查

配置元素包裝類核心職責
<controller>ControllerConfig控制器全局參數(processorClass、contentType 等)
<action>ActionMapping路徑、FormBean、Forwards、validate 等屬性;findForward() 先找局部再找全局
<forward>ActionForwardWeb 資源抽象(JSP、Servlet 路徑),支援重定向/轉發
包類核心方法用途
org.apache.struts.utilRequestUtils靜態方法請求參數綁定、URL 處理、模組前綴解析(線程安全)
ResponseUtils靜態方法寫入響應、過濾輸出
org.apache.commons.beanutilsBeanUtilspopulate(), getProperty()Map→Bean 自動填充、屬性字串化(內部轉型)
PropertyUtilsgetProperty()直接讀取屬性值(保持原類型,無轉型)
org.apache.commons.collectionsFastHashMapsetFast(boolean)多線程讀多寫少場景優化的 Map,快/慢模式切換

六、避坑指南

  1. Action 實例變量洩漏請求狀態 → Code Review 必查項。
  2. DispatchAction 方法非 public → 反射調用失敗拋 IllegalAccessException。
  3. 濫用 BeanUtils.populate() 導致惡意字段注入 → 白名單過濾或改用手動綁定。
  4. 多模組下 SwitchAction 前綴配置錯誤 → 404 或循環跳轉。

深入理解控制器機制,能寫出更穩健、可維護的 Struts 應用,也為遷移 Spring MVC 打下認知基礎。

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