几种DispatchAction的区别

本文介绍 Struts 框架中的四种主要动作分派机制:DispatchAction、LookupDispatchAction、EventDispatchAction 和 MappingDispatchAction 的使用方法。通过这些机制,开发者可以根据请求参数动态选择执行的动作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.Object

  org.apache.struts.action.Action

  org.apache.struts.actions.DispatchAction

  org.apache.struts.actions.LookupDispatchAction(Struts1.1)

  org.apache.struts.actions.EventDispatchAction(Struts1.2.9)

  org.apache.struts.actions.MappingDispatchAction(Struts1.2)

  DispatchAction

  public abstract class DispatchAction extends Action

  这是一个抽象的Action,它会根据request 中的parameter来执行相应的方法。通个这个Action类可以将不同的Action集中到一个Action文件中来。

  struts-config.xml:

  <action path="/subscription" type="org.example.SubscriptionAction" name="subscriptionForm" scope="request" input="/subscription.jsp" parameter="method"/>

  在Action中要有相应的方法:

  public class SubscriptionAction extends DispatchAction {

  public ActionForward delete(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward insert(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward update(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  }

  然后可以通过这样的方法来访问你的程序:

  http://localhost:8080/myapp/subscription.do?method=delete

  http://localhost:8080/myapp/subscription.do?method=insert

  http://localhost:8080/myapp/subscription.do?method=update

  如果parameter中参数为空,则调用Action中的unspecified方法

  LookupDispatchAction

  public abstract class LookupDispatchAction extends DispatchAction

  通过这个Action抽象类继承DispatchAction,它的相应方法的执行由ActionMapping中parameter属性决定。每个动作实际上就是<html:submit>标签的property属性值。它适合在一个form中有很多按钮,按不同的按钮则执行不同的操作。

  struts-config.xml:

  <action path="/subscription" type="org.example.SubscriptionAction" name="subscriptionForm" scope="request"

  input="/subscription.jsp" parameter="method"/>

  ApplicationResources.properties:

  button.add=Add Record

  button.delete=Delete Record
JSP:

  <%@ page pageEncoding="GBK"%>

  <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>

  <html>

  <head>

  <title>多提交演示</title>

  </head>

  <body>

  <html:form action="subscription">

  <html:submit property="method">

  <bean:message key="button.add"/>

  </html:submit>

  <html:submit property="method">

  <bean:message key="button.delete"/>

  </html:submit>

  </html:form>

  </body>

  </html>

  在Action中必须实现getKeyMethodMap方法:

  public class SubscriptionAction extends LookupDispatchAction {

  protected Map getKeyMethodMap() {

  Map map = new HashMap();

  map.put("button.add", "add");

  map.put("button.delete", "delete");

  return map;

  }

  public ActionForward add(ActionMapping mapping,

  ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward delete(ActionMapping mapping,

  ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  }

  EventDispatchAction

  public class EventDispatchAction extends DispatchAction

  通过这个Action抽象类继承DispatchAction,它的相应方法的执行由ActionMapping中parameter属性指定多个动作,中间用逗号(,)分隔。每个动作实际上就是<html:submit>标签的property属性值。它适合在一个form中有很多按钮,按不同的按钮则执行不同的操作。

  struts-config.xml:

  (parameter中的"recalc=recalculate"意思为<html:submit>标签的property属性值为recalc调用recalculate方法,出于安全考虑能够隐藏后台的业务方法名。"defaule=save"这是可选的,没有配置property属性的<html:submit>标签将调用defaule中设置的方法名,如果defaule没有指定任何参数,则调用Action中的unspecified方法)

  <action path="/subscription" type="org.example.SubscriptionAction" name="subscriptionForm" scope="request"

  input="/subscription.jsp" parameter="save,back,recalc=recalculate,default=save"/>
JSP:

  <%@ page pageEncoding="GBK"%>

  <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>

  <html>

  <head>

  <title>多提交演示</title>

  </head>

  <body>

  <html:form action="subscription">

  <html:submit property="save" value="保存"/>

  <html:submit property="back" value="后退"/>

  <html:submit property="recalc" value="重新计算"/>

  </html:form>

  </body>

  </html>

  在Action中要有相应的方法:

  public class SubscriptionAction extends LookupDispatchAction {

  public ActionForward save(ActionMapping mapping,

  ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward back(ActionMapping mapping,

  ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward recalculate(ActionMapping mapping,

  ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  }

  MappingDispatchAction

  public class MappingDispatchAction extends DispatchAction

  它的相应方法的执行由ActionMapping中parameter名决定,注意这里和LookupDispatchAction不同,LookupDispatchAction的相应方法的执行由ActionMapping中parameter属性决定。
struts-config.xml:

  <action path="/createSubscription" type="org.example.SubscriptionAction" parameter="create">

  <forward name="success" path="/createSubscription.jsp"/>

  </action>

  <action path="/editSubscription" type="org.example.SubscriptionAction" parameter="edit">

  <forward name="success" path="/editSubscription.jsp"/>

  </action>

  <action path="/saveSubscription" type="org.example.SubscriptionAction" parameter="save"

  name="subscriptionForm" validate="true" input="/editSubscription.jsp" scope="request">

  <forward name="success" path="/savedSubscription.jsp"/>

  </action>

  <action path="/deleteSubscription" type="org.example.SubscriptionAction" name="subscriptionForm"

  scope="request" input="/subscription.jsp" parameter="delete">

  <forward name="success" path="/deletedSubscription.jsp"/>

  </action>

  <action path="/listSubscriptions" type="org.example.SubscriptionAction" parameter="list">

  <forward name="success" path="/subscriptionList.jsp"/>

  </action>

  在Action中要有相应的方法:

  public class SubscriptionAction extends MappingDispatchAction {

  public ActionForward create(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward edit(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward save(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward delete(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  public ActionForward list(ActionMapping mapping, ActionForm form,

  HttpServletRequest request,

  HttpServletResponse response) throws Exception {}

  }

  然后可以通过这样的方法来访问你的程序:

  http://localhost:8080/myapp/create.do

  http://localhost:8080/myapp/edit.do

  http://localhost:8080/myapp/save.do

  http://localhost:8080/myapp/delete.do

  http://localhost:8080/myapp/list.do

  如果parameter中参数为空,则调用Action中的unspecified方法

  编辑特别推荐:

  总结Java标准类库中类型相互转化的方法

  实例讲解main()中方法调用的问题

  一个Java小球撞击墙面的小程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值