学习Struts DispatchAction

一般我们都是一个表单根据不同的业务提交给不同的Action去处理。可是如果一个项目很大,那么我需要编写的Action就暴增了,这样容易发生混乱。如何才能使用一个Action来处理这些操作呢?那就需要DispatchAction了。
通常,一个Actio中只能完成一种业务操作,通过扩展org.apache.struts.actions.DispatchAction实现的Action类可以完成一组相关的几种业务操作。扩展自DispatchAction的Action类中不必定义execute方法,而是创建一些实现实际业务操作的方法,如doAdd()、doSubtract()等,但是这些业务方法的传入参数和返回值要和普通的Action中的execute方法相同。下面我们以一个简单的计算器为例来讲解。

JSP页面上我们编写这样的代码:

 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4.   <head>
  5.     <title>计算器</title>
  6.     <script type="text/javascript">
  7.         function changeSubmit(operate){
  8.             document.getElementById("operate").value = operate;
  9.         }
  10.     </script>
  11.   </head>
  12.   <body>
  13.     <form action="calc.do" method="post">
  14.     <input type="text" name="firstNumber"><br>
  15.     <input type="text" name="secondNumber"><br>
  16.     <input type="hidden" name="operate" id="operate">
  17.     <input type="submit" value="doAdd" onclick="changeSubmit(‘doAdd’)">
  18.     <input type="submit" value="doSubtract" onclick="changeSubmit(‘doSubtract’)">
  19.     <input type="submit" value="doMultiply" onclick="changeSubmit(‘doMultiply’)">
  20.     <input type="submit" value="doDivide" onclick="changeSubmit(‘doDivide’)">
  21.     </form>
  22.   </body>
  23. </html>

而处理这些请求的Action的代码如下:

 
  1. /*
  2.  * Generated by MyEclipse Struts
  3.  * Template path: templates/java/JavaClass.vtl
  4.  */
  5. package cn.ineeke.struts.action;
  6.  
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import org.apache.struts.action.ActionForm;
  11. import org.apache.struts.action.ActionMapping;
  12. import org.apache.struts.actions.DispatchAction;
  13.  
  14. import cn.ineeke.struts.form.CalcForm;
  15.  
  16. /** 
  17.  * MyEclipse Struts
  18.  * Creation date: 12-03-2008
  19.  * 
  20.  * XDoclet definition:
  21.  * @struts.action path="/calc" name="CalcForm" parameter="operate" scope="requ
    est"
  22.  * @author Neeke http://www.ineeke.com
  23.  */
  24. public class CalcAction extends DispatchAction {
  25.  
  26.     public void doAdd(ActionMapping mapping, ActionForm form,
  27.             HttpServletRequest request, HttpServletResponse response)
  28.             throws Exception {
  29.         CalcForm calcForm = (CalcForm)form;
  30.         System.out.println(calcForm.getFirstNumber()+calcForm.getSecondNumber());
  31.     }
  32.     public void doSubtract(ActionMapping mapping, ActionForm form,
  33.             HttpServletRequest request, HttpServletResponse response)
  34.     throws Exception {
  35.         CalcForm calcForm = (CalcForm)form;
  36.         System.out.println(calcForm.getFirstNumber()-calcForm.getSecondNumber());
  37.     }
  38.     public void doMultiply(ActionMapping mapping, ActionForm form,
  39.             HttpServletRequest request, HttpServletResponse response)
  40.     throws Exception {
  41.         CalcForm calcForm = (CalcForm)form;
  42.         System.out.println(calcForm.getFirstNumber()*calcForm.getSecondNumber());
  43.     }
  44.     public void doDivide(ActionMapping mapping, ActionForm form,
  45.             HttpServletRequest request, HttpServletResponse response)
  46.     throws Exception {
  47.         CalcForm calcForm = (CalcForm)form;
  48.         System.out.println(calcForm.getFirstNumber()/calcForm.getSecondNumber());
  49.     }
  50.     
  51. }

 

接下来具体分析。首先定义CalcAction继承自DispatchAction。正如上面所说的,这里没有execute方法,而是直接定义相关业务操作的方法,CalcAction的配置如下:

 
  1. <action-mappings >
  2.     <action
  3.       attribute="CalcForm"
  4.       name="CalcForm"
  5.       parameter="operate"
  6.       path="/calc"
  7.       scope="request"
  8.       type="cn.ineeke.struts.action.CalcAction"
  9.       validate="false" />
  10. </action-mappings>

与普通的Action唯一不同之处就是多了一个parameter属性。这个属性告诉Struts从请求对象中找名称为operate的参数值,参数值是什么就到CalcAction中执行与之同名的方法。在表单提交时,使用JavaScript将隐藏表单域operate的值修改为想要执行的CalcAction中的方法名。
最后,在DispatchAction中,方法名的前缀也常常遵循一定的规则:转到编辑页面的方法常命名为toEdit;执行编辑操作的方法常命名为doEdit;以此类推。通过这样的命名、可以使程序逻辑更清晰,减少出错几率。


除非另有声明,本站遵循【署名-非商业性使用-相同方式共享 3.0 共享协议】授权。

转载原创文章请注明,转载自:Neeke[http://www.ineeke.com]

本文链接: http://www.ineeke.com/archives/XueXiStrutsDispatchAction/

2008年12月5日 | 归档于 J2EE技术 | 1 条评论
  1. kiis
    2008年12月6日 15:35 | #1

    这方法不错!~~不过我还是刚接触struts觉得这个有点深!

    Gravatar头像neeke 于 2008-12-6 19:58:32 回复

    我也是刚接触,正自学呢。

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">
n:-zy n:-zr n:-zan n:-xf n:-wx n:-tz n:-tt n:-ts n:-sy n:-st n:-ss n:-sk n:-qd n:-pz n:-lh n:-kun n:-ku n:-hx n:-hd n:-gt n:-gg n:-bz

NOTICE: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!