DispatchAction
=======================
我自己认为DispatchAction可用可不用不过DispatchAction 确实提供了一些方便
下边简要对它的用法做一些说明
DispatchAction的作用简单地说就是把原来我们写在多个acton里的操作放在同一个
action里处理
举个例子就是如果在你的系统中有文章的管理操作那么通常有
以下操作添加文章察看文章搜索文章等等这样的话一般你会写
三个action[ArtilceSaveAction ArticleViewAction ArticleSearchAction ]分别处理各个操作
虽然说这样看起来是非常清晰流畅的操作但是你会发现在三个action理由太多的相同的东西
现在利用DispatchAction我们可以把相似的action放在一个action里操作
下面以上边的三个action和到一个action里为例
import ****;
import orgapachestrutsactionsDispatchAction;
public class ArticleAction extends DispatchAction{
/**
*AritcleAddAction
*/
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 {
}
}
好了该action的框架已经完成但是要想可用还要有一步不可少的操作
那就是更改你的action mapping 还以上边的例子如下
<action path=/article
input=/article/***jsp
parameter=method <!#####################>
scope=request
type=com***ArticleAction
validate=false>
<forward name=Success path=/article/***jsp redirect=true/>
</action>
看到上边你会发现它和我们通常的写法多个一项parameter=method这是有道理的并且非常重要
DispatchAction会根据具体的method值来确定调用addview 或者search
如下面的来自client的请求
articledo?method=add 则会触发添加文章的操作
以上只是根据一个简单的例子来分析DispatchAction实际应用的情况可能会更复杂
LookupDispatchAction
========================
orgapachestrutsactionsLookupDispatchActionjava
从名字大概我们也能看出LookupDispatchAction是DispatchAction的子类他们从功能上有许多相似的地方
下面还是以一个例子来简要的说明
通常它主要应用于在一个表单中有多个提交按钮而这些按钮又有一个共同的名字而这些按钮的名字要和具体的action mapping中的parameter的值对应[这点很重要]
如下代码截取自strutsconfigxml
<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=buttonview/>
</html:submit>
<html:submit property=action>
<bean:message key=buttondelete/>
</html:submit>
</html:form>
那么相应的ApplicationResourcesproperties中就会有如下片断
buttonview=View The Article
buttondelete=Delete The Atricle
此时还并为完成在LookupDispatchAction中有一个抽象方法
/**
*Provides the mapping from resource key to method name
*
*@returnResource key / method name map
*/
protected abstract Map getKeyMethodMap();
这个方法你应该在EditArticleAction中实现如下
protected Map getKeyMethodMap(){
Map map = new HashMap();
mapput(buttonview view);
mapput(buttondelete delete);
return map;
}
好了假设在你的EditArticleAction有如下方法
public ActionForward view(ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException ServletException {
//
//
return mappingfindForward(success);
}
public ActionForward delete(ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException ServletException {
//
//
return mappingfindForward(success);
}
下面实例几个假设client端的请求
此时页面有两个按钮按钮View The Article按钮Delete The Atricle
当提交按钮时调用EditArticleAction里的view方法
当提交按钮时调用EditArticleAction里的delete方法
以下还有一点说明
如果我有一个按钮要出发action的AA方法但是在该action没有AA方法此时将抛出异常如果该action中有两个AA方法则会调用第一个