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

Struts 開發指南:核心工作流程與組件交互深度解析

     編輯:Java 相關知識

核心處理流程時序

1. 用戶提交請求 → *.do
2. ActionServlet (Front Controller) 接收
3. 委託 RequestProcessor (模板方法模式) 處理
4. RequestProcessor:
   a. 根據 path 查找 ActionMapping (struts-config.xml 映射)
   b. 獲取/創建 ActionForm → BeanUtils 自動填充請求參數
   c. 調用 ActionForm.validate() → ActionErrors? → 返回 input 頁面
   d. 獲取/創建 Action 實例 (單例, 線程不安全!)
   e. 調用 Action.execute(mapping, form, request, response)
   f. 獲得 ActionForward (邏輯視圖名)
   g. mapping.findForward() 解析物理路徑
5. RequestDispatcher.forward() → JSP/Tiles 渲染
6. 響應返回瀏覽器

關鍵組件深度剖析

ActionMapping:配置元數據的運行時映射

  • 封裝 <action> 所有屬性:path, type, name, scope, validate, forwards, exceptions。
  • 繼承 ActionConfig,提供 findForward(String name) 解析邏輯視圖。
  • 請求處理期間可通過 request.getAttribute(Globals.MAPPING_KEY) 獲取。

RequestProcessor:可擴展的處理管道

核心方法 (可覆寫定制):

  • processMapping()、processActionForm()、processValidate()、processActionCreate()、processActionPerform()、processForward()。
  • Struts 1.1+ 採用命令模式,每步驟可插攔截器 (雖非標準攔截器鏈)。

ActionForm:View Helper + 表單守門員

  • JavaBean 規範,屬性對應表單字段。
  • reset(ActionMapping, HttpServletRequest):請求開始前重置默認值。
  • validate(ActionMapping, HttpServletRequest):返回 ActionErrors,框架自動 saveErrors(request, errors) 並轉發至 input 頁面。
  • DynaActionForm:struts-config.xml 聲明 <form-property>,無需 Java 類,適合動態/原型開發。
  • DynaValidatorForm:整合 Validator 插件,聲明式驗證規則 (required, mask, date, email 等)。

ActionErrors / ActionError:錯誤信息容器

  • ActionErrors 為 List<ActionError> 容器,支援全局錯誤 (GLOBAL_ERROR) 與字段級錯誤。
  • <html:errors/> 或 <html:messages/> 在 JSP 顯示。
  • 國際化:ActionError("key", args...) 關聯資源文件。

Action:業務邏輯入口,單例多線程

  • 線程安全鐵律:絕不使用實例變量保存請求狀態。所有數據通過方法參數傳遞。
  • 業務訪問採用 Business Delegate:Action → BusinessDelegate → Session Facade / Service → DAO。解耦 JNDI 查找、異常轉換、事務邊界。
  • 派生 Action 類型:
    類型分發依據適用場景
    DispatchAction請求參數 method=xxxCRUD 合一 Action
    LookupDispatchAction提交按鈕 name (資源鍵值)國際化按鈕、安全分發
    MappingDispatchAction<action parameter="method">配置驅動分發

官方示例應用剖析:logon / subscription

logon.jsp 亮點

  • <html:form action="/logon" focus="username" onsubmit="return validateLogonForm(this)">:客戶端 JS 驗證 (<html:javascript> 生成) + 服務端雙重保障。
  • <bean:message key="prompt.username"/>:I18N 标籤輸出標籤文本。
  • <html:password redisplay="false"/>:密碼不回顯,安全最佳實踐。

struts-config.xml 關鍵配置

<form-beans>
  <form-bean name="logonForm" type="org.apache.struts.validator.DynaValidatorForm">
    <form-property name="username" type="java.lang.String"/>
    <form-property name="password" type="java.lang.String"/>
  </form-bean>
  <form-bean name="subscriptionForm" type="com.app.SubscriptionForm"/> <!-- 傳統 ActionForm -->
</form-beans>

<action-mappings>
  <action path="/logon"
          type="com.app.LogonAction"
          name="logonForm"
          scope="request"
          input="/logon.jsp"> <!-- 驗證失敗返回頁 -->
    <forward name="success" path="/mainMenu.jsp"/>
    <forward name="failure" path="/logon.jsp"/>
  </action>
</action-mappings>

LogonAction 核心邏輯

  • 從 DynaValidatorForm 通過 PropertyUtils.getSimpleProperty() 取值 (非強轉)。
  • 業務驗證:用戶存在性、密碼匹配、數據庫可用性。
  • 錯誤處理:saveErrors(request, errors) + return mapping.getInputForward()。
  • 登錄成功:用戶對象放入 HttpSession,清理請求/會話層 FormBean,轉發成功頁。
  • 演示異常處理:用戶名 arithmetic 拋 ArithmeticException,expired 拋 ExpiredPasswordException,配合 <global-exceptions> 驗證框架機制。

SubscriptionForm 完整驗證邏輯

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    ActionErrors errors = new ActionErrors();
    if (host == null || host.length() == 0)
        errors.add("host", new ActionError("error.host.required"));
    if (username == null || username.length() == 0)
        errors.add("username", new ActionError("error.username.required"));
    if (password == null || password.length() == 0)
        errors.add("password", new ActionError("error.password.required"));
    if (type == null || type.length() == 0)
        errors.add("type", new ActionError("error.type.required"));
    else if (!"imap".equals(type) && !"pop3".equals(type))
        errors.add("type", new ActionError("error.type.invalid", type));
    return errors;
}

最佳實踐總結

  1. Action 單一職責:僅做參數轉換、異常捕獲、導航決定,業務邏輯下沉 Service 層。
  2. Form 驗證前置:儘量用 Validator 插件聲明式驗證,複雜業務驗證在 Action 或 Service 層。
  3. 錯誤信息國際化:所有 ActionError 使用資源鍵值,支援多語言部署。
  4. 會話層 FormBean 及時清理:mapping.getScope() == "session" 時手動 session.removeAttribute(),防止內存洩漏與數據殘留。
  5. 善用 DispatchAction 族:合併同類 CRUD 操作,減少 Action 類數量,配置清晰。

總結

Struts 工作流程以 RequestProcessor 為骨干,串聯 ActionMapping、ActionForm、Action、ActionForward 核心組件。深入理解各組件職責、交互協議、線程模型、擴展點,是編寫高質量 Struts 應用、排查疑難雜癥、平滑遷移 Struts 2/Spring MVC 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved