Struts2框架(三)

一、拦截器

1.基本概念

  1)在Struts2中,把每一个功能都用一个个的拦截器实现;用户想用Struts的哪个功能的时候,可以自由组装使用。

  2)Struts2中,为了方便用户对拦截器的引用,提供了拦截器的定义,里面可以包含多个拦截器。

  3)Struts2中,如果用户没有指定执行哪些拦截器,Struts2有一个默认执行的栈:defaultStack;一旦如果用户有指定执行哪些拦截器,默认的拦截器就不会被执行。拦截器的设计,就是基于组件设计的应用。

2.拦截器配置举例

  1)struts-default.xml文件中,定义了struts提供的所有拦截器!

//1. 定义拦截器以及拦截器栈
<interceptors>
    1.1 拦截器定义
    <interceptor name="" class="" /> 
    
    1.2 拦截器栈的定义
    <interceptor-stack name="defaultStack">
    引用了上面拦截器(1.1)
    </interceptor-stack>
</interceptors>

2. 默认执行的拦截器(栈)
<default-interceptor-ref name="defaultStack"/>

  2)API

    |--Interceptor  拦截器接口

      |--AbstractInterceptor  拦截器默认实现的抽象类;一般用户只需要继承此类即可继续拦截器开发。

    |--ActionInvocation拦截器的执行状态,调用下一个拦截器或Action

  3)拦截器与过滤器的区别:

    a.拦截器是基于Java的反射机制的,而过滤器是基于函数回调。

    b.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。

    c.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有的请求起作用。

    d.拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。

    e.在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时调用一次。

二、自定义一个拦截器案例

  步骤:1.写拦截器类  2.配置

/**
 * 自定义拦截器
 * @author Jie.Yuan
 *
 */
public class HelloInterceptor implements Interceptor{
    
    // 启动时候执行
    public HelloInterceptor(){
        System.out.println("创建了拦截器对象");
    }

    // 启动时候执行
    @Override
    public void init() {
        System.out.println("执行了拦截器的初始化方法");
    }

    // 拦截器业务处理方法 (在访问action时候执行? 在execute之前执行?)
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("2. 拦截器,业务处理-开始");
        
        // 调用下一个拦截器或执行Action  (相当于chain.doFilter(..)
        // 获取的是: execute方法的返回值
        String resultFlag = invocation.invoke();
        
        System.out.println("4. 拦截器,业务处理-结束");
        
        return resultFlag;
    }
    

    @Override
    public void destroy() {
        System.out.println("销毁....");
    }


}

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="hello" extends="struts-default">
    
        <!-- 【拦截器配置】 -->
        <interceptors>
        
            <!-- 配置用户自定义的拦截器 -->
            <interceptor name="helloInterceptor" class="cn.itcast.a_interceptor.HelloInterceptor"></interceptor>
            
            <!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->
            <interceptor-stack name="helloStack">
                <!-- 引用默认栈 (一定要放到第一行)-->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 引用自定义拦截器 -->
                <interceptor-ref name="helloInterceptor"></interceptor-ref>
            </interceptor-stack>
            
        </interceptors>
        
        <!-- 【执行拦截器】 -->
        <default-interceptor-ref name="helloStack"></default-interceptor-ref>
        
    
        <!-- Action配置 -->
        <action name="hello" class="cn.itcast.a_interceptor.HelloAction">
            <result name="success"></result>
        </action>
    
    
    </package>
</struts>

 

  拦截器执行流程:

  启动:创建所有拦截器、执行init()

  访问:先创建Action,再执行拦截器,最后拦截器放行,执行execute()。

 

posted @ 2016-04-13 19:50  yly123  阅读(116)  评论(0)    收藏  举报