ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 研磨Struts2 之 第七章 Interceptor框架

研磨Struts2 之 第七章 Interceptor框架

原创 Linux操作系统 作者:不知道010 时间:2012-02-28 16:20:40 0 删除 编辑
Interceptor(拦截器)是Struts2最强大的特性之一,它可以让你在Action执行之前和Result执行后进行一些处理,同时也可以让你将通用代码模块化。这也就是我们所说的AOP(Aspect Oriented Programming,面向切面编程),它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。
Interceptor将很多功能从Action中独立出来,大量减少了Action的代码,独立出来的行为具有很好的重用性。XWork、Struts2的许多功能都是由Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行之前和Result执行后运行。
一:定义interceptor
    很简单,只需要定义name和class就可以了,示例如下:

java代码:
 
二:将多个interceptor组合成为栈
可以将多个interceptor组合到一起,使引用的地方更简单,执行的时候会按照
他们在栈中定义的顺序来执行。

java代码:



三:使用默认interceptor-ref减少重复配置
可以为每一个package建立一个默认的interceptor-ref,这样,package里面的
每一个action都不再需要定义任何interceptor了。示例如下:
但是要注意:如果为某一个action定义了interceptor,那么这个action将不再
使用默认的interceptor引用了。也就是说 不是在default的基础之上来加,而是直
接替换了
Struts2是按照一定的顺序调用每个interceptor的。
interceptor围绕着action和result的执行过程,当action和result执行完毕
后,每个interceptor都会按照相反的次序重新获得控制权,调用时位于第一位的现
在最后了。
interceptor的运行过程类似于filter,也就是说,每个interceptor可以选择继
续执行余下的interceptor还是直接返回,直接返回的话,余下的interceptor和
action就不再执行了。但是,不管返回值来自action还是一个直接返回的
interceptor,都会根据该返回值查找struts.xml中的result配置,并执行相应的处
理。
一:工具 interceptor
1:timer:记录ActionInvocation余下部分执行的时间,并做为日志信息记录下来
2:logger:在日志信息中输出要执行的Action信息 
二:属性设置interceptor
1:params:将Request请求的参数设置到相应Action的属性中,并自动转换类型
2:staticParams:将struts.xml配置文件里定义的Action参数,设置到对应的Action实例中。Action参数使用标签,是标签的子元素。
3:chain:将前一个执行结束的Action属性设置到当前的Action中。它被用在ResultType为“chain”指定结果的Action中,该结果Action对象会从ValueStack中获得前一个Action对应的属性,它实现Action链之间的数据传递
4:conversionError:用来处理框架进行类型转化(Type Conversion)时的出错信息。它将存储在ActionContext中的类型转化(Type Conversion)错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来
5:servletConfig:提供Action直接对Servlet api的访问,Action要实现相应的接口。包括:ServletRequestAware、ServletResponseAware、ParameterAware、SessionAware、ApplicationAware。
7:fileUpload:处理多部分文件上传
三:工作流 interceptor
1:workflow:Action默认的工作流,如果action实现了validateable接口,那么interceptor会调用action的validate()方法;如果action实现了validationAware接口,那么interceptor将会使用hasError()方法检查action是否包含错误信息。如果包含任何错误信息,那么interceptor将会返回input,而不让action执行。
2:validation:调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。
3:prepare:在Action执行之前调用Action的prepare()方法,这个方法是用来准备Action执行之前要做的工作。它要求我们的Action必需实现com.opensymphony.xwork2.Preparable接口
4:modelDriven:如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入ValueStack中
5:token:核对当前Action请求(request)的有效标识,防止重复提交Action请求(request) 。使用标签可以生成表单令牌,该标签会在session中设置一个预期的值并且在表单中创建一个隐藏的input字段。Token interceptor会检查这个令牌,如果不合法,将不会执行action, 注意这个拦截器需要手工添加,还需要配置一个invalid.token的result。
6:exeAndWait:生成一个新的线程以执行action,然后返回wait作为result code。而wait这个result code可以映射至一张包含刷新指示的页面,让浏览器数秒后自动刷新。当新线程执行action完毕后,下一个请求将返回原始action调用所生成的result
预建Interceptor栈
Struts2中还预定义了很多interceptor栈:
1:basicStack
2:validationWorkflowStack
3:fileUploadStack
4:modelDrivenStack
5:chainStack
6:i18nStack
7:defaultStack
作业:
默认情况是否引用了logger和timer的拦截器?如果把两个引用倒过来,会发生什么事?
默认情况是否引用了params和staticParams的拦截器?如果把两个引用倒过来,会发生什么事?
 
首先记住一个原则:interceptor必须是无状态的,并且不能够使用任何
ActionInvocation提供范围以外的API(当然基本的Java的API是可以用的,主要是
不能使用业务的API)
原因在于interceptor实质上是AOP的Advice,所以设计的时候必须要能够满足
AOP设计的正交性。无状态的意思就是要保证Interceptor的线程安全性。
 
使用Interceptor接口

java代码:
public class MyInterceptor2 implements Interceptor{
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("before------------->");
String result = invocation.invoke();
System.out.println("after-------------->");
return result;
}
}
作业:
myLogger:在每个Action运行之前打印Action的类和所有的请求参数;同时在Result运行之后打印跳转到哪个JSP。
sessionCheck:登陆检测,在指定的Action运行之前检查,是否有相应的session,如果有则继续运行;如果没有则跳转到登陆页面。
 
视频配套PPT,视频地址【 研磨Struts2视频课程

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26715408/viewspace-717292/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-28

  • 博文量
    15
  • 访问量
    6365