首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts ActionForm 工作原理全流程解析:從請求映射到驗證執行

     編輯:Java 相關知識

ActionForm 核心職責

ActionForm 是 Struts 框架中封裝 HTTP 請求參數、執行服務端校驗的核心組件。其生命週期由控制器(ActionServlet/RequestProcessor)自動管理,開發者需理解其完整工作流程以避免常見坑點。

完整工作流程 9 步驟

  1. 檢查 Action 映射配置:確認 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>
  2. 根據 name 查找 FormBean 定義:控制器在 <form-beans> 中匹配 name="loginForm" 獲取 type 全限定類名。
  3. 確定作用域並檢查實例:根據 scope="request|session" 在對應作用域(request/session)查找是否已存在同類型實例。
  4. 復用或創建實例:
    • 存在且類型匹配 → 直接復用。
    • 不存在或類型不符 → 實例化新對象(調用無參構造器),存入指定作用域。
  5. 調用 reset() 方法:關鍵步驟。在設置新屬性值前重置表單狀態,清空殘留數據。刷新頁面時也會觸發構造器 + reset()。
  6. 調用 Setter 方法填充屬性:根據請求參數名匹配屬性名,自動調用 setXxx() 完成數據綁定。
  7. 執行驗證(validate=true 時):調用 validate(ActionMapping, HttpServletRequest) 方法,返回 ActionErrors。若有錯誤,控制器轉發回輸入頁面顯示錯誤信息,不再執行後續步驟。
  8. 驗證通過,調用 Action.execute():將 ActionForm 實例作為參數傳遞給 Action.execute(mapping, form, request, response),業務邏輯開始執行。

流程圖解

ActionForm 工作流程圖

關鍵細節與最佳實踐

調用順序鐵律

構造器 → reset() → setter()。刷新頁面(重新 GET 請求)時:構造器 → reset()(不調用 setter,因無表單提交數據)。

reset() 設計原則

  • 僅重置可由用戶輸入的屬性(如表單字段),不要重置下拉選項列表、只讀顯示字段等非用戶輸入屬性,否則導致頁面顯示異常。
  • Session 作用域 FormBean 必須正確實現 reset(),否則多次提交數據會疊加污染。

validate() 返回值處理

  • 返回 null 或空 ActionErrors → 驗證通過,繼續執行 Action。
  • 返回非空 ActionErrors → 驗證失敗,控制器自動轉發至 input 屬性指定頁面(或 action path 對應頁面),<html:errors/> 顯示錯誤。

scope 選擇指南

  • request:默認,每次請求新建/復用,適用於大多數表單。
  • session:跨請求保持狀態(如向導式多步表單),需謹慎管理生命週期,及時清理。

常見問題排查

現象可能原因解決方案
表單數據不顯示reset() 過度清空、setter 方法名不匹配、scope 不匹配檢查 reset() 邏輯、屬性命名規範、scope 配置
驗證不生效action 配置 validate="false"、validate() 未正確返回錯誤設置 validate="true"、確保 validate() 返回 ActionErrors
Session FormBean 數據殘留reset() 未清空、未在流程結束時從 session 移除完善 reset()、最後步驟調用 session.removeAttribute()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved