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的类型转换的完整类名

例如:

 <action name="user" class="org.lesson05.UserAction">

                 <result name="success">/user.jsp</result>

         </action>

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

    <!-- 使用method属性 -->

 <package name="methods" namespace="/"

 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>

 </package>

对应的MethodAction类,代码如下:

   importcom.opensymphony.xwork2.ActionSupport;

 public class MethodAction extends ActionSupport

 {

     @Override

     public 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

   <action name="user" class="org.lesson05.UserAction">

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

    </action>

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

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

4.模拟Struts1中的ForwardAction

  <action name="user">

        <result>/index.jsp</result>

               </action>

这样写就可以了.

5.默认的action

         如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。

默认的action使用default-action-ref元素来声明,如下所示:

  <!-- 默认action -->

 <package name="defaultAction" namespace="/default"

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

Struts2 配置Action详解的更多相关文章

  1. Struts 2 配置Action详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 实现了Action处理类之后,就可以在struts.xml中配置该Action,从而让Struts 2框架知道哪个Act ...

  2. (七)Transformation和action详解-Java&Python版Spark

    Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...

  3. SpringBoot中使用UEditor基本配置(图文详解)

    SpringBoot中使用UEditor基本配置(图文详解) 2018年03月12日 10:52:32 BigPotR 阅读数:4497   最近因工作需要,在自己研究百度的富文本编辑器UEditor ...

  4. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  5. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  6. mha配置参数详解

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  7. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  8. CentOS7下Firewall防火墙配置用法详解

    官方文档地址: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide ...

  9. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

随机推荐

  1. stm32寄存器版学习笔记10 SPI

    SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输 ...

  2. BZOJ2820 YY的GCD 【莫比乌斯反演】

    BZOJ2820 YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, ...

  3. c#开发的程序安装时动态指定windows服务名称

    转自:http://www.jb51.net/article/30549.htm 前段时间由于项目的需求,要在Windows里把同样的组件制作成多个不同名称的服务,这些服务完成类似的功能,仅需要修改业 ...

  4. Quick 3.3 final 加载ccs的变化

    1,用self._topUIWidget = ccs.GUIReader:getInstance():widgetFromJsonFile("mapTopUI.json")就还是用 ...

  5. Oracle 11gR2 RAC集群服务启动与关闭总结

    引言:这写篇文章的出处是因为我的一名学生最近在公司搭建RAC集群,但对其启动与关闭的顺序和原理不是特别清晰,我在教学工作中也发现了很多学员对RAC知识了解甚少,因此我在这里就把RAC里面涉及到的最常用 ...

  6. sphinx-1.3.0扩展在pPHP 7.0.7版本编译不通过

    在这个网友也是在php7上面编译插件不通过 https://bugs.php.net/bug.php?id=71586 下php7对应的扩展文件即可 http://git.php.net/?p=pec ...

  7. 关于Markdown的空行

    如何在Markdown中输入一个空行? 最简单的做法是加一个<br>(html)或者<br />(xhtml),因为Markdown完全兼容html语法,但有的编辑器会支持,譬 ...

  8. Jquery each循环中中断

    在each代码块内不能使用break和continue,要实现break和continue的功能的话,要使用其它的方式 break----用return false; continue --用retu ...

  9. (转)Inno Setup入门(十四)——替换安装程序和卸载程序的图标

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250937 通常Inno生成的安装文件的图标是一个光盘和显示器,如 ...

  10. offsetTop/offsetHeight scrollTop/scrollHeight 的区别

    offsetTop/offsetHeight   scrollTop/scrollHeight  这几个属性困扰了我N久,这次一定要搞定. 假设 obj 为某个 HTML 控件. obj.offset ...