dispatchAction和lookupDispatchAction

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]

你可能感兴趣的:(apache,jsp,xml,struts)