23.JavaWeb基础 Struts 1 DispatchAction(分发Action)






一.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。不过过多代码展示,因为验证框架看起来方便,实际上非常不好用

        有时规定太死板,而导致程序开发困难;万一逻辑变化了,又要重新开始编写验证标准的代码。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值