几种DispatchAction的区别

来源:互联网 发布:刀奴猛将数据 编辑:程序博客网 时间:2024/05/16 06:49

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方法

 

 原文地址 http://www.blogjava.net/lvq810/articles/256662.html
原创粉丝点击