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

Struts 開發指南:核心工作流程與關鍵元件深度解析

     編輯:Java 程式設計入門

Struts 工作流程總覽

所有請求提交給 ActionServlet 處理。流程圖:

Struts 工作流程圖

點擊查看大圖

核心元件職責

ActionServlet - 前端控制器

  • 標準 Servlet,接收所有請求
  • 將 request 轉交 RequestProcessor 處理

ActionMapping - 設定映射

  • ActionConfig 子類別,實質對應 struts-config.xml
  • 可取得所有配置資訊(路徑、Action 類別、Form Bean、Forward 等)

RequestProcessor - 請求處理器

  • 依 URL(如 *.do)從 ActionMapping 取得對應 ActionForm 與 Action
  • 將 request 參數對應至 ActionForm 屬性
  • 執行 ActionForm.validate() 表單驗證
  • 驗證通過則呼叫 Action.execute() 執行業務邏輯
  • 最終回傳 ActionForward

ActionForward - 轉向封裝

  • 對應 mapping 中一個 forward,對應至一個 URL

ActionForm - 表單封裝

  • 採用 ViewHelper 模式,封裝 HTML Form
  • 包含 validate() 驗證表單資料有效性
  • 符合 JavaBean 規範,所有屬性需有對應 getter/setter
  • 複雜系統可採 DynaActionForm 動態構造 Form,透過預設參數生成,擴充性更佳

ActionErrors - 錯誤資訊封裝

  • 執行 Action 或 form.validate 出現異常時,產生 ActionError 加入 ActionErrors
  • 驗證有誤時,導回輸入頁並提示錯誤

Action - 業務邏輯處理器

  • 每個 Action 僅建立一個 instance(單例模式)
  • 非執行緒安全,不應在 Action 中存取特定資源
  • 建議採 Business Delegate 模式 存取 Business Tier 解除耦合

Struts 內建 Action 類型

  • Action:僅能透過 execute() 執行單一任務
  • DispatchAction:依配置參數分派執行不同方法(如 insert、update),不限於 execute()
  • LookupDispatchAction:依提交表單按鈕名稱對應執行方法

Struts 內建範例程式碼解析

登入頁:Logon.jsp

  • 大量使用 Struts Taglib(bean, html)
  • 採用 Validator 外掛進行表單驗證
  • <html:form action="/Logon" focus="username" onsubmit="return validateLogonForm(this);">
  • <html:errors/> 顯示錯誤訊息
  • <html:javascript formName="LogonForm" dynamicJavascript="true"/> 產生客戶端驗證腳本

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="org.apache.struts.webapp.example.SubscriptionForm"/>
</form-beans>

<action-mappings>
  <action path="/editSubscription"
    type="org.apache.struts.webapp.example.EditSubscriptionAction"
    attribute="subscriptionForm" scope="request" validate="false">
    <forward name="failure" path="/mainMenu.jsp"/>
    <forward name="success" path="/subscription.jsp"/>
  </action>
  ...
</action-mappings>

SubscriptionForm - 標準 ActionForm 範例

public final class SubscriptionForm extends ActionForm {
    private String action = "Create";
    private boolean autoConnect = false;
    private String host, password, type, username;
    // 完整 getter/setter 省略...
    
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        // 重設所有屬性預設值
    }
    
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if (host == null || host.length() < 1)
            errors.add("host", new ActionError("error.host.required"));
        // username, password, type 驗證...
        if (type != null && !"imap".equals(type) && !"pop3".equals(type))
            errors.add("type", new ActionError("error.type.invalid", type));
        return errors;
    }
}

LogonAction - 業務邏輯處理

public final class LogonAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 取得 Locale、MessageResources、UserDatabase
        // 從 Form 取得 username/password
        // 驗證使用者認證
        // 錯誤時 saveErrors 並回傳 mapping.getInputForward()
        // 成功時將 User 存入 Session,移除過期 Form Bean
        // 回傳 mapping.findForward("success")
    }
    
    public User getUser(UserDatabase database, String username) throws ModuleException {
        // 模擬商業邏輯例外:算術例外、密碼過期例外
        // 查詢並回傳使用者
    }
}

反面教材提醒

範例程式將大量業務邏輯寫在 Action 中,屬於不良示範。實務上應分離業務邏輯至獨立層,Action 僅負責流程控制與轉向。

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