使用 DispatchAction


您為每一個動作撰寫一個Action類,隨著網站的增大,維護Action的成本也就隨著增大,您可以使用 模組化程式 來管理,而另一方面,在檢視一些Action時,您會發現某些Action所執行的,其實是完成一個業務邏輯所需要的連續動作或相關動作,例如帳號的登 入、登出等動作。

在Struts中,您可以使用org.apache.struts.actions.DispatchAction類別將完成一個業務邏輯所需要的連續動 作或相關動作集中於一個Action類中,在繼承DispatchAction後,您不再是重新定義execute()方法,而是撰寫自己的動作, execute()方法已在DispatchAction抽象類中定義。

例如可以繼承DispatchAction來定義一個AccountAction,在當中集中管理一些與帳號相關的操作,一個例子如下:
  • AccountAction.java
package onlyfun.caterpillar;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;

public class AccountAction extends DispatchAction {
public ActionForward login(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進行一些Login的邏輯
......
}

public ActionForward logout(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進行一些Logout的邏輯
......
}

public ActionForward method1(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進行一些method1的邏輯
......
}

.....
}

程式中不再重新定義execute()方法,而是定義我們自己的login()、logout()等方法,這些方法接收與execute()相同的參數,並且也傳回ActionForward物件。

使用DispatchAction時,要在struts-config.xml定義:
  • struts-config.xml
...
<action
path="/account"
type="onlyfun.caterpillar.AccountAction"
parameter="method"
name="userForm">
<forward
name="greeting"
path="/WEB-INF/pages/greeting.jsp"/>
</action>
...

主要就是在parameter的屬性上,我們指定依method請求參數來指定所要執行的方法,例如下面的網址將會執行AccountAction的 login()方法:
 http://localhost:8080/strutsapp/account.do?method=login

注意在請求參數中,包括了method=login來指定執行login()方法,同樣的,如果您要執行logout()方法,則如下:
http://localhost:8080/strutsapp/account.do?method=logout