`
weigang.gao
  • 浏览: 482301 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用DispatchAction类调用多个Action方法

 
阅读更多

        在DispatchAction的子类中定义多个Action,通过operation参数指定调用哪一个方法。如果operation是空字符串或是execute,那么就调用默认的方法unspecificed方法.

     

public class ProductAction extends DispatchAction{
	/**
	 * 在Action类中有一个特殊的方法:execute。如果调用了这个方法,将会出现递归调用的情况
	 *1.如果访问的是execute方法,将name设置成null,访问默认的方法unspecified
	 *2.在没找到对应的方法的情况下,也将name设置成null,调用unspecified
	 * 
	 */
	protected ActionForward dispatchMethod(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response, String name) throws Exception {
		System.out.println("dispatchMethod..........................................");
		System.out.println(name);
		ActionForward af = null;
		if("".equals(name)||"execute".equals(name)){
			name = null;
		}
		try {
			af = super.dispatchMethod(mapping, form, request, response, name);
		} catch (Exception e) {//如果没找到对应的方法,会报错
			name = null;//name设置成null,就是找默认的方法
			af = super.dispatchMethod(mapping, form, request, response, name);
		}
		
		
		return af;
	}
	/**
	 * 当指定的Action不存在时,调用这个action
	 */
	@Override
	protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		System.out.println("unspecified.........................................");
		return null;
	}
	
//	@Override
//	public ActionForward execute(ActionMapping mapping, ActionForm form,
//			HttpServletRequest request, HttpServletResponse response)
//			throws Exception {
//		// TODO Auto-generated method stub
//		System.out.println("execute.......................................");
//		return null;
//	}

	/**test:
	 * 1.在有execute的方法前提下,会调用execute,在没有exectute的时候,才可以调用别的
	 * 2.struts会先找execute方法,没如果找不到execute才会根据传参找对应方法
	 * 
	 */
	/*
	 * 根据商品名称 查询商品信息
	 */
	public ActionForward queryProductInfobyName(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		System.out.println("query product info ................................");
		return null;
	}
	
	/*
	 * 录入商品信息
	 * @throws Exception
	 */
	public ActionForward insertProductInfo(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("insert productInfo.................................");
		return null;
	}
}

 

2. 在struts-config.xml文件中加入如下的配置代码来配置ProductAction 

<action path="/product" type="action.productAction" parameter="operation"/>

 

3.通过如下方式调用指定的方法

http://localhost:8080/struts1_20140801/product.do?operation=execute  调用默认的方式unspecificed

 

虽然上面的代码可以很好地调用相应的Action方法,但在一些情况时,如请求参数operation指定的Action方法不存在时,就会抛出异常。那么如果我们想在非正常情况下都调用默认的处理Action动作的方法(也就是unspecificed方法)该怎么办呢?

实现上,实现这个功能也非常简单,只要我们知道在什么条件下调用unspecified方法,然后在非正常情况下,都将条件设为调用unspecified方法的条件就可实现这个功能。在查看DispatchAction类的源代码后,可找到如下的代码片段:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->if (name == null)   // name表示Action方法名
{
    return this.unspecified(mapping, form, request, response);
}

 

从上面的代码可知,只有当namenull时才会调用unspecified方法。这个name值实际上也就是operation参数的值。也就是说,只有当operation参数不存在时,name才会为null。如果在operation的参数值所指的Action方法不存在时或者name为空串的情况下都将name设为null,那么就可以达到我们的目的。

DispatchAction类中有一个dispatchMethod方法,可以在这个方法中处理请求参数值为空串(也就是当“language=”时将方法名设为null)和Action方法未找到的情况。在Action类中有一个特殊方法:execute。如果调用了这两个方法,将会出现递归调用的情况。因此,在调用这两个方法时也需要将方法名name设为null

 

 

 

/**
	 * 在Action类中有一个特殊的方法:execute。如果调用了这个方法,将会出现递归调用的情况
	 *1.如果访问的是execute方法,将name设置成null,访问默认的方法unspecified
	 *2.在没找到对应的方法的情况下,也将name设置成null,调用unspecified
	 * 
	 */
	protected ActionForward dispatchMethod(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response, String name) throws Exception {
		System.out.println("dispatchMethod..........................................");
		System.out.println(name);
		ActionForward af = null;
		if("".equals(name)||"execute".equals(name)){
			name = null;
		}
		try {
			af = super.dispatchMethod(mapping, form, request, response, name);
		} catch (Exception e) {//如果没找到对应的方法,会报错
			name = null;//name设置成null,就是找默认的方法
			af = super.dispatchMethod(mapping, form, request, response, name);
		}
		
		
		return af;
	}

 

分享到:
评论

相关推荐

    Struts中等同于DispatchAction类方法

    总结来说,"Struts中等同于DispatchAction类方法"是一种在不直接使用`DispatchAction`基类的情况下,通过前端传递方法名并在后端使用反射调用相应方法的技术,以实现多请求映射到单个Action类的多个方法。...

    struts中dispatchAction用法

    DispatchAction是Struts提供的一个可扩展的Action类,它允许开发者将一个单一的Action类拆分成多个子方法,每个子方法处理特定的业务逻辑,从而提高了代码的组织性和可维护性。 DispatchAction的工作原理是通过...

    DispatchAction

    它的主要功能是将一个HTTP请求路由到多个方法,而不是只调用一个单一的方法来处理所有的请求。`DispatchAction`通过请求参数(通常是请求URL中的动作名称或表单提交的参数)来决定调用哪个方法。例如,如果请求参数...

    DispatchAction实例

    在Struts框架中,`DispatchAction`是一个非常重要的组件,它是Struts提供的一个扩展自`Action`类的抽象类,主要用于处理多个请求方法的情况。在实际的Web应用程序开发中,通常一个URL对应一个Action,而`...

    struts DispatchAction

    总之,Struts DispatchAction是Java Web开发中一种有效的请求分发机制,它允许在一个Action类中组织和管理多个业务处理方法,提高了代码的可读性和可维护性。然而,随着技术的发展,如Struts2的出现,开发者可以选择...

    struts+oracle实现DispatchAction类

    默认情况下,Struts的Action只有一个execute方法,但`DispatchAction`允许我们将请求映射到多个方法,每个方法对应不同的业务操作。这样可以使得代码结构更加清晰,易于维护。 配置`DispatchAction`通常需要在...

    DispatchAction、LookupDispatchAction、SwitchAction的应用

    其核心作用是允许将多个原本需要独立 Action 处理的任务合并到一个 Action 中进行处理,从而简化了 Action 的管理和维护工作。 **1.1 为什么要使用 DispatchAction** 在传统的 Struts 应用中,每一个业务逻辑操作...

    J2EE_高级Action

    - 创建一个继承自`DispatchAction`的类,并为其添加多个处理方法,这些方法可以根据不同的请求参数(例如`method`)被调用。 - 在JSP页面中使用`&lt;s:form&gt;`标签,并通过`&lt;s:url&gt;`设置`method`属性为具体的处理方法名...

    利用struts标签,dispatchAction,实现增删改查

    - **实现Action类**:在对应的Action类中,我们定义多个方法,如`executeAdd()`, `executeDelete()`等,分别对应不同的操作。 - **处理请求**:DispatchAction会自动根据请求参数(如`operation=add`)选择合适的...

    Action使用说明

    如果希望在保持每个请求路径对应一个`&lt;action&gt;`元素的同时,又能够在一个Action类中处理多个请求路径,可以选择继承`MappingDispatchAction`。 **配置示例**: ```xml &lt;action path="/mapping/login" type=...

    struts LookupdispathAction类使用实例

    - 如果有多个方法具有相同的方法名,那么需要通过其他方式(如包命名)来避免冲突。 总之,`LookupDispatchAction` 是 Struts 框架中一个强大的工具,它简化了请求到方法的映射,使得应用程序的架构更加清晰。通过...

    struts1.2实现计算器示例

    1. **Action类**:这是`DispatchAction`的子类,包含了多个处理不同计算操作的方法,如加法、减法、乘法和除法。每个方法处理特定的计算请求,然后将结果存储在`ActionForm`对象中,供视图层使用。 2. **ActionForm...

    深入解析Java的Struts框架中的控制器DispatchAction

    DispatchAction是Struts提供的一个扩展Action类,它允许在一个Action类中实现多个业务处理方法,从而解决了创建大量Action类的问题。通常,一个Action类只有一个execute()方法,但通过DispatchAction,我们可以根据...

    EventDispatchAction类处理一个form多个submit

    ### EventDispatchAction类处理一个form多个submit #### 一、背景与概述 在Web应用程序开发过程中,表单的提交操作是非常常见的场景之一。对于复杂的业务逻辑而言,有时我们需要在一个表单中提供多个提交按钮,...

    Struts之进阶篇.pdf

    DispatchAction是Struts框架中的一个重要组件,它允许一个Action映射到多个业务方法,而无需为每个方法创建新的Action类。这不仅减少了Action类的数量,还使得共享公共业务逻辑变得更容易。 #### 2. 实现步骤 要...

    LookupDispatchAction 是使用方法

    默认情况下,Struts1的动作类只有一个`execute()`方法,但使用`LookupDispatchAction`时,可以定义多个处理特定请求的方法,每个方法对应一个特定的请求参数。 二、配置与使用 1. 配置struts-config.xml 首先,需要...

    速动画教程系列第13集

    1. **DispatchAction的工作原理**:DispatchAction内部有一个或多个方法,每个方法对应一个特定的操作。这些方法通常以`executeXXX`的形式命名,其中`XXX`代表一个特定的请求标识。当请求到达时,DispatchAction会...

    struts_dispacthaction_usermgr

    在Struts 1.x时代,它提供了一种方式来在一个Action类中定义多个处理不同请求的方法,从而提高了代码的组织性和可维护性。这篇博客文章可能是探讨如何使用DispatchAction实现用户管理功能的教程。 首先,我们来理解...

Global site tag (gtag.js) - Google Analytics