DispatchAction是Struts包含的另一个能大量节省开发时间的Action类。
与其它Action类仅提供单个execute()方法实现单个业务不同,DispatchAction允许你在单个Action类中编写多个与业务相关的方法。
这样可以减少Action类的数量,并且把相关的业务方法集合在一起使得维护起来更容易。
要使用DispatchAction的功能,需要自己创建一个类,通过继承抽象的DispatchAction得到。
对每个要提供的业务方法必须有特定的方法标识即识别标志。
本文将着重来理解下org.apache.struts.actions.DispatchAction类。
在有些时候一个Action可能有多种操作,比如查询,增加,删除等,都集中在了一个Action中,每个操作都会被封装在一个独立的方法中,此时需要使用某个变量来区分Action接收到的请求需要执行哪个操作,根据操作类型再去调用相应的方法。
DispatchAction类
DispatchAction类为我们实现了这个根据请求动态的分发业务给不同的方法。
比如某个Action地址为”hello.do”,当访问”hello.do?method=add”时,将调用Action类中的add方法;访问”hello.do?method=show”时,将调用Action类中show方法。
这里的请求路径参数”?method=add”,
前者参数名”method”需要在struts-config.xml配置文件中的action元素中使用parameter属性定义,
后者参数值对应着Action类中的同名方法。
我们需要将自己的Action继承DispatchAction类,DispacthAction类又是继承Action类的。然后需要声明自己的业务处理方法,
public class HelloAction extends DispatchAction { public ActionForward add (ActionMapping mapping , ActionForm form , HttpServletRequest request , HttpServletResponse response) { System.out.println("HelloAction.add()"); return null; } public ActionForward show (ActionMapping mapping , ActionForm form , HttpServletRequest request , HttpServletResponse response) { System.out.println("HelloAction.show()"); return null; } }
这里需要注意的是,自定义的业务处理方法的格式为:
public ActionForward methodName (ActionMapping mapping , ActionForm form , HttpServletRequest request , HttpServletResponse response)
{
…
}
方法的返回类型与方法参数都是固定的,方法名可以自定义。
对应的struts-config.xml文件中action元素:
<action attribute="helloForm" input="/index.jsp" name="helloForm" path="/hello" scope="request" type="com.yourcompany.struts.action.HelloAction" cancellable="yes" parameter="method" />
最后一个parameter属性是关键。
当访问 “/hello.do?method=add”时,将调用add方法,输出”HelloAction.add()”
当访问”/hello.do?method=show”时,将调用show方法,输出”HelloAction.show()”