`
abin103
  • 浏览: 152924 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Struts2 - interceptor 原理

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

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



当你提交对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
分享到:
评论

相关推荐

    struts2-core-2.0.11源码

    在研究源码时,理解以上这些核心概念和组件的工作原理,可以帮助你深入掌握Struts2框架,从而更好地进行开发和优化。同时,由于源码可能存在错误,学习过程中需要具备一定的问题排查能力,利用IDE的调试工具逐步跟踪...

    struts2-core-2.3.7源码

    3. **Interceptor(拦截器)**: 拦截器是Struts2的核心特性,它们按照预设的顺序执行,可以在Action执行前后进行额外的操作,如日志记录、权限检查等。 4. **Value Stack**: 用于存储Action实例和其他Action上下文...

    struts2-tags-文档.rar

    API文档对于深入理解Struts2的工作原理和扩展功能至关重要。 通过学习这三个文档,开发者可以系统地掌握Struts2的框架结构,熟练运用其提供的标签库,以及根据需求定制自己的功能。对于初学者,"struts2.chm"提供了...

    struts2-core-2.2.1 jar下载、源码下载 非常全面!!绝对可用!! 所需资源分最少。

    通过`struts2-core`的API文档,开发者可以快速查找和了解如何使用Struts2的各种功能,例如ActionSupport、ResultType、InterceptorStack等。这些文档通常包括类的描述、方法签名、参数说明和返回值,有助于提高开发...

    struts2-2.3.4.1-all

    通过学习和实践这些内容,开发者可以深入理解Struts2框架的工作原理,掌握其配置和使用方法,从而在实际项目中更好地应用Struts2,提升开发质量和效率。同时,了解如何在Eclipse中进行Struts2项目的配置和调试,也是...

    struts2-core-2.3.32和xwork-core-2.3.32

    Struts2是一个非常著名的Java Web开发框架,它基于MVC(Model-View-Controller)设计模式,极大地简化了企业级应用的开发流程...在使用时,应结合标签"struts2"的相关文档和教程,深入了解并掌握其工作原理和最佳实践。

    struts2-core-2.1.8.1 xwork-core-2.1.6源码

    深入研究这两个库的源码,开发者能够理解Struts2的内部工作原理,优化性能,解决潜在问题,并根据需要定制自己的功能。这对于提升Web应用的开发效率和维护性具有重大意义。通过分析源码,开发者还可以学习到设计模式...

    struts2-2.3.32-all

    Struts2是一个非常著名的Java Web开发框架,它提供了一种模型-视图-控制器(MVC)架构,便于开发者创建动态、数据驱动...同时,了解并掌握Struts2框架的基本原理和安全配置,对于构建安全的Java Web应用程序至关重要。

    struts2 Interceptor详解

    Struts2 Interceptor详解 Struts2作为一款流行的Java Web框架,其强大的功能之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要角色,它可以对请求进行预处理和后处理,提供了灵活的扩展机制,使得业务...

    struts2-2.2.3-all.zip

    - **组件介绍**:列举了Struts2中常用的核心组件,如Action、Interceptor、Result等,并对每个组件的作用进行了详尽的说明。 - **配置指南**:指导如何配置Struts.xml文件以及其他配置文件,以便正确地初始化Struts2...

    struts 空项目 struts2-blank-2.0.12.war

    Struts2的配置文件通常是`struts.xml`,在这里定义Action、Interceptor和Result。比如,你可以定义一个Action,指定它的类、方法以及对应的结果页面。 4. **OGNL(Object-Graph Navigation Language)** Struts2...

    struts2-apps.rar

    "struts2-apps.rar"这个压缩包文件包含了多个示例项目,可以帮助学习者深入理解Struts2框架的工作原理和实践应用。 1. **Struts2框架核心概念**: - **Action类**:在Struts2中,Action类是业务逻辑的主要载体,它...

    struts2-src

    2. **拦截器(Interceptor)**:Struts2的核心特性之一是拦截器,它们在Action执行前后执行,可以用于登录检查、日志记录、性能监控等通用功能。通过组合不同的拦截器链,可以实现灵活的行为控制。 3. **OGNL...

    struts-2.5.20-all.zip

    3. **Interceptor(拦截器)**:拦截器是Struts2的一个强大特性,它允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。默认提供了许多内置拦截器,如params预处理拦截器负责参数绑定,exception处理异常...

    struts2.1-8源码

    深入研究这些源码,可以了解Struts2的内部工作原理,学习其设计模式,对于提升Java Web开发技能大有裨益。开发者可以通过阅读源码,理解Action的生命周期,拦截器的工作流程,以及Struts2如何处理请求和响应,从而更...

    struts2-xwork-ognl的源文件(jar包)

    这个压缩包包含了这三个关键组件的源代码,对于开发者来说,它提供了深入理解Struts2框架工作原理的宝贵资源。 `struts2-core-2.3.7-sources.jar` 是Struts2核心库的源代码,其中包含了许多关键组件,如Action、...

    struts-2.3.16-all

    3. **Interceptor**:拦截器是Struts 2的一大特色,它们是插件式的,可以在Action调用前后进行拦截,用于日志记录、权限检查、事务管理等。 4. **Value Stack**:这是一个数据容器,用于存储Action与视图之间的数据...

    Struts2-2,2.1.1官方完整版jar包

    4. **Interceptor(拦截器)**:拦截器是Struts2的一大特色,它允许开发者在Action调用前后插入自定义的逻辑,如权限检查、日志记录等。拦截器按照预定义的顺序进行调用,增强了代码的复用性和灵活性。 5. **...

    struts-2.5.20-min-lib.zip

    这意味着它包含了一些基础的库文件,足够初学者理解Struts2的工作原理,构建简单的web应用。不过,如果要进行更复杂的企业级开发,可能还需要额外的插件和库。 标签"开发包"提示我们,这个文件是用于开发目的的,而...

    struts1-core.jar

    Struts1是一个经典的Java Web开发框架,由Apache软件基金会维护,它主要负责处理MVC(Model-View-Controller)架构...尽管如此,学习Struts1可以帮助理解MVC模式以及Java Web开发的基本原理,为进阶其他框架打下基础。

Global site tag (gtag.js) - Google Analytics