搭建 Struts 2 專案步驟
- 建立 Web Project。
- 導入核心 JAR 包(struts2-core、xwork、ognl、freemarker 等)。
- `web.xml` 配置核心過濾器 `StrutsPrepareAndExecuteFilter`。
- 編寫 Action 類(POJO,無需實作介面)。
- `struts.xml` 放入 classpath(`WEB-INF/classes`),配置 Action 映射與結果視圖。
- 部署至 Tomcat 啟動驗證。
Struts 2 工作原理
- 請求到達 `StrutsPrepareAndExecuteFilter`。
- 根據 `struts.xml` 尋找匹配的 ActionMapping。
- 實例化 Action(每請求一個實例,天然線程安全)。
- 攔截器鏈執行(參數注入、驗證、檔案上傳等)。
- 執行 Action `execute()` 方法,返回結果代碼(如 "success")。
- 根據結果代碼轉發至對應 JSP/Freemarker 視圖。
- 視圖渲染回應給瀏覽器。
為何選擇 Struts 2?
- 解決 Servlet 痛點:web.xml 大量配置、單入口 doGet/doGet 混雜、與容器強耦合(request/response)、代碼臃腫、URL 難管理、表單數據手工獲取。
- MVC 分離:控制器、模型、視圖清晰分層。
- 攔截器機制:橫切關注點(日誌、權限、事務)複用。
- OGNL 表達式語言:強大的數據綁定與類型轉換。
- 標籤庫豐富:UI、資料、控制標籤提升開發效率。
- 易於單元測試:Action 為 POJO,無容器依賴。
Struts 2 標籤庫(5 類)
| 標籤庫 | 用途 |
| HTML | 生成與框架整合的表單輸入元素 |
| Bean | 存取 JavaBean 屬性、定義新 Bean |
| Logic | 條件輸出、集合迴圈 |
| Template | 頁面模板機制(已被 Tiles 取代) |
| Nested | 增強標籤巢狀使用能力 |
Action 線程安全性
Struts 2 Action 預設每請求建立新實例,天然線程安全。 但若在 Action 中宣告**類變數(static/instance field)**,多執行緒會共享,導致不安全。解決:避免可變實例變數,或使用 `ThreadLocal`。
Validator 驗證框架組成
- 驗證規則 Java 類
- 驗證規則配置檔(`validation.xml`)
- 資源檔(錯誤訊息國際化)
- JSP 自定義標籤(`` 顯示錯誤)
支援客戶端 JavaScript 驗證與伺服器端 Java 驗證雙模式。
ActionForm 役割(Struts 1 概念,Struts 2 已整合)
Struts 2 直接用 Action 屬性接收表單數據,無獨立 ActionForm。功能相當:
- 頁面初始化數據載入
- 接收用戶提交數據(自動類型轉換)
- 驗證數據合法性(`validate()` 方法或註解)
缺點提醒
- 大量標籤學習曲線陡峭。
- Action 難以單元測試(Struts 1),Struts 2 已改善。
- XML 配置繁瑣(可用約定優於配置/註解緩解)。