`
sbpya
  • 浏览: 615672 次
  • 性别: Icon_minigender_1
  • 来自: 杭州,长沙
社区版块
存档分类
最新评论

struts2教程- 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请求参数的拦截器,配置文件中<interceptor-ref name="params"/>将拦截器params组装到RegisterAction中。“params”在我们的webwork-default.xml配置文件中有定义,webwork-default.xml中拦截器的定义如下:
 
<interceptors>
            <interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
            <interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
            <interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
            <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
            <interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
            <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
            <interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
            <interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
            <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
            <interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
            <interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
            <interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
            <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>
            <interceptor-stack name="validationWorkflowStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>
        </interceptors>
这些都时有框架提供的默认的Interceptor,下面我来看看Interceptor使用的步骤:
1、   创建一个自己需要的Interceptor类,它必需实现
com.opensymphony.xwork.interceptor.Interceptor接口,具体的开发见下面的Interceptor的原理。
2、   在配置文件(xwork..xml)中申明这个Interceptor类,它放在标签<interceptor />中,同是<interceptor />标签嵌入在<interceptors />标签内部。
3、   创建Interceptor栈,使用标签:<interceptor-stack />,让一组Interceptor可以按次序调用。(可选)
4、   指定Action所要用到的Interceptor(前面申明过的),可以用<interceptor-ref />或<default-interceptor-ref />标签。前面的标签指定某个Action所用到的Interceptor,如果Action没有被用<interceptor-ref />指定Interceptor,它将使用<default-interceptor-ref />指定的Interceptor。
框架中给我们提供了很多实用的Interceptor,它的定义上面已经给出,它的具体功能如下:
l          timer:记录Action执行的时间,并做为日志信息输出;
l          logger:在日志信息中输出要执行的Action信息;
l          chain:将前一个执行结束的Action属性设置到当前的Action中。它被用在ResultType为“chain”指定结果的Action中,该结果Action对象会从OgnlValueStack中获得前一个Action对应的属性,它实现Action链之间的数据传递;
l          static-params:将xwork.xml配置文件里定义的Action参数,设置到对应的Action中。Action参数使用<param />标签,是<action />标签的直接子元素。我们这里定义的Action类必需实现com.opensymphony.xwork.config.entities. Parameterizable接口;
l          params:将Request请求的参数设置到相应Action对象的属性中,用户注册例子用到过这个拦截器;
l          model-driven:如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中;
l          component:激活组件功能支持,让注册过的组件在当前Action中可用,即为Action提供IoC(依赖倒转控制)框架的支持;
l          token:核对当前Action请求(request)的有效标识,防止重复提交Action请求(request)。
l          token-session:功能同上,但是当提交无效的Action请求标识时,它会将请求数据保存到session中。
l          validation:实现使用xml配置文件({Action}-validation.xml)对Action属性值进行验证,详细请看后面介绍的验证框架。
l          workflow:调用Action类的验证功能,假设Action使用ValidationAware实现验证(ActionSupport提供此功能),如果验证没有通过,workflow会将请求返回到input视图(Action的<result />中定义的)。
l          servlet-config:提供Action直接对HttpServletRequest或HttpServletResponse等JavaServlet api的访问,Action要实现相应的接口,例如:ServletRequestAware或ServletResponseAware等。如果必需要提供对JavaServlet api的访问,我们建议使用ServletActionContext,在前面ActionContext章节中有介绍。
l          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执行之后运行


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shiqiang1234/archive/2007/07/22/1702044.aspx

分享到:
评论

相关推荐

    Struts2 拦截器 Interceptor

    2. **拦截器栈**:多个拦截器的集合称为拦截器栈,Struts2默认提供了几个内置的拦截器栈,如`defaultStack`、`jsonStack`等,也可以自定义拦截器栈。 3. **拦截器配置**:拦截器可以通过Struts2的配置文件`struts....

    struts2--4.拦截器

    默认拦截器栈 Struts2提供了一个默认的拦截器栈`defaultStack`,它包含了一些常用的拦截器,如`params`(处理请求参数)、`i18n`(处理国际化)、`exception`(处理异常)、`chain`(支持动作的转发)等。开发过程...

    Struts2--自定义拦截器

    这里,`myCustomInterceptor`是自定义拦截器的引用,`myCustomStack`是包含默认拦截器和自定义拦截器的栈。`defaultStack`包含了Struts2默认的拦截器,如`params`、`validation`和`i18n`等。 3. 如果你需要对特定...

    struts2的一个自定义拦截器小例子

    本示例将聚焦于如何在Struts2中实现一个自定义拦截器。 首先,我们需要了解拦截器在Struts2中的作用。拦截器是AOP(面向切面编程)的一个核心概念,它允许开发者在动作执行前后插入额外的逻辑,如日志记录、权限...

    struts2学习之九---拦截器

    Struts2是一个强大的Java EE应用程序框架,主要用于构建Web应用程序。拦截器是Struts2的核心特性之一,它在MVC设计模式中...在学习过程中,可以参考官方文档、博客文章以及相关教程,加深对Struts2拦截器的理解和实践。

    struts2 Interceptor详解

    Struts2默认提供了一些内置拦截器,如`params`、`exception`、`validation`等,它们可以按需添加到拦截器栈中。 3. **自定义拦截器** 开发者可以通过实现`org.apache.struts2.interceptor.Interceptor`接口或继承`...

    struts2集成struts-ssl-plugin插件实现https访问例子

    如果不使用默认的插件,可以创建自定义拦截器来实现特定的SSL逻辑。拦截器可以检查请求的协议,并在必要时重定向到HTTPS URL。例如: ```java public class SSLInterceptor extends AbstractInterceptor { @...

    struts2-拦截器.docx

    - **默认拦截器**:Struts2提供了一些内置的拦截器,比如`params`用于处理请求参数,`exception`用于异常处理,`i18n`处理国际化,`validation`执行字段验证等。这些默认拦截器的配置可以在`struts-default.xml`文件...

    Struts2默认拦截器解析[归类].pdf

    以下是对Struts2默认拦截器的详细解析: 1. **AliasInterceptor** - 别名拦截器:允许为Action配置别名,使得同一个Action可以通过不同的URL访问。 2. **AutowiringInterceptor** - 自动装配拦截器:在Spring整合...

    一个Struts2的核心拦截器例子

    - 使用`&lt;default-interceptor-ref&gt;`定义默认拦截器栈,所有未明确指定拦截器的动作都将使用这个栈。 4. **自定义拦截器**: - 创建一个新的Java类,实现`Interceptor`接口并重写`intercept()`方法。 - 在`...

    struts-2.3.8-all.zip

    - `struts2-config.xml`: 默认的配置文件,可以在这里配置全局属性、拦截器栈、Action和Result等。 - `webapp`: 示例应用目录,包含示例Action、JSP页面和Web应用部署描述符(web.xml)。 - `lib`: 所需的第三方库,...

    struts-xwork-core源码

    - 拦截器是Struts2的一大特色,它们在Action执行前后运行,可以实现日志记录、事务管理、权限检查等功能。Struts2的许多功能都是通过拦截器实现的。 6. **Value Stack**: - 值栈是Struts2的一个重要概念,它是一...

    STRUTS2 教程 --希望能够对大家有所帮助

    6. **Interceptor(拦截器)**:拦截器是Struts2的一大特色,可以实现如日志、权限检查、事务管理等功能。通过`&lt;interceptor&gt;`和`&lt;interceptor-stack&gt;`标签进行配置。 7. **OGNL(Object-Graph Navigation Language...

    struts2 拦截器实例

    2. **默认拦截器栈**:`defaultStack`包含了Struts2内置的一些拦截器,如`params`(处理参数),`i18n`(处理国际化),`exception`(处理异常)等。 3. **应用全局拦截器**:现在,所有Action都会在执行前经过`...

    struts-2.1.8-all-src.zip

    4. **struts-default**:这个模块包含了Struts2默认的配置和行为,如默认的拦截器栈。 通过研究这些源代码,开发者不仅可以深入理解Struts2的工作机制,还能学习到如何设计和实现一个成熟的MVC框架。此外,对于那些...

    struts-2.3.32-all

    6. **Interceptor**: 拦截器是Struts 2的一个重要特性,它允许在Action调用前后插入自定义逻辑,如日志、权限验证等。 7. **Result**: 表示Action执行后的结果,可以是跳转到另一个页面,或者直接返回JSON、XML等...

    struts2 用拦截器 实现用户权限登录

    默认拦截器栈`defaultStack`包含了Struts2预定义的一些拦截器,如`params`、`i18n`等。在添加自定义拦截器时,可以将其插入到默认拦截器栈中,也可以创建自定义的拦截器栈。 ### 五、测试与优化 完成上述步骤后,你...

    struts2.X 拦截器源码

    `defaultStack`是Struts2提供的默认拦截器栈,包含了如`exception`、`params`、`i18n`等常用拦截器。 了解了拦截器的基本原理后,我们可以通过`Struts2.x 拦截器.avi`这个视频文件深入学习Struts2拦截器的实现细节...

    struts2 拦截器的使用(继承抽象拦截器)

    默认拦截器栈包含了Struts2框架预定义的一些拦截器,如`ExceptionMappingInterceptor`用于处理异常,`PrepareInterceptor`用于准备Action,`ModelDrivenInterceptor`用于模型驱动等。 3. `destroy()`: 这个方法在...

Global site tag (gtag.js) - Google Analytics