序言
本文系統整理 Struts 1.x 整體架構、核心組件(ActionServlet、ActionMapping、ActionForm、Action、ActionForward)、配置檔詳解,以及四大標籤庫的完整屬性與用法,適合作為開發階段的速查手冊。
1. Struts 壓縮包結構
lib/:struts.jar、JDBC 2.0 擴充包、*.tld 標籤描述檔 → 需複製至 WEB-INF/lib
webapps/:struts-blank.war(空白專案)、struts-example.war(功能示範)、struts-documentation.war(文件)、struts-upload.war(檔案上傳範例)等
2. MVC 架構在 Struts 中的對應
| 層級 | Struts 組件 | 說明 |
| Model | ActionForm Bean、業務邏輯 Bean/EJB | 內部狀態與改變狀態的操作 |
| View | JSP + Struts 標籤庫 | 支援國際化、動態模板 |
| Controller | ActionServlet + ActionMapping | 攔截請求、委派 Action、管理轉向 |
3. 核心組件詳細說明
3.1 struts-config.xml 配置要點
- <form-beans>:定義 ActionForm 名稱、類別、作用域
- <global-forwards>:全域邏輯轉向名稱對應路徑
- <action-mappings>:核心映射,屬性包含
path、type、name、scope、input、validate、巢狀 <forward> 定義區域轉向
- <data-sources>:JDBC 連線池配置(1.1 版後建議使用 JNDI DataSource)
3.2 ActionServlet:核心控制器
- 初始化參數:
config、debug、validate、multipartClass 等
- 請求處理流程:攔截 → 映射 Action → 建立/取得 ActionForm → 填充屬性 →
validate() → 呼叫 Action.execute() → 依 ActionForward 轉向
- 提供動態增刪 Mapping/FormBean/Forward/DataSource 方法
3.3 ActionMapping、ActionForward、ActionErrors
ActionMapping.findForward() 取得區域/全域轉向
ActionForward 三種建構子支援路徑、重導向
ActionErrors 收集 ActionError,支援訊息鍵值、參數替換、全域/欄位級錯誤
3.4 Action 與 ActionForm 最佳實踐
- Action 必須執行緒安全:不儲存請求狀態於實例/靜態變數,共享資源需同步
- ActionForm 僅負責表單資料承載與基本格式驗證,業務規則驗證放在 Action 或 Service 層
reset() 於每次請求前清空屬性,避免殘留資料
4. 四大標籤庫完整屬性速查
4.1 Bean 標籤庫 (struts-bean.tld)
| 標籤 | 用途 | 關鍵屬性 |
<bean:define> | 定義/複製 Bean、屬性至腳本變數 | id, name, property, value, scope, toScope |
<bean:cookie/header/parameter/include/resource> | 從 Cookie、Header、參數、內含資源建立腳本變數 | id, name, value, multiple 等 |
<bean:write> | 輸出 Bean 屬性,支援 HTML 過濾 | name, property, scope, filter, ignore |
<bean:message> | 國際化訊息輸出,支援 arg0~arg3 參數替換 | key, locale, bundle, arg0~arg3 |
4.2 Logic 標籤庫 (struts-logic.tld)
| 分類 | 標籤 | 功能 |
| 條件比較 | <logic:equal/notEqual/greaterThan/lessThan/greaterEqual/lessEqual> | Cookie/Header/參數/Bean屬性與常數比較 |
| 存在性檢查 | <logic:present/notPresent> | 檢查 Cookie/Header/參數/Bean/屬性/角色/用戶是否存在 |
| 模板匹配 | <logic:match/notMatch> | 判斷值是否為常數子字串,支援 location 索引位置 |
| 迭代 | <logic:iterate> | 遍歷 Collection/Map/Iterator/陣列,支援 offset、length、indexed |
| 轉向/重導向 | <logic:forward>, <logic:redirect> | 全域轉向、帶參數重導向 |
4.3 HTML 標籤庫 (struts-html.tld)
- 表單標籤:
<html:form> 綁定 ActionForm,屬性 action、method、focus、onsubmit 等
- 輸入控制項:
text、password、textarea、checkbox、multibox、radio、select/option、file、hidden、submit、reset、button、cancel,均對應 ActionForm 屬性,支援 JavaScript 事件屬性
- 錯誤顯示:
<html:errors> 讀取 ActionErrors,支援 property 過濾特定欄位錯誤
- 其他:
html、base、link、rewrite、img
4.4 Tiles 模板標籤庫
<tiles:insert definition="..."/> 插入版面定義
<tiles:put name="..." value="..."/> 定義區塊內容
<tiles:get name="..."/> 在版面 JSP 中取出區塊
- 支援
controllerClass 注入呈現邏輯,結合角色權限控制
5. 目錄結構建議
/WEB-INF
/lib struts.jar, commons-*.jar
/classes 編譯後 .class、.properties
/tld 標籤描述檔(可選,亦可放在 jar 內)
struts-config.xml
web.xml
/pages JSP 檔案
總結
Struts 1.x 以集中式 struts-config.xml 管理導航、表單、轉向,標籤庫大幅減少 Scriptlet,雖已被 Spring MVC 等取代,但在存量系統維護中仍具參考價值。掌握其核心組件生命週期與標籤屬性,能有效提升除錯與重構效率。