一.DispatchAction简介
在原始的Struts开发中,一个Action中只包含一个execute()方法,但是如果此时的
项目很大,会有多个业务类型的Action出现(增、删、改、查),会造成后期的维护困难,所
以在Struts中为了解决这样的问题,专门增加了一个DispatchAction类,此类继承Action
类,并且完成分发的处理操作。
分发Action的使用与普通Action类似,仍然要被一个类所继承,并且根据要求覆写方法。唯
一不同的是,此时的方法可以有多个,而且这多个方法分别表示着不同的操作。
二.实现DispatchAction
si.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>si.jsp</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <jsp:forward page="emp.do?status=a"></jsp:forward> </body> </html>
OperateAction.java:
package com.zyy.struts.action; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; /** * 集成DispatchAction的类中,不要覆写execute()方法 不然其他的分发方法存在的话,会出现异常 * * @author CaMnter * */ public class OperateAction extends DispatchAction { public ActionForward a(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("***** a *****"); RequestDispatcher rd = request.getRequestDispatcher("emp.do?status=b"); rd.forward(request, response); return null; } public ActionForward b(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("***** b *****"); RequestDispatcher rd = request.getRequestDispatcher("emp.do?status=c"); rd.forward(request, response); return null; } public ActionForward c(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("***** c *****"); return null; } }
struts-config.xml:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> </form-beans> <global-exceptions> </global-exceptions> <global-forwards> </global-forwards> <action-mappings> <action path="/jsp/emp" input="/jsp/si.jsp" parameter="status" scope="request" type="com.zyy.struts.action.OperateAction"> </action> </action-mappings> <message-resources parameter="resource.MessageResources" /> </struts-config>
在action节点中设置属性parameter="status",是要求执行/jsp/emp.do的时候要传
入参数status=xxx ,否则报错。
这里,我采用了<jsp:forward>服务器跳转并传入参数status=a,此时从配置文件Action节
点中找到对应的path。再从type中找到OperateAction,接着根据参数status=a,找到对应
的a()执行方法。我又在a()和b()方法中利用了RequestDispatcher对象的forward()方法进
行服务器端跳转(request.getRequestDispatcher("emp.do?status=b")和request.
getRequestDispatcher("emp.do?status=b")),是为了执行a、b、c三个方法。
三.Struts 1 的其他功能
动态ActionForm:目的为了解决ActionForm过多的问题,原理就是:在配置文件中配置动态
ActionForm,然后在Action中建立动态ActionForm对象接受参数,实质
上就是少建议一个***Form的类,然后在对应的Action中通过手写代码的方式
建立ActionForm,从而达到动态的效果,但本质上没有解决ActionForm过多
的问题,所以不做多讲。
验证框架:通过建立配置文件validator-rules.xml。在此文件中自定义了验证的标准,可以从St
ruts的jar包中src/core/src/main/resources/org/apache/struts/validator
/validator-rules.xml。不过过多代码展示,因为验证框架看起来方便,实际上非常不好用
有时规定太死板,而导致程序开发困难;万一逻辑变化了,又要重新开始编写验证标准的代码。