action特性

来源:互联网 发布:公牛网络面板接线图 编辑:程序博客网 时间:2024/06/06 19:28

Action是struts中的一个抽象类,它其实是Struts的心脏部分,前面提到的ActionServlet和ActionForm进过处理获取的请求和数据,都会到达Action中得到分发。
一:Action有那些作用

可以进行一些表单数据的检查,这里面的检查一般和页面的检查是不一样的,页面的检查都是客户端的一些数据格式规范的检查,这里的检查而与业务相关的检查一般放到这里面检查,比如与JavaBean相关的一些操作。也可以说它是一个业务逻辑的管理分发的地方。执行必要的业务逻辑,不如存取数据库,调用实体bean等。它会直接调用业务逻辑层的javabean去处理数据库的操作,比如增删改查等。根据处理的结果决定程序的去向,并以ActionForward对象的形式传递给ActionServlet,这样ActionServlet通过配置文件,决定返回的数据到达那个页面。Action是一个抽象类,必须实现以后才能执行,执行的方法是execute方法。

二 :一个完整的Action示例和执行流程。

[html] view plain copy

<actionpathactionpath="/aFullAction"  type="somePackage.someActionClass">  name="someForm"  input="someJSP.jsp"  <forwardnameforwardname="successful" path="someJSP.jsp"/>  <forwardnameforwardname="failed" path="someOtherJSP.jsp"/>  </action>  

Action执行流程

首先,Struts的ActionServlet接收到一个请求,然后根据struts-config.xml的配置定位到相应的mapping(映射);接下来如果form的范围是request或者在定义的范围中找不到这个form,创建一个新的form实例;取得form实例以后,调用其 reset()方法,然后将表单中的参数放入form,如果validate属性不为false,调用validate()方法;如果validate()返回非空的ActionErrors,将会被转到input属性指定的URI,如果返回空的ActionErrors,那么执行Action的 execute()方法,根据返回的ActionForward确定目标URI。

这样做的效果是:execute()仅当validate()成功以后才执行;input属性指定的是一个URI。

三.一个特殊的Action:DispatchAction

由于当业务太多的时候,每个业务都要创造一个Action,这样会大大增加Action的数量,而且也会造成浪费。

它的主要好处就是把所有的Action放到一个类里面,通过传过来的参数决定调用那个Action操作。

DispatchAction类是一个抽象类,它实现了父类(Action)的execute()方法,所以它的子类就不用来实现这个方法了,只需要专注与实际操作的方法。

下面看一个dispatchAction应用实例。
1.首先要一个DispatchAction的子类,它含有一些方法,login,logout,method1,

[java] view plain copy

public class AccountAction extends DispatchAction {      public ActionForward login(ActionMapping mapping,                                ActionForm form,                                HttpServletRequest request,                                HttpServletResponse response)      throws Exception {          // 進行一些Login的逻辑                return mapping.findForward("success");        }      public ActionForward logout(ActionMapping mapping,                                  ActionForm form,                                  HttpServletRequest request,                                  HttpServletResponse response)      throws Exception {          // 進行一些Logout的逻辑                return mapping.findForward("success1");        }      public ActionForward method1(ActionMapping mapping,                                  ActionForm form,                                  HttpServletRequest request,                                  HttpServletResponse response)      throws Exception {          // 進行一些method1的逻辑                return mapping.findForward("success");        }  }  

一定要注意在DispatchAction中你想执行的操作,都必须要有统一的参数(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response),是一个规定.
2.接下来是配置struts-config.xml

[html] view plain copy

<action path="/login"  type="examples.AccountAction"               name="logonForm"              scope="request"              parameter="action"              input="/pages/dispatch1.jsp">        <forward name="success" path="/pages/success.jsp" />     </action>     <action path="/logout"  type="examples.AccountAction"               name="logonForm"              scope="request"              parameter="action"              input="/pages/dispatch1.jsp">        <forward name="success1" path="/pages/success1.jsp" />     </action>  

这里需要注意的就是parameter属性的值,因为这个值要和页面传来的参数对应.

3.再来看看JSP页 pages/dispatch1.jsp

[html] view plain copy

<%@ taglib uri="/tags/struts-html" prefix="html" %>  <html:link href="/DispathActionTest/login.do?action=login">login</html:link><br>  <html:link href="/DispathActionTest/logout.do?action=logout">logout</html:link>  

这里要注意几点,首先 ?后面的KEY要和struts-config.xml中的parameter相同,还有它的VALUE要是你在action的一个方法名字,这里方法名为login, 那么在程序运行时就是调用login的操作,如果是logout,那程序就调用logout的操作。

Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。

该方法如下:

public String execute() throws Exception

Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:

public String  xxx()

在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。

开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。

  1. Action映射:
    action映射是Struts2框架中的基本” 工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
    action元素的完整属性表

属性

是否必须

说明

name

action的名字,用于匹配URL

class

Action实现类的完整类名

method

执行Action类时调用的方法

convert

应用于action的类型转换的完整类名

   例如:

            <result name="success">/user.jsp</result>    </action>2. 使用method属性       在配置action时,我们可以通过action元素的method属性来指定action调用的    方法,所指定的方法,必须遵循与execute方法相同的格式。       在Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用    method属性。       在Struts.xml文件中为同一个Action类配置不同的别名        <!-- 使用method属性 -->

extends=”struts-default”>

    <!-- 对应着MethodAction里面的execute方法 -->    <action name="list" class="org.lesson05.MethodAction">        <result name="success">/Methods/list.jsp</result>    </action>    <!-- 对应着MethodAction里面的add方法 -->    <action name="add" class="org.lesson05.MethodAction"

method=”add”>

        <result name="success">/Methods/add.jsp</result>    </action>    <!-- 对应着MethodAction里面的edit方法 -->    <action name="edit" class="org.lesson05.MethodAction"

method=”edit”>

        <result name="success">/Methods/edit.jsp</result>    </action>    <!-- 对应着MethodAction里面的delete方法 -->    <action name="delete"

class=”org.lesson05.MethodAction”

method=”delete”>

        <result name="success">/Methods/delete.jsp</result>    </action>

对应的MethodAction类,代码如下:
importcom.opensymphony.xwork2.ActionSupport;

public class MethodAction extends ActionSupport

{

@Overridepublic String execute() throws Exception{   return SUCCESS;}public String add() throws Exception{   return SUCCESS;}public String edit() throws Exception{   return SUCCESS;}public String delete() throws Exception{   return SUCCESS;}

}

       使用action的method属性可以任意指定处理请求的方法(只要该方法和execute

方法具有相同的格式),这样就可以在同一个类中完成相关的任务,而不需要去编写不

同的Action类。

       注意:Struts2在根据action元素的method属性查找方法时有两种途径:       1.查找与method属性值完全一致的方法.

2.查找doMethod()形式的方法.

3.动态方法调用:

     另外一种无需配置就可以直接调用Action中的非execute方法的方式,是使用

Struts2的动态方法调用。

动态方法调用是在action的名字中使用感叹号(!)来标识要调用的方法名,其语法格

式为 actionName!methodName.action

例如,我们配置了如下的action

        <result name="success">/Methods/list.jsp</result>

      当请求/user!delete.action时,就会自动调用UserAction中的delete()方

提示,这种调用方式会带来安全隐患!

4.模拟Struts1中的ForwardAction

   <result>/index.jsp</result>          </action>  这样写就可以了.

5.默认的action

     如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。     默认的action使用default-action-ref元素来声明,如下所示:      <!-- 默认action -->

extends=”struts-default”>

    <default-action-ref name="error"></default-action-ref>        <action name="defaultaction"

class=”org.lesson05.DefaultAction”>

        <result name="success">/defaultAction.jsp</result>    </action>    <action name="error">        <result>/error.jsp</result>    </action></package>

注意:根据struts-2.0.dtd中定义的package元素的内容模型,

default-acion-ref必须在action元素之前使用。

如果请求的是/default/defaultaction1.action,框架找不到映射到defaultaction1的action,那么名为error的action将被调用。

注意:每个包中都可以有它自己默认的action,但是每一个名称空间应该只有一个默认action。如果具有相同名称空间的多个包中都声明了默认action,那么哪一个action才是默认的将无法保证。注意:默认action只对action的访问有效。如果你访问一个非action的资源,例如/user.jsp,而该页面不存在,这时仍会看到HTTP404错误。如果想为整个Web应用程序指定默认页面,需要在web.xml文件中对HTTP404错误指定相应的错误处理页面。

6.通配符映射

  随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置。  通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。         以下是在action映射中使用通配符:           <action name="news*"          

class=”org.struts2.lesson05.News{1}Action”>

                <result name="success">/WEB-INF/News/{1}.jsp</result>    </action>  我们在action元素的name属性中使用了通配符(*),允许这个映射匹配所有以/news开始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果请求的是/newsEdit/add,那么这个映射就不会被匹配。  在上面,有一个特殊的记号{1},这是作为占位符使用的,它将被通配符所匹配的值替换,例如访问/newsEdit,通配符(*)匹配的部分是Edit,那么,这个值将替换{1},最终调用的类是org.struts2.lesson05.NewsEditAction,Action

执行成功后导向的结果页面是/WEB-INF/News/Edit.jsp。

  在action映射和action结果中,通配符匹配的值可以用记号{N}来访问,N是从1到9的数字,指出替换的是哪一个通配符匹配的值。整个请求URL可以用记号{0}来访问。例如如下的action映射: <action name="*_*" class="org.struts2.lesson05.{1}Action"  

method=”{2}”>

        <result>/WEB-INF/News/{0}.jsp</result>    </action>  当访问/News_delete时,name属性中的第一个”*”匹配News,第二个”*”匹配delete,class属性中使用的记号是{1},所以被News所替换,method属性中使用的记号是{2},于是被delete所替换。结果映射中使用的记号是{0},于是被整个URL替换,即News_delete所替换。整个替换后的结果是:当请求/News_delete时,框架调用NewsAction实例的delete方法对请求进行处理。执行成功后,请求被导向到/WEB-INF/News/News_delete.jsp页面。  通配符方法设置的另一种常见方式是使用后缀通配符,即将”*”放在action名字的后面,在”*”和名字前缀之间使用一个特殊字符作为分隔,常用的特殊字符是下划线(_),当然也可以使用其他字符。例如:           <action name="News_*"

class=”org.struts2.lesson05.NewsAction” method=”{1}”>

                <result>/WEB-INF/News/{0}.jsp</result>    </action>   当请求/News_delete时,调用的是NewsAction实例的delete方法,当请求/News_edit的时候,调用的是NewsAction实例的edit方法。

0 0
原创粉丝点击