一.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。不过过多代码展示,因为验证框架看起来方便,实际上非常不好用
有时规定太死板,而导致程序开发困难;万一逻辑变化了,又要重新开始编写验证标准的代码。