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

RequestProcessor 處理ActionConfig 子類別,實質對應 struts-config.xml*.do)從 ActionMapping 取得對應 ActionForm 與 ActionActionForm 屬性ActionForm.validate() 表單驗證Action.execute() 執行業務邏輯ActionForwardmapping 中一個 forward,對應至一個 URLvalidate() 驗證表單資料有效性form.validate 出現異常時,產生 ActionError 加入 ActionErrorsAction:僅能透過 execute() 執行單一任務DispatchAction:依配置參數分派執行不同方法(如 insert、update),不限於 execute()LookupDispatchAction:依提交表單按鈕名稱對應執行方法bean, html)<html:form action="/Logon" focus="username" onsubmit="return validateLogonForm(this);"><html:errors/> 顯示錯誤訊息<html:javascript formName="LogonForm" dynamicJavascript="true"/> 產生客戶端驗證腳本<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>
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;
}
}
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 僅負責流程控制與轉向。