ActionForm 是 Struts 框架中封裝 HTTP 請求參數、執行服務端校驗的核心組件。其生命週期由控制器(ActionServlet/RequestProcessor)自動管理,開發者需理解其完整工作流程以避免常見坑點。
struts-config.xml 中 <action> 元素已配置 name 屬性指向 <form-bean>。
<form-beans>
<form-bean name="loginForm" type="com.example.LoginForm"/>
</form-beans>
<action path="/login" type="com.example.LoginAction"
name="loginForm" scope="request" validate="true">
<forward name="success" path="/welcome.jsp"/>
</action>
<form-beans> 中匹配 name="loginForm" 獲取 type 全限定類名。scope="request|session" 在對應作用域(request/session)查找是否已存在同類型實例。setXxx() 完成數據綁定。validate(ActionMapping, HttpServletRequest) 方法,返回 ActionErrors。若有錯誤,控制器轉發回輸入頁面顯示錯誤信息,不再執行後續步驟。Action.execute(mapping, form, request, response),業務邏輯開始執行。
構造器 → reset() → setter()。刷新頁面(重新 GET 請求)時:構造器 → reset()(不調用 setter,因無表單提交數據)。
null 或空 ActionErrors → 驗證通過,繼續執行 Action。ActionErrors → 驗證失敗,控制器自動轉發至 input 屬性指定頁面(或 action path 對應頁面),<html:errors/> 顯示錯誤。| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 表單數據不顯示 | reset() 過度清空、setter 方法名不匹配、scope 不匹配 | 檢查 reset() 邏輯、屬性命名規範、scope 配置 |
| 驗證不生效 | action 配置 validate="false"、validate() 未正確返回錯誤 | 設置 validate="true"、確保 validate() 返回 ActionErrors |
| Session FormBean 數據殘留 | reset() 未清空、未在流程結束時從 session 移除 | 完善 reset()、最後步驟調用 session.removeAttribute() |