对请求进行处理的元素主要有interceptors、Action以及Result。下面分别对其进行讲述。

1.拦截器配置(interceptors)

通过使用拦截器,我们可以在action中的方法执行之前先执行一些我们事先定义好了的方法,也可以在action中的方法执行之后立即执行一些我们事先定义好了的方法。在开发的过程中,拦截器将是一个强有力的工具。拦截器有很多很多的功能,如校验、属性封装、安全、日志等等,如下表所示:

表1:拦截器功能表

校验(validation)  检查输入是否正确
属性封装(property population) 将输入传输和转化为对象的属性
日志(logging)  记录关于每个action的详细信息
切面(profiling)  记录action的吞吐量,寻找性能瓶颈(不是很懂)

我们可以将多个拦截器链接在一起形成一个拦截器栈。比方说一个action不仅要对客户端的资格进行审查,还要记录它自己的行为,那么我们可以将实现这两个功能的拦截器放在一起,形成一个拦截器栈(interceptor stack)。拦截器是以java类的形式实现的,因此每一个拦截器都有一个唯一的类名。为了让对拦截器的参考更加容易,我们可以在框架中为每个拦截器注册一个更简单的名字。下面给出了一个注册拦截器的例子:

<interceptors>    
   <interceptor name="security" class="com.company.security.SecurityInterceptor"/>
    <interceptor-stack name="secureStack">
        <interceptor-ref name="security"/>  
      <interceptor-ref name="defaultStack"/> 
   </interceptor-stack></interceptors>
在定义一个拦截器栈的时候,单个的拦截器和拦截器栈可以以任意的顺序混合在一起,struts框架将会按照拦截器在栈里面的顺序调用它们。大多说应用程序都会定义一个默认的拦截器栈,如:<default-interceptor-ref name="defaultStack"/>,默认的拦截器栈会作用于package中的每个action上。当然action还可以定义它自己的本地(局部)栈,如下面例子所示:

<action name="VelocityCounter"  class="org.apache.struts2.example.counter.SimpleCounter"> 
   <result name="success">...</result>
    <interceptor-ref name="defaultComponentStack"/>
</action>

2.Action配置

action mappings是框架中的基本工作单元,框架通过对请求的request路径进行映射来决定由哪个action来处理请求。action mappings能指定一系列的result、异常处理器以及拦截器。action元素的所有属性中只有name属性是必须的,其它属性都是可选的。关于如何从请求路径映射到action在namespace那节中已经说过了,这里就不说了。尽管对于action的命名很灵活,但是action的名字中最好不要出现斜线(/)、点号(.)、破折号(/),以免出现一些不可预知的错误。

在Action接口中定义了action默认的方法入口,它就是execute方法。但是并不是每个action类都必须实现这个接口,如果action类没有实现这个接口的话,框架将使用反射来寻找一个execute方法。有时候我们的action中可能会包括多个方法入口,并且不同的情况下方法入口不同,例如执行修改操作时我们想进入action的mofify方法,执行增加操作时进入action的add方法,这个时候怎么办呢?我们可以通过指定action元素的method属性来实现,如下所示:

<action name="modify" class="example.CrudAction" method="modify">如果在action类中没有execute方法,也没有在配置文件中指定其它的方法,框架会抛出异常。

很多时候,多个action mapping会共享一个相同的模式,这个时候我们可以使用通配符方法。还是举例来说,如下所示。

<action name=”editCrud” class=”example.CrudAction” method=”edit”/>

<action name=”deleteCrud” class=” example.CrudAction” method=” delete”/>

上述两个action mapping调用的是同一个action类,只是执行的方法不同而已,并且所执行的方法名都是action mapping名字的开头部分,而且action mapping的名字除去方法名之后剩下的部分是一样的。这种情况下我们可以使用一个action mapping来代替上面两个action mapping:

<action name=”*Crud” class=”example.CrudAction” method=”{1}”>

匹配过程是这样的 (以请求的action mapping的名字是editCrud为例) :

●     *可以表示任何内容,因此任何以Crud结尾的action mapping都会匹配上

●     当editCrud匹配上后,*的内容此时就是edit

●     调用名字为第一个*号的内容的方法,此时仅有一个*号,并且此时它的内容为edit,因此action类的edit方法被调用了

●     同理,如果请求的action是deleteCrud,匹配成功后*的内容就是delete,调用的方法就是delete了。

使用通配符匹配方法可以让我们减少配置文件的内容,是配置更加简洁。

如果我们没有给action元素指定class属性的话,框架会默认它的class属性为com.opensymphony.xwork.ActionSupport,如果想指定别的类作为默认的Action类,可以通过package的default-action-ref属性来设置。在设置了default-action-ref之后,如果我们在package中没有匹配到所请求的action,那么这个默认的action就会被调用。一般一个命名空间下最好只定义一个默认的action。

3.Result元素配置

action类处理完一个请求后会返回一个字符串,这个字符串将被用来选择一个result元素。通常一个action mapping会有多个result,代表各个可能不同的结果。ActionSupport中定义了几个标准的result token,如下所示:

String SUCCESS = "success";String NONE    = "none";String ERROR   = "error";String INPUT   = "input";String LOGIN   = "login";通常我们都会自定义一些result token类匹配特定的情况。

result元素负责完成两个工作:1.提供一个逻辑名用于与action类的返回字符串进行匹配;2.提供一个返回类型(Result Type)。尽管大多数的result只是简单的转向一个页面或模板,但是我们还可以利用其它的返回类型(Result Type)做其它的一些事情。我们可以为每个包设置默认的返回类型(Result Type),如果一个包继承了另外一个包,它可以选择设置自己的默认返回类型或者直接使用父包的。设置默认返回类型的方式如下:

<result-types>
<result-type name="dispatcher" default="true"       class="org.apache.struts2.dispatcher.ServletDispatcherResult"/>
</result-types>
Result元素有两个属性:name和type,它们都是可选的,name属性的默认值是“success”,type的属性为我们所设置的默认返回类型,如上例中即为dispatcher。

定义在action元素里面的result我们可以称之为局部result,除此之外我们可以还可以全局的result,这些result会被多个action所共享。框架会首先寻找嵌套在action元素中的result,如果没有匹配的就去全局result中去寻找。一个全局result的例子如下:

<global-results>
  <result name="error">/Error.jsp</result>
  <result name="invalid.token">/Error.jsp</result>
  <result name="login" type="redirect-action">Logon!input</result>
</global-results>
有时候我们的result在运行前可能是未知的。比方说,一个result它所跳转的页面取决于它所在action类的运行结果或者客户端的输入等等,这时候我们可以使用动态的result,也就是说result的值可以使用表达式语言(EL)来表示,这个表达式的值是动态的,取决于action的运行时状况,下面是一个例子:

private String nextAction;public String getNextAction() {    
                return nextAction;
}
……………………………………………………………………………………
<action name="fragment" class="FragmentAction">
  <result name="next" type="redirect-action">${nextAction}</result>
</action>
在上例中result的值将是它所在action的nextAction的属性值,nextAction属性的值不同,当action的方法返回”next”时所跳向的url也不同。

本文转自 646676684 51CTO博客,原文链接:http://blog.51cto.com/2402766/572440,如需转载请自行联系原作者

struts2学习:配置篇值请求处理元素相关推荐

  1. IBatisNet1.5学习--配置篇

    最近准备学习IbatisNet1.5,顺便将学习的过程记录下来,整个过程的环境是VS2005+IBatisNet1.5,下面首先我们来看一下IBatisNet的配置.         IBatisNe ...

  2. vue.js路由配置vue-router的基础学习 - 概念篇

    文章目录 引言 · 相关问题小结: 一.动态路由匹配 (两种情况) A. 两种情况,代码对比: B. 两种情况,效果图对比: C. 提醒 · 仔细体会: D. 优先级的问题: 二.嵌套路由 引言 · ...

  3. 《TP5.0学习笔记---配置篇》

    TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...

  4. Struts2之初识篇(一)——与struts的区别和基本配置

    正在学习Struts2,该类博客作为笔记整理之用,错误的地方望指正,后期还会不断修改完善. Struts2资源: Struts官方地址:http://struts.apache.org/ 我这里下载了 ...

  5. sharepoint 2016 学习系列篇(23)-文档库应用篇-(5)文档权限配置

    学习了关于文档的上传,下载,以及属性标签的应用,朋友们估计也会想到,前面学习到了关于列表的数据权限配置, sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置 那么 ...

  6. lex编译dos命令_Lex与Yacc学习(一)之环境配置篇

    Abstract 在开发程序的过程中经常会遇到文本解析的问题,例如:解析 C 语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用 C 或者 C++直接编写解析程序,这 ...

  7. sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置

    当数据已经录入到列表中之后,接下来,朋友们可能会想知道,有些数据,只想给某些用户看到,或者编辑,列表是否支持这样的操作. 大微软的sharepoint平台,对于用户的需求,可以说是考虑得很周全的,权限 ...

  8. struts2学习笔记(二):Struts2配置

    struts2的默认配置文件default.properties在和核心包中的org.apache.struts2下.可以通过eclipse进行查看. 对struts2的属性配置进行调整有两种方法.下 ...

  9. Linux学习日记- - -配置篇##1

    惜冰的Linux笔记- - -配置篇##1 ##1 选择适合自己的Linux Distribution 笔者是在今年9月份才开始真正接触Linux的, 之所以这么说, 是因为之前零散的了解过相关的信息 ...

最新文章

  1. OpenCV之CvMat Mat IplImage之间相互转换
  2. c++ 动态规划(数塔)
  3. 高数第七版_习题解答_3-1行列式习题
  4. 【模型部署】风控模型部署相关知识
  5. 程序员面试题精选100题(05)-查找最小的k个元素[算法]
  6. php采集分析,PHP采集程序原理分析篇
  7. 数据结构(算法)-线性表2(单链表)
  8. 适合 Kubernetes 初学者的一些实战练习(一)
  9. 没想到你是这样的npm install
  10. python代码中怎么增加数据_python 实现数据库中数据添加、查询与更新的示例代码...
  11. foxmail7 BUILD093之后再无Foxmail
  12. webpack 保存文件后自动打包_Webpack轻松入门(二)——CSS打包
  13. Unity_游戏源码
  14. 中铁置业引入USB Server助力RPA机器人
  15. arm嵌入式led灯闪烁实验报告_嵌入式ARM键盘控制LED灯实验报告
  16. 直击|ofo测试折扣商城 押金可转换为金币消费
  17. px rpx pt em rem单位
  18. easywechat6获取微信用户信息(基于公众号)
  19. DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
  20. python绘画酷炫图片代码_第二天用python绘画一些简单图片

热门文章

  1. mysql char 和varchar哪种效率高_MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?...
  2. java 图片传输方式_Java图像传输方法
  3. 5菜鸟教程_XPLANE10菜鸟基础教程系列 飞机、机场以及天气的设置
  4. python十进制转八进制_怎样用python进行二进制,八进制,十进制转换
  5. 字节跳动小程序技术摘要
  6. 通过一个函数对比 mgrid以及meshgrid函数
  7. 测量场效应晶体管(JFET) 2N3819
  8. 如何生成动态matlibplot动图?
  9. Matplotlib绘制简单函数的梯度下降法
  10. 战队基地_走a怪凌晨四点被赶出训练基地,粉丝礼物还被战队瓜分