posts - 15,  comments - 8,  trackbacks - 0
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方法

posted on 2009-02-25 17:42 lvq810 阅读(934) 评论(0)  编辑  收藏 所属分类: Java