一个Action来处理多操作

 

一般我们都是一个表单根据不同的业务提交给不同的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" οnclick="changeSubmit('doAdd')">
  18.     <input type="submit" value="doSubtract" οnclick="changeSubmit('doSubtract')">
  19.     <input type="submit" value="doMultiply" οnclick="changeSubmit('doMultiply')">
  20.     <input type="submit" value="doDivide" οnclick="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. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.struts.action.ActionForm;
  9. import org.apache.struts.action.ActionMapping;
  10. import org.apache.struts.actions.DispatchAction;
  11. import cn.ineeke.struts.form.CalcForm;
  12. /** 
  13.  * MyEclipse Struts
  14.  * Creation date: 12-03-2008
  15.  * 
  16.  * XDoclet definition:
  17.  * @struts.action path="/calc" name="CalcForm" parameter="operate" scope="request"
  18.  * @author Neeke http://www.ineeke.cn
  19.  */
  20. public class CalcAction extends DispatchAction {
  21.     public void doAdd(ActionMapping mapping, ActionForm form,
  22.             HttpServletRequest request, HttpServletResponse response)
  23.             throws Exception {
  24.         CalcForm calcForm = (CalcForm)form;
  25.         System.out.println(calcForm.getFirstNumber()+calcForm.getSecondNumber());
  26.     }
  27.     public void doSubtract(ActionMapping mapping, ActionForm form,
  28.             HttpServletRequest request, HttpServletResponse response)
  29.     throws Exception {
  30.         CalcForm calcForm = (CalcForm)form;
  31.         System.out.println(calcForm.getFirstNumber()-calcForm.getSecondNumber());
  32.     }
  33.     public void doMultiply(ActionMapping mapping, ActionForm form,
  34.             HttpServletRequest request, HttpServletResponse response)
  35.     throws Exception {
  36.         CalcForm calcForm = (CalcForm)form;
  37.         System.out.println(calcForm.getFirstNumber()*calcForm.getSecondNumber());
  38.     }
  39.     public void doDivide(ActionMapping mapping, ActionForm form,
  40.             HttpServletRequest request, HttpServletResponse response)
  41.     throws Exception {
  42.         CalcForm calcForm = (CalcForm)form;
  43.         System.out.println(calcForm.getFirstNumber()/calcForm.getSecondNumber());
  44.     }
  45.     
  46. }

 

接下来具体分析。首先定义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;以此类推。通过这样的命名、可以使程序逻辑更清晰,减少出错几率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值