`
javafenger
  • 浏览: 242714 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Interceptor在Struts2中的应用...

阅读更多

Interceptor(拦截器)将Action共用的行为独立出来,在Action执行前后运行。这也就是我们所说的AOP(Aspect Oriented Programming,面向切面编程),它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。Interceptor在框架中的应用如下图所示:

interceptor webwork2 结构图

当你提交对Aciton(默认是.action结尾的Url)的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被 Interceptor截取,Interceptor在Action执行前后运行。

我们在用户注册的例子中就使用了取得Request请求参数的拦截器,配置文件中将拦截器params组装到RegisterAction中。“params”在我们的webwork-default.xml配置文件中有定义,webwork-default.xml中拦截器的定义如下:

 

<interceptors>
    
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
    
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
    
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/> 
    
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/> 
    
<interceptor-stack name="defaultStack">
        
<interceptor-ref name="static-params"/> 
        
<interceptor-ref name="params"/> 
        
<interceptor-ref name="conversionError"/> 
    
</interceptor-stack> 
</interceptors> 


这些都时有框架提供的默认的Interceptor,下面我来看看Interceptor使用的步骤:


1、  创建一个自己需要的Interceptor类,它必需实现com.opensymphony.xwork.interceptor.Interceptor接口,具体的开发见下面的Interceptor的原理。

2、  在配置文件(xwork..xml)中申明这个Interceptor类,它放在标签中,同是标签嵌入在标签内部。

3、  创建Interceptor栈,使用标签:  />,让一组Interceptor可以按次序调用。(可选)

4、  指定Action所要用到的Interceptor(前面申明过的),可以用或标签。前面的标签指定某个Action所用到的Interceptor,如果Action没有被用指定Interceptor,它将使用指定的Interceptor。


框架中给我们提供了很多实用的Interceptor,它的定义上面已经给出,它的具体功能如下:

● timer:记录Action执行的时间,并做为日志信息输出;

● logger:在日志信息中输出要执行的Action信息;

● chain:将前一个执行结束的Action属性设置到当前的Action中。它被用在ResultType为“chain”指定结果的Action中,该结果Action对象会从OgnlValueStack中获得前一个Action对应的属性,它实现Action链之间的数据传递;

● static-params:将xwork.xml配置文件里定义的Action参数,设置到对应的Action中。Action参数使用标签,是标签的直接子元素。我们这里定义的Action类必需实现com.opensymphony.xwork.config.entities. Parameterizable接口;

● params:将Request请求的参数设置到相应Action对象的属性中,用户注册例子用到过这个拦截器;

● model-driven:如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中;

● component:激活组件功能支持,让注册过的组件在当前Action中可用,即为Action提供IoC(依赖倒转控制)框架的支持;

● token:核对当前Action请求(request)的有效标识,防止重复提交Action请求(request)。

● token-session:功能同上,但是当提交无效的Action请求标识时,它会将请求数据保存到session中。

● validation:实现使用xml配置文件({Action}-validation.xml)对Action属性值进行验证,详细请看后面介绍的验证框架。

● workflow:调用Action类的验证功能,假设Action使用ValidationAware实现验证(ActionSupport提供此功能),如果验证没有通过,workflow会将请求返回到input视图(Action的中定义的)。

● servlet-config:提供Action直接对HttpServletRequest或HttpServletResponse等JavaServlet api的访问,Action要实现相应的接口,例如:ServletRequestAware或ServletResponseAware等。如果必需要提供对JavaServlet api的访问,我们建议使用ServletActionContext,在前面ActionContext章节中有介绍。

● prepare:在Action执行之前调用Action的prepare()方法,这个方法是用来准备Action执行之前要做的工作。它要求我们的Action必需实现com.opensymphony.xwork. Preparable接口

● conversionError:用来处理框架进行类型转化(Type Conversion)时的出错信息。它将存储在ActionContext中的类型转化(Type Conversion)错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来。

Interceptor的原理

下面我们来看看Interceptor是如何实现在Action执行前后调用的:

Action和Interceptor在框架中的执行,是由ActionInvocation对象调用的。它是用方法:String invoke() throws Exception;来实现的,它首先会依次调用Action对应的Interceptor,执行完成所有的Interceptor之后,再去调用Action的方法,代码如下:

 

if (interceptors.hasNext()) ...{
 Interceptor interceptor 
= (Interceptor) interceptors.next();
 resultCode 
= interceptor.intercept(this);
}
 else ...{
    
if (proxy.getConfig().getMethodName() == null...{
        resultCode 
= getAction().execute();
    }
 else ...{
        resultCode 
= invokeAction(getAction(), proxy.getConfig());
    }

}

 

它会在拦截器栈中遍历Interceptor,调用Interceptor的方法:
String intercept(ActionInvocation invocation) throws Exception;。

我们一直都提到,Interceptor是在Action前后执行,可是从上面的代码我们看到的却是执行完所有Interceptor的intercept()方法之后再去调用我们的Action。“在Action前后执行”是如何实现的呢?我们来看看抽象类AroundInterceptor的intercept()实现:

 

public String intercept(ActionInvocation invocation) throws Exception ...{
    String result 
= null;
    before(invocation);
    result 
= invocation.invoke();
    after(invocation, result);
    
return result;
}

 

原来在intercept()方法又对ActionInvocation的invoke()方法进行递归调用,ActionInvocation循环嵌套在intercept()中,一直到语句result = invocation.invoke();执行结束,即:Action执行完并返回结果result,这时Interceptor对象会按照刚开始执行的逆向顺序依次执行结束。这样before()方法将在Action执行前调用,after()方法在Action执行之后运行。

参考:

(1) webwork中的Interceptor http://www.blogchinese.com/06042/201878/archives/2006/200682171647.shtml
(2) Interceptor(拦截器)框架 http://hellboys.bokee.com/2093340.html

分享到:
评论
3 楼 雾茫茫 2009-12-18  
    你懂不懂啊  尽是忽悠  顶
2 楼 let_wind 2008-10-31  
beyondsanli 你懂不懂啊?
1 楼 beyondsanli 2008-07-22  
标题是struts2里面怎么整webwork,乱七八糟

相关推荐

    Struts2.0中文教程权威版

    08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX Struts2中用Spring实现IoC.doc Struts2中的零配置与CoC...

    struts2.0中文教程

    01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) ...08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX

    struts2[1].0标签详解

    Struts 2的基石——拦截器(Interceptor);在Struts 2_0中国际化(i18n)您的应用程序;在Struts 2_0中实现表单数据校验(Validation);Struts 2与AJAX;在Struts 2中实现IoC......

    个人认为目前最完备的Struts2教程

    01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) ...08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 Struts 2的新表单标志的使用 13 Struts 2与AJAX

    Struts 2.0系列(MAX)

    Struts 2.0系列(MAX),pdf格式,全方位介绍struts2: 常用的Struts 2.0的标志...在Struts 2中实现IoC 在Struts 2中实现文件上传 在Struts 2中实现CRUD Struts 2中的OGNL Strus 2的新表单标志的使用 Struts 2与AJAX

    struts2入门教程

    很好的struts2入门教程,网上搜集整理的!... ·Struts 2中实现IoC ·Struts 2中实现文件上传 ·Struts 2中的OGNL ·Strus 2的新表单标签的使用 ·Struts 2与AJAX ·Struts2分页 ·完全Struts's Tiles入门

    struts2.0.jar

    Struts 2.0框架中出现的许多特性旨在让Struts更容易使用: · 改进的设计: 与Struts 1相比...· 易于定制的控制器: Struts 1允许请求处理程序可按照模块来定制,在Struts 2中,需要的话,可以按照动作来定制请求处理。

    struts2注解详细说明

    安装使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你Macen项目的POM文件中添加下面包依赖      &lt;groupId&gt;org.apache.struts   &lt;artifactId&gt;struts2-convention-plugin   ...

    Struts 2.1.8_学习源码

    Struts2_04ActionResultType : Struts2关于Action跳转类型的应用 对各种不同的跳转类型使用的实例 Struts2_05Interceptor : Struts2拦截器的使用 Struts2_06FileUpload : Struts2上传文件的使用

    Struts2 in action中文版

    9.1 为什么在Struts 2中使用Spring 196 9.1.1 依赖注入能做些什么 197 9.1.2 Spring如何管理对象和注入依赖 199 9.1.3 使用接口隐藏实现 200 9.2 将Spring添加到Struts 2 202 9.2.1 让Spring管理动作、拦截器和结果...

    Struts2(4)拦截器与验证框架

    在struts2框架中主配置文件struts-defalut.xml 文件中定义了大量的拦截器和拦截器栈。通过 default-interceptor-ref元素定义了 当前应用的默认拦截器栈,对用户的每次请求都需要调用拦截器栈中的每个拦截器来拦截...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 27 2.5.2 动作类 28 2.5.3 运行app02a程序 29 2.6 依赖注入 29 2.6.1 概述 29 2.6.2 依赖注入的几种方式 31 2.7 小结 31 第3章 动作与结果 32 3.1 ...

    深入浅出Struts2(附源码)

    2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 27 2.5.2 动作类 28 2.5.3 运行app02a程序 29 2.6 依赖注入 29 2.6.1 概述 29 2.6.2 依赖注入的几种方式 31 2.7 小结 31 第3章动作与结果 32...

    JSP程序设计课件包含Hibernate,Struts的介绍

    Struts 是 Apache 软件基金会资助的一个为开发基于MVC模式的Web应用而设计的一个开源框架.Struts框架中的各种Web组件:它是利用Servlet、JavaBean和JSP、定制标签库等Web组件、XML等方面的技术来实现构建Web应用....

    Struts:Strurs的Somp应用

    Struts2Interceptor: 关于Struts自定义拦截器的应用 Struts2ParameterPostMethod_common: 关于Struts普通传值的应用 Struts2ParameterPostMethod_packagebybean: 关于Struts封装参数传递的应用 Struts2SQLConnection...

    Java框架篇-struts之文件上传和下载

     在Struts中的文件上传是通过预先定义的拦截文件上传拦截器这是可通过org.apache.struts2.interceptor.FileUploadInterceptor类的defaultStack中的一部分。仍然可以使用在struts.xml中设置各种参数,我们将在下

Global site tag (gtag.js) - Google Analytics