相信用过Struts框架的朋友应该都知道有个叫DispatchAction的东西,主要是用来解决因Action过多而导致代码文件膨胀的。
DispatchAction 是Struts1中的一个类,它的父类是Action ,它的作用就在于将多个功能相似的业务逻辑放在同一个Action 中实现,各个业务逻辑通过传入不同的参数来决定执行哪个操作方法。
看一看 DispatchAction 是如何实现的.
例如:下面的例子。按照struts的流程来分析,JSP–>ActionServlet–>struts-config.xml–>Action–>ActionForward–>browser
1.JSP页面提交表单到ActionServlet,ActionServlet截取URL,然后根据struts-config.xml配置文件去找相应的Action,执行相应的操作(这里Action只有一个即UserAction,如何区别是何种操作?—根据方法名来找到不同的操作。)颜色相同一定要匹配。
action=”/user/main.do?flag=add”;
action=”/user/main.do?flag=del”;
action=”/user/main.do?flag=modify”;
2.UserAction继承于DispatchAction,包含了三个操作方法,分别是add(),del(),modify(),方法名称与form表单传递的属性一一对应
1 2 3 4 5 6 7 8 9 10 11 | public class UserAction extends DispatchAction { public ActionForward add(mapping, form, request, response) throws Exception { return mapping.findForward("add_success"); } public ActionForward del(mapping, form, request, response) throws Exception { return mapping.findForward("del_success"); } public ActionForward modify(mapping, form, request, response) throws Exception { return mapping.findForward("modify_success"); } } |
3.struts-config.xml中,parameter的属性值是可以任意起的,即command可以是其他。只要保证form表单中传参数时与之统一就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <action-mappings> <action path=”/user/main” type=”com.lpq.action.UserAction” name=”userForm” scope=”request” parameter=”flag” > <forward name=”add_success” path=”/user/main.do?flag=list” redirect=”true”/> <forward name=”del_success” path=”/user/main.do?flag=list” redirect=”true”/> <forward name=”modify_success” path=”/user/main.do?flag=list” redirect=”true”/> <forward name=”list_success” path=”/user/userlist.jsp”/> <forward name=”find_success” path=”/user/usermodify.jsp”/> </action> </action-mappings> |
这里的forward有的是直接提交到一个JSP页面,有的是提交到另一个动作。forward中name值和UserAction中findForward匹配。
注:1.DispatchAction中各个操作方法的参数如add(),del(),modify()和execute()方法的参数相同。
2.DispatchAction通过方法名来区别各个不同的操作。
3.在调用DispatchAction的时候command参数是不能为空的,如果空,DispatchAction会调用unspecified方法并抛出异常。
4.UserAction 可以复写execute方法,但复写完成之后必须显示调用它的上层实现DispatchAction.execute()
除非注明,Coder文章均为原创,转载请以链接形式标明本文地址