dispatchAction的主要作用就是把几个Action里面的内容写到一个Action里面,因为对于处理同一个事务而言,几个Action有很多代码都是相同的,所以浪费了时间和精力.但是个人认为在某些思想上不是很好,因为这个有点违反了代码中的耦合(不知道是耦合还是内聚).
最主要的是用法:譬如操作一张表,可能有增加,修改,删除等操作,本来是写三个Action去解决问题,现在只写到一个Action里面就好了.
譬如:
public class editSpecdomInfoAction extends DispatchAction{
public ActionForward add(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
...
}
/**
*AritcleViewAction
*/
public ActionForward view(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
...
}
/**
*AritcleSearchAction
*/
public ActionForward search(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
...
}
}
在config中,按下面配置s
<action path="/specdom"
input="/specdom/***.jsp"
parameter="method" <!--#####################-->
scope="request"
type="com.***.ArticleAction"
validate="false">
<forward name="Success" path="/article/***.jsp" redirect="true"/>
</action>
其中比正常的配置多出一个属性,parameter="method",在使用的时候,/specdom.do?method="add"就会触发添加的操作
org.apache.struts.actions.LookupDispatchAction.java
从名字大概我们也能看出LookupDispatchAction是DispatchAction的子类。他们从功能上有许多相似
的地方。
下面还是以一个例子来简要的说明:
通常它主要应用于“在一个表单中有多个提交按钮而这些按钮又有一个共同的名字”,而这些按钮的名字要和具体的action mapping中的parameter的值对应。[这点很重要]
如下代码截取自struts-config.xml:
<action path="/editArticle"
type="com.****.EditArticleAction"
name="AtricleForm"
scope="request"
parameter="action"><!--按钮的名字此处为“action”-->
<forward name="success" path="/***.jsp"/>
</action>
下面给出一个jsp页面的表单部分
<html:form action="/editArticle"/>
<html:submit property="action">
<bean:message key="button.view"/>
</html:submit>
<html:submit property="action">
<bean:message key="button.delete"/>
</html:submit>
</html:form>
那么相应的ApplicationResources.properties中就会有如下片断:
button.view=View The Article
button.delete=Delete The Atricle
此时还并为完成,在LookupDispatchAction中有一个抽象方法:
/**
* Provides the mapping from resource key to method name
*
*@return Resource key / method name map
*/
protected abstract Map getKeyMethodMap();
这个方法你应该在EditArticleAction中实现,如下:
protected Map getKeyMethodMap(){
Map map = new HashMap();
map.put("button.view", "view");
map.put("button.delete", "delete");
return map;
}
好了,假设在你的EditArticleAction有如下方法:
public ActionForward view(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
//......
//......
return mapping.findForward("success");
}
public ActionForward delete(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
//......
//......
return mapping.findForward("success");
}
下面实例几个假设client端的请求:
http://....../editArticle.do此时页面有两个按钮,按钮1“View The Article”,"",按钮2“Delete The Atricle”
当提交按钮1时调用EditArticleAction里的view方法;
当提交按钮2时调用EditArticleAction里的delete方法;
以下还有一点说明;
需要注意的是:在调用DispatchAction的时候method参数是不能为空的,如果空,DispatchAction会调用unspecified方法并抛出异常。
如果我有一个按钮要调用action的AA方法,但是在该action没有AA方法,此时将抛出异常;如果该action中有两个AA方法,则会调用第一个
[align=left][/align]