在傳統 Struts 開發中,每個業務操作往往對應一個 Action 類別,導致類別數量膨脹。DispatchAction 透過方法分派機制,讓單一 Action 類別封裝一組相關操作,大幅減少類別數量並簡化維護。
DispatchAction 繼承自 Action,屬抽象類別,內建關鍵方法:
dispatchMethod:根據請求參數動態呼叫對應方法。getMethod:透過反射取得目標方法物件。getMethodName:從請求中解析方法名稱。在 struts-config.xml 中,DispatchAction 需額外指定 parameter 屬性,告知使用哪個請求參數作為方法名稱:
<action path="/user"
type="com.example.UserAction"
name="userForm"
scope="request"
parameter="method"
input="/user.jsp">
<forward name="success" path="/list.jsp"/>
<forward name="failure" path="/error.jsp"/>
</action>
public class UserAction extends DispatchAction {
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 新增邏輯
return mapping.findForward("success");
}
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 修改邏輯
return mapping.findForward("success");
}
public ActionForward delete(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 刪除邏輯
return mapping.findForward("success");
}
}
透過 URL 參數 method 指定欲執行的操作:
https://localhost:8080/myapp/user.do?method=addhttps://localhost:8080/myapp/user.do?method=updatehttps://localhost:8080/myapp/user.do?method=deletemethod 參數,DispatchAction 會呼叫 unspecified() 並拋出例外,建議覆寫該方法提供預設行為。ActionForward xxx(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) 簽名。採用 DispatchAction 後,原本需要三個類別 (AddAction, UpdateAction, DeleteAction) 現只需一個 UserAction,程式碼集中、導覽邏輯統一,後期維護成本顯著降低。