Struts 框架的控制器層以 ActionServlet 為核心,採用多線程模型處理請求。理解其線程安全設計與實例管理策略,對於構建高效穩定的 Web 應用至關重要。
Struts 中的 Action 類被設計為線程安全,因此應用程序中僅創建一個實例。框架採用「懶漢式單例」模式:在首次請求時判斷實例是否存在,若不存在則同步創建,確保同一時刻只有一個線程能初始化 Struts 實例。這種設計避免了重複創建對象的開銷,但也要求開發者嚴格遵守不在 Action 類中使用實例變量存儲客戶專屬狀態的原則。所有請求相關的數據應通過 execute 方法的局部變量處理,或存放在請求、會話等作用域中。
Struts 大量使用「資源包裝器」模式:配置文件中定義的資源(如數據源、表單驗證規則)在內存中由對應類的實例代表。修改配置只需編輯 XML 文件,無需重編譯代碼。典型例子包括:
ControllerConfig 類對應 <controller> 元素配置ActionMapping 對應 <action> 元素,其 findForward() 會先檢查動作級轉向,再查找全局轉向ActionForward 代表 <forward> 元素,抽象封裝 JSP 頁面、Servlet 等 Web 資源Action 類應專注於控制流程,具體業務邏輯需委托給模型組件(如 EJB、Spring Bean 或 POJO 服務層),保持控制層輕量化。
org.apache.struts.actions 包提供五種預置 Action 實現,滿足常見控制需求:
最簡單的轉發機制,直接將請求轉發到 parameter 屬性指定的 URI,適合無需業務邏輯的頁面跳轉。
模擬 RequestDispatcher.include() 行為,將指定資源的輸出包含在當前響應中,適用於頁面片段復用場景。
核心多功能分發器,通過 parameter 屬性指定的請求參數值決定調用哪個公共方法。開發者需繼承此類並實現多個 public 方法(簽名固定為 execute 變體),將相關業務邏輯聚合在同一類中。底層採用 Java 反射調用目標方法,因此所有處理方法必須聲明為 public。
DispatchAction 的增強版,引入資源綁定機制:請求參數值作為鍵查找國際化資源鍵,再映射到具體方法名。這層間接映射解決了參數值硬編碼在代碼中的問題,支援多語言環境下的動態分發。
支援模組化應用間的切換,接受 page(目標頁面)和 prefix(源模組前綴)兩個參數,實現跨模組導航。
populate() 將 Map 鍵值對批量填充到 Bean;getProperty() 返回屬性字符串表示;getArrayProperty() 獲取字符串數組getProperty() 返回屬性原始類型值,不進行類型轉換,性能略優於 BeanUtilsFastHashMap 繼承自 HashMap,針對多線程讀多寫少場景優化,提供 fast(無鎖讀)和 slow(同步寫)雙模式切換,顯著提升併發讀取性能。
DispatchAction 系列減少類爆炸,相關功能聚合管理FastHashMap 等線程優化集合