一般我们都是一个表单根据不同的业务提交给不同的Action去处理。可是如果一个项目很大,那么我需要编写的Action就暴增了,这样容易发生混乱。如何才能使用一个Action来处理这些操作呢?那就需要DispatchAction了。
通常,一个Actio中只能完成一种业务操作,通过扩展org.apache.struts.actions.DispatchAction实现的Action类可以完成一组相关的几种业务操作。扩展自DispatchAction的Action类中不必定义execute方法,而是创建一些实现实际业务操作的方法,如doAdd()、doSubtract()等,但是这些业务方法的传入参数和返回值要和普通的Action中的execute方法相同。下面我们以一个简单的计算器为例来讲解。
JSP页面上我们编写这样的代码:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>计算器</title>
- <script type="text/javascript">
- function changeSubmit(operate){
- document.getElementById("operate").value = operate;
- }
- </script>
- </head>
- <body>
- <form action="calc.do" method="post">
- <input type="text" name="firstNumber"><br>
- <input type="text" name="secondNumber"><br>
- <input type="hidden" name="operate" id="operate">
- <input type="submit" value="doAdd" οnclick="changeSubmit('doAdd')">
- <input type="submit" value="doSubtract" οnclick="changeSubmit('doSubtract')">
- <input type="submit" value="doMultiply" οnclick="changeSubmit('doMultiply')">
- <input type="submit" value="doDivide" οnclick="changeSubmit('doDivide')">
- </form>
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>计算器</title> <script type="text/javascript"> function changeSubmit(operate){ document.getElementById("operate").value = operate; } </script> </head> <body> <form action="calc.do" method="post"> <input type="text" name="firstNumber"><br> <input type="text" name="secondNumber"><br> <input type="hidden" name="operate" id="operate"> <input type="submit" value="doAdd" οnclick="changeSubmit('doAdd')"> <input type="submit" value="doSubtract" οnclick="changeSubmit('doSubtract')"> <input type="submit" value="doMultiply" οnclick="changeSubmit('doMultiply')"> <input type="submit" value="doDivide" οnclick="changeSubmit('doDivide')"> </form> </body></html>
而处理这些请求的Action的代码如下:
- /*
- * Generated by MyEclipse Struts
- * Template path: templates/java/JavaClass.vtl
- */
- package cn.ineeke.struts.action;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.actions.DispatchAction;
- import cn.ineeke.struts.form.CalcForm;
- /**
- * MyEclipse Struts
- * Creation date: 12-03-2008
- *
- * XDoclet definition:
- * @struts.action path="/calc" name="CalcForm" parameter="operate" scope="request"
- * @author Neeke http://www.ineeke.cn
- */
- public class CalcAction extends DispatchAction {
- public void doAdd(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()+calcForm.getSecondNumber());
- }
- public void doSubtract(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()-calcForm.getSecondNumber());
- }
- public void doMultiply(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()*calcForm.getSecondNumber());
- }
- public void doDivide(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()/calcForm.getSecondNumber());
- }
- }
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */package cn.ineeke.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import cn.ineeke.struts.form.CalcForm;/** * MyEclipse Struts * Creation date: 12-03-2008 * * XDoclet definition: * @struts.action path="/calc" name="CalcForm" parameter="operate" scope="request" * @author Neeke http://www.ineeke.cn */public class CalcAction extends DispatchAction { public void doAdd(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()+calcForm.getSecondNumber()); } public void doSubtract(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()-calcForm.getSecondNumber()); } public void doMultiply(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()*calcForm.getSecondNumber()); } public void doDivide(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()/calcForm.getSecondNumber()); } }
接下来具体分析。首先定义CalcAction继承自DispatchAction。正如上面所说的,这里没有execute方法,而是直接定义相关业务操作的方法,CalcAction的配置如下:
- <action-mappings >
- <action
- attribute="CalcForm"
- name="CalcForm"
- parameter="operate"
- path="/calc"
- scope="request"
- type="cn.ineeke.struts.action.CalcAction"
- validate="false" />
- </action-mappings>
<action-mappings > <action attribute="CalcForm" name="CalcForm" parameter="operate" path="/calc" scope="request" type="cn.ineeke.struts.action.CalcAction" validate="false" /></action-mappings>
与普通的Action唯一不同之处就是多了一个parameter属性。这个属性告诉Struts从请求对象中找名称为operate的参数值,参数值是什么就到CalcAction中执行与之同名的方法。在表单提交时,使用JavaScript将隐藏表单域operate的值修改为想要执行的CalcAction中的方法名。
最后,在DispatchAction中,方法名的前缀也常常遵循一定的规则:转到编辑页面的方法常命名为toEdit;执行编辑操作的方法常命名为doEdit;以此类推。通过这样的命名、可以使程序逻辑更清晰,减少出错几率。