下面是Struts中的一些常用Action如DispatchAction/LookupDispatchAction/MappingDispatchAction/ForwardAction/IncludeAction的總結(jié)
1 .DispatchAction extends BaseAction
一般的Action如
對于同一個formbean上進(jìn)行的新增、修改、刪除等,我們需要分發(fā)不同的Action,這里有兩種做法。
① 一種是通過在execute方法中if判斷進(jìn)行不同的轉(zhuǎn)向:
㈠ UserAction 類的execute方法中
String method = request.getParameter("method");
if (method.equals("create")) {
……
return mapping.findForward("createUser");
}
if (method.equals("save")) {
……
return mapping.findForward("saveUser");
}
㈡ struts-config.xml 中:
name="userForm"
scope="request">
name="userForm"
scope="request">
㈢ 可以在頁面中定義一個隱藏變量來指明相應(yīng)的操作
// 這里最好不要使用
// 因為這種寫法需要在formbean中定義相應(yīng)的property,我們可以采用普通隱藏域
然后定義一個javascript函數(shù),我們可以在通過點擊提交按鈕的時候,在函數(shù)中修改它的值。
點擊提交按鈕時,通過set方法設(shè)置提交的method屬性值:
② 第二就是使UserAction繼承DispatchAction,不需要重寫execute方法:
public ActionForward create(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進(jìn)行一些create的邏輯
// ……
return mapping.findForward("createUser");
}
public ActionForward save(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進(jìn)行一些save的邏輯
// ……
return mapping.findForward("saveUser");
}
㈡ DispatchAction 在配置上和一般Action稍有不同,就是要在Action配置中多一個parametr屬性,這個屬性可以指定執(zhí)行DispatchAction中對應(yīng)的方法。
struts-config.xml 中:
name="userForm"
scope="request"
parameter="method">
㈢ 我們在這里指定了parameter的值為method,則頁面提交時我們必須指定提交時action的method參數(shù)來確定去我們想要調(diào)用哪個Action方法。
點擊提交按鈕時,通過submitForm方法設(shè)置提交時action的method參數(shù):
2 . LookupDispatchAction extends DispatchAction
LookupDispatchAction 繼承DispatchAction, 在上面的 ② ㈢ 中對于同一個頁面上的多個submit按鈕,不需要那么多復(fù)雜的js函數(shù)來指定提交時action的method參數(shù),即上面的submitForm(operation)方法可以省去,LookupDispatchAction其用法為:
① 用MessageResource將按鈕的文本和ResKey相關(guān)聯(lián),例如button.save=保存; ② ㈢ 中用LookupDispatchAction代替就是:
② 在Action配置中多一個parametr屬性,屬性值與submit按鈕的property屬性值相同,這個屬性可以指定執(zhí)行LookupDispatchAction中對應(yīng)的方法。
struts-config.xml 中:
name="userForm"
scope="request"
parameter=" method ">
③
使UserAction繼承LookupDispatchAction,重寫getKeyMethodMap()方法, 將ResKey和MethodName對應(yīng)起來, 如下:
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.create", "create");
map.put("button.save", "save");
return map;
}
注: DispatchAction 類使用請求參數(shù)的值確定調(diào)用哪種方法,而LookupDispatchAction類利用請求參數(shù)值,反向查詢資源綁定,并將它與類中的一種方法匹配,實際上這兩種方法有異曲同工之處。
3 . MappingDispatchAction extends DispatchAction
DispatchAction 指定了parameter的值為method,則頁面提交時我們必須指定提交時action的method參數(shù)來確定去我們想要調(diào)用哪個Action方法,而MappingDispatchAction直接通過struts-config.xml將多個action-mapping映射到同一個Action類的不同方法:
name="userForm"
scope="request"
parameter="create">
name="userForm"
scope="request"
parameter="save">
然后UserAction繼承MappingDispatchAction即可:
public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
注: 查看MappingDispatchAction的源碼:
protected String getMethodName(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response,
String parameter) throws Exception {
// Return the unresolved mapping parameter.
return parameter;
}
可以看到它調(diào)用的方法是直接返回struts-config.xml中parameter的值。
4 . ForwardAction extends BaseAction
相當(dāng)于
type="org.apache.struts.actions.ForwardAction"
scope="request"
parameter="/pages/listUser.jsp">
parameter 屬性用于指定forward到哪個頁面,path、type、parameter三個屬性為必須,其他可省略。
5 . IncludeAction extends BaseAction
相當(dāng)于
name="userForm"
scope="request"
parameter="/pages/includepage.jsp">