学习Struts DispatchAction
一般我们都是一个表单根据不同的业务提交给不同的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" onclick="changeSubmit(‘doAdd’)">
- <input type="submit" value="doSubtract" onclick="changeSubmit(‘doSubtract’)">
- <input type="submit" value="doMultiply" onclick="changeSubmit(‘doMultiply’)">
- <input type="submit" value="doDivide" onclick="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="requ
est" - * @author Neeke http://www.ineeke.com
- */
- 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唯一不同之处就是多了一个parameter属性。这个属性告诉Struts从请求对象中找名称为operate的参数值,参数值是什么就到CalcAction中执行与之同名的方法。在表单提交时,使用JavaScript将隐藏表单域operate的值修改为想要执行的CalcAction中的方法名。
最后,在DispatchAction中,方法名的前缀也常常遵循一定的规则:转到编辑页面的方法常命名为toEdit;执行编辑操作的方法常命名为doEdit;以此类推。通过这样的命名、可以使程序逻辑更清晰,减少出错几率。
除非另有声明,本站遵循【署名-非商业性使用-相同方式共享 3.0 共享协议】授权。
转载原创文章请注明,转载自:Neeke[http://www.ineeke.com]
本文链接: http://www.ineeke.com/archives/XueXiStrutsDispatchAction/

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