一、Action 線程安全模型
Struts 採用 單例模式 管理 Action 類:ActionServlet 為多線程,每個 Action 類在應用中僅有一個實例。為確保線程安全,框架採用 Lazy Singleton + 同步塊:首次請求時檢查實例是否存在,不存在則同步創建。
開發鐵律:Action 絕不能使用實例變量存儲請求狀態
- 錯誤示範:
private String userName; 在 execute() 中賦值 → 併發請求相互覆蓋。
- 正確做法:所有請求相關數據使用 局部變量,或放入
ActionForm、HttpSession、request 作用域。
二、Resource Wrapper 機制:配置驅動運行時行為
Struts 大量採用 包裝器模式 將配置文件(XML)映射為記憶體物件,實現「修改 XML 即時生效,無需重編譯」:
| 配置元素 | 包裝類 | 核心職責 |
<controller> | ControllerConfig | 控制器全局參數(processorClass、contentType 等) |
<action> | ActionMapping | 路徑、FormBean、Forwards、validate 等屬性;findForward() 先找局部再找全局 |
<forward> | ActionForward | Web 資源抽象(JSP、Servlet 路徑),支援重定向/轉發 |
三、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(源模組前綴)。
五、常用工具類速查
| 包 | 類 | 核心方法 | 用途 |
org.apache.struts.util | RequestUtils | 靜態方法 | 請求參數綁定、URL 處理、模組前綴解析(線程安全) |
| ResponseUtils | 靜態方法 | 寫入響應、過濾輸出 |
org.apache.commons.beanutils | BeanUtils | populate(), getProperty() | Map→Bean 自動填充、屬性字串化(內部轉型) |
| PropertyUtils | getProperty() | 直接讀取屬性值(保持原類型,無轉型) |
org.apache.commons.collections | FastHashMap | setFast(boolean) | 多線程讀多寫少場景優化的 Map,快/慢模式切換 |
六、避坑指南
- Action 實例變量洩漏請求狀態 → Code Review 必查項。
DispatchAction 方法非 public → 反射調用失敗拋 IllegalAccessException。
- 濫用
BeanUtils.populate() 導致惡意字段注入 → 白名單過濾或改用手動綁定。
- 多模組下
SwitchAction 前綴配置錯誤 → 404 或循環跳轉。
深入理解控制器機制,能寫出更穩健、可維護的 Struts 應用,也為遷移 Spring MVC 打下認知基礎。
- 上一篇文章: Hibernate 集合過濾器:Filtering Collections 實戰詳解
- 下一篇文章: Struts 文本域處理:動態下拉選單數據封裝範例
Copyright ©
程式碼之家 All Rights Reserved