下面是Struts中的一些經常使用Action如DispatchAction/LookupDispatchAction/MappingDispatchAction/ForwardAction/IncludeAction的總結javascript
1 .DispatchAction extends BaseActionhtml
通常的Action如<action path="/createUser" type="examples.UserAction">,在這裏UserAction只須要繼承父類(extends Action類),而後重寫父類的execute方法,在execute中實現具體的控制轉向。java
對於同一個formbean上進行的新增、修改、刪除等,咱們須要分發不一樣的Action,這裏有兩種作法。apache
① 一種是經過在execute方法中if判斷進行不一樣的轉向:app
㈠ UserAction 類的execute方法中jsp
String method = request.getParameter("method");函數
if (method.equals("create")) {post
……學習
return mapping.findForward("createUser");ui
}
if (method.equals("save")) {
……
return mapping.findForward("saveUser");
}
㈡ struts-config.xml 中:
<action path="/createUser" type="examples.UserAction"
name="userForm"
scope="request">
<forward name="createUser" path="/pages/listUser.jsp"/>
</action>
<action path="/saveUser" type="examples.UserAction"
name="userForm"
scope="request">
<forward name="saveUser" path="/pages/saveUser.jsp"/>
</action>
㈢ 能夠在頁面中定義一個隱藏變量來指明相應的操做
// 這裏最好不要使用<html:hidden property="method"/>
// 由於這種寫法須要在formbean中定義相應的property,咱們能夠採用普通隱藏域
<input type="hidden" name="method"/>
而後定義一個javascript函數,咱們能夠在經過點擊提交按鈕的時候,在函數中修改它的值。
<script>
function set(operation) {
with (document.forms[0]) {
method.value = operation;
}
}
</script>
點擊提交按鈕時,經過set方法設置提交的method屬性值:
<html:submit onclick="set('create');">CREATE</html:submit>
<html:submit onclick="set('save');">SAVE</html:submit>
② 第二就是使UserAction繼承DispatchAction,不須要重寫execute方法:
public ActionForward create(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進行一些create的邏輯
// ……
return mapping.findForward("createUser");
}
public ActionForward save(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 進行一些save的邏輯
// ……
return mapping.findForward("saveUser");
}
㈡ DispatchAction 在配置上和通常Action稍有不一樣,就是要在Action配置中多一個parametr屬性,這個屬性能夠指定執行DispatchAction中對應的方法。
struts-config.xml 中:
<action path="/processUser" type="examples.UserAction"
name="userForm"
scope="request"
parameter="method">
<forward name="createUser" path="/pages/listUser.jsp"/>
<forward name="saveUser" path="/pages/saveUser.jsp"/>
</action>
㈢ 咱們在這裏指定了parameter的值爲method,則頁面提交時咱們必須指定提交時action的method參數來肯定去咱們想要調用哪一個Action方法。
<script>
function submitForm(operation) {
with (document.forms[0]) {
action = action + '?method = '+ operation;
submit();
}
}
</script>
點擊提交按鈕時,經過submitForm方法設置提交時action的method參數:
<html:form action="/processUser" method="get">
<html:button onclick="submitForm('create');">CREATE</html:button>
<html:button onclick="submitForm('save');">SAVE</html:button>
</html:form>
2 . LookupDispatchAction extends DispatchAction
LookupDispatchAction 繼承DispatchAction, 在上面的 ② ㈢ 中對於同一個頁面上的多個submit按鈕,不須要那麼多複雜的js函數來指定提交時action的method參數,即上面的submitForm(operation)方法能夠省去,LookupDispatchAction其用法爲:
① 用MessageResource將按鈕的文本和ResKey相關聯,例如button.save=保存; ② ㈢ 中用LookupDispatchAction代替就是:
<html:form action="/processUser" method="get">
<html:submit property=" method ">
<bean:message key=" button.create "/>
</html:submit>
<html:submit property=" method ">
<bean:message key=" button.save "/>
</html:submit>
</html:form>
② 在Action配置中多一個parametr屬性,屬性值與submit按鈕的property屬性值相同,這個屬性能夠指定執行LookupDispatchAction中對應的方法。
struts-config.xml 中:
<action path=" /processUser " type="examples.UserAction"
name="userForm"
scope="request"
parameter=" method ">
<forward name="createUser" path="/pages/listUser.jsp"/>
<forward name="saveUser" path="/pages/saveUser.jsp"/>
</action>
③
使UserAction繼承LookupDispatchAction,重寫getKeyMethodMap()方法, 將ResKey和MethodName對應起來, 以下:protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.create", "create");
map.put("button.save", "save");
return map;
}
注: DispatchAction 類使用請求參數的值肯定調用哪一種方法,而LookupDispatchAction類利用請求參數值,反向查詢資源綁定,並將它與類中的一種方法匹配,實際上這兩種方法有殊途同歸之處。
3 . MappingDispatchAction extends DispatchAction
DispatchAction 指定了parameter的值爲method,則頁面提交時咱們必須指定提交時action的method參數來肯定去咱們想要調用哪一個Action方法,而MappingDispatchAction直接經過struts-config.xml將多個action-mapping映射到同一個Action類的不一樣方法:
<action path="/createUser" type="examples.UserAction"
name="userForm"
scope="request"
parameter="create">
<forward name="createUser" path="/pages/listUser.jsp"/>
</action>
<action path="/saveUser" type="examples.UserAction"
name="userForm"
scope="request"
parameter="save">
<forward name="saveUser" path="/pages/saveUser.jsp"/>
</action>
而後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;
}
能夠看到它調用的方法是直接返回struts-config.xml中parameter的值。
4 . ForwardAction extends BaseAction
至關於<jsp:forward>功能,不須要配置formbean和action,能夠直接進行跳轉,只須要在struts-config.xml中配置:
<action path="/listUser"
type="org.apache.struts.actions.ForwardAction"
scope="request"
parameter="/pages/listUser.jsp">
</action>
parameter 屬性用於指定forward到哪一個頁面,path、type、parameter三個屬性爲必須,其餘可省略。
5 . IncludeAction extends BaseAction
至關於<jsp:include>功能,須要在struts-config.xml中配置:
<action path="/listUser" type="org.apache.struts.actions.IncludeAction"
name="userForm"
scope="request"
parameter="/pages/includepage.jsp">
</action>
版權全部:(xiaodaoxiaodao)藍小刀 xiaodaoxiaodao@gmail.com
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
String path = mapping.getPath();
String method = path.substring(path.lastIndexOf("/")+1);
return this.dispatchMethod(mapping,form,request,response,method);
}
}
在取String path = mapping.getPath();的時候,對於struts-config.xml中的action path="/createUser",必須在相應的Action類中定義一個與path值同名的createUser方法,使用上彷佛有些限制~~