在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类的源代码后,可找到如下的代码片段:
{
return this.unspecified(mapping, form, request, response);
}
从上面的代码可知,只有当name为null时才会调用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类方法"是一种在不直接使用`DispatchAction`基类的情况下,通过前端传递方法名并在后端使用反射调用相应方法的技术,以实现多请求映射到单个Action类的多个方法。...
DispatchAction是Struts提供的一个可扩展的Action类,它允许开发者将一个单一的Action类拆分成多个子方法,每个子方法处理特定的业务逻辑,从而提高了代码的组织性和可维护性。 DispatchAction的工作原理是通过...
它的主要功能是将一个HTTP请求路由到多个方法,而不是只调用一个单一的方法来处理所有的请求。`DispatchAction`通过请求参数(通常是请求URL中的动作名称或表单提交的参数)来决定调用哪个方法。例如,如果请求参数...
在Struts框架中,`DispatchAction`是一个非常重要的组件,它是Struts提供的一个扩展自`Action`类的抽象类,主要用于处理多个请求方法的情况。在实际的Web应用程序开发中,通常一个URL对应一个Action,而`...
总之,Struts DispatchAction是Java Web开发中一种有效的请求分发机制,它允许在一个Action类中组织和管理多个业务处理方法,提高了代码的可读性和可维护性。然而,随着技术的发展,如Struts2的出现,开发者可以选择...
默认情况下,Struts的Action只有一个execute方法,但`DispatchAction`允许我们将请求映射到多个方法,每个方法对应不同的业务操作。这样可以使得代码结构更加清晰,易于维护。 配置`DispatchAction`通常需要在...
其核心作用是允许将多个原本需要独立 Action 处理的任务合并到一个 Action 中进行处理,从而简化了 Action 的管理和维护工作。 **1.1 为什么要使用 DispatchAction** 在传统的 Struts 应用中,每一个业务逻辑操作...
- 创建一个继承自`DispatchAction`的类,并为其添加多个处理方法,这些方法可以根据不同的请求参数(例如`method`)被调用。 - 在JSP页面中使用`<s:form>`标签,并通过`<s:url>`设置`method`属性为具体的处理方法名...
- **实现Action类**:在对应的Action类中,我们定义多个方法,如`executeAdd()`, `executeDelete()`等,分别对应不同的操作。 - **处理请求**:DispatchAction会自动根据请求参数(如`operation=add`)选择合适的...
如果希望在保持每个请求路径对应一个`<action>`元素的同时,又能够在一个Action类中处理多个请求路径,可以选择继承`MappingDispatchAction`。 **配置示例**: ```xml <action path="/mapping/login" type=...
- 如果有多个方法具有相同的方法名,那么需要通过其他方式(如包命名)来避免冲突。 总之,`LookupDispatchAction` 是 Struts 框架中一个强大的工具,它简化了请求到方法的映射,使得应用程序的架构更加清晰。通过...
1. **Action类**:这是`DispatchAction`的子类,包含了多个处理不同计算操作的方法,如加法、减法、乘法和除法。每个方法处理特定的计算请求,然后将结果存储在`ActionForm`对象中,供视图层使用。 2. **ActionForm...
### EventDispatchAction类处理一个form多个submit #### 一、背景与概述 在Web应用程序开发过程中,表单的提交操作是非常常见的场景之一。对于复杂的业务逻辑而言,有时我们需要在一个表单中提供多个提交按钮,...
DispatchAction是Struts框架中的一个重要组件,它允许一个Action映射到多个业务方法,而无需为每个方法创建新的Action类。这不仅减少了Action类的数量,还使得共享公共业务逻辑变得更容易。 #### 2. 实现步骤 要...
默认情况下,Struts1的动作类只有一个`execute()`方法,但使用`LookupDispatchAction`时,可以定义多个处理特定请求的方法,每个方法对应一个特定的请求参数。 二、配置与使用 1. 配置struts-config.xml 首先,需要...
1. **DispatchAction的工作原理**:DispatchAction内部有一个或多个方法,每个方法对应一个特定的操作。这些方法通常以`executeXXX`的形式命名,其中`XXX`代表一个特定的请求标识。当请求到达时,DispatchAction会...
在Struts 1.x时代,它提供了一种方式来在一个Action类中定义多个处理不同请求的方法,从而提高了代码的组织性和可维护性。这篇博客文章可能是探讨如何使用DispatchAction实现用户管理功能的教程。 首先,我们来理解...
DispatchAction是Struts提供的一种扩展机制,它允许我们在一个Action类中定义多个处理不同请求的方法,提高了代码的组织性和复用性。通过DispatchAction,我们可以减少Action Bean的数量,提升系统的可维护性。使用...