Struts的拦截器

一、为什么需要拦截器

       1.早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低

        2.Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦

二、什么是拦截器

       1.Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能
       2.拦截器方法在Action执行之前或者之后执行

三、拦截器栈

       1.从结构上看,拦截器栈相当于多个拦截器的组合

       2.在功能上看,拦截器栈也是拦截器

四、拦截器的原理

        拦截器与过滤器原理很相似,以链式执行

HttpServletRequest         HttpServletResponse    
                 |①                   |11
             核心控制器             核心控制器    
                 |②                   |⑩ 
             Interceptor1         Interceptor1
                 |③                   |⑨
             Interceptor2         Interceptor2
                 |④                   |⑧
             Interceptor3         Interceptor3
                 |⑤      ⑥           |⑦
                 Action  ---->     Result
  首先执行Action配置的拦截器,在Action和Result执行之后,拦截器再
一次执行(与先前调用相反的顺序),在此链式的执行过程中,任何一个
拦截器进了可以直接返回,从而终止余下的拦截器、Action及Result的执行
拦截器的执行可看作递归过程:

    框架通过第一次调用ActionInvocation的invoke()方法开始这一过程,ActionInvocation通过调用拦截器的intercept()方法把控制转交给为Action配置的第一个拦截器。最重要的是intercept()把ActionInvocation实例看作参数,在拦截器的处理过程中,它会调用ActionInvocation对象上的invoke()方法来继续调用后续拦截器。

拦截器有一个三阶段的、有条件的执行周期:

   1.做一些Action执行前的预处理: 拦截器可以准备、过滤、改变或者操作任何可以访问的数据,包括Action。

    2.调用ActionInvocation的invoke()方法将控制转交给后续的拦截器或者返回结果字符串终止执行:如果拦截器决定请求的处理不应该继续,可以不调用invoke()方法,而是直接返回一个控制字符串。通过这种方式,可以停止后续的执行,并且决定哪个结果呈现给客户端。

    3.做一些Action执行后的处理:此时拦截器依然可以改变只可以访问的对象和数据,只是此时框架已经选择了一个结果呈现给客户端了。

代码

public class MyTimerInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        //1.执行Action之前的工作:获取开始时间
        long statTime = System.currentTimeMillis();
        System.out.println("执行Action之前的工作,开始时间"+statTime);
        //2.执行后续拦截器或Action
        String result = invocation.invoke();
        //3.执行Action之后的工作:计算并输出执行时间
        long endTime = System.currentTimeMillis();
        long execTime = endTime - statTime;
        System.out.println("执行Action后的,结束时间"+endTime);
        System.out.println("总共用时"+execTime);
        //返回结果字符串
        return result;
    }

}



拦截器的配置:

  1.使用步骤:

      1)通过<interceptor.../>元素定义拦截器。

      2)通过<interceptor.../>元素来使用拦截器

  在struts.xml配置文件


<package name="default" namespace="/" extends="struts-default">

    <interceptors>
        <!-- 定义拦截器 -->

        <interceptor name="myTimer" class="com.jbit.intercepotr.MyTimerInterceptor"></interceptor>


       </interceptor>
      
    </interceptors>

  

    <action name="action" class="com.jbit.intercepotr.MyTimerAction">
        <result>index.jsp</result>
        <interceptor-ref name="myTimer"></interceptor-ref>

         <!-- 定义默认的拦截器引用 -->

        <interceptor-ref name="defaultStack"></interceptor-ref>
    </action>
  
</package>



下面使用拦截器栈

<package name="default" namespace="/" extends="struts-default">

    <interceptors>
        <!-- 定义拦截器 -->
        <interceptor name="myTimer" class="com.jbit.intercepotr.MyTimerInterceptor"></interceptor>
        <interceptor name="myTimer2" class="com.jbit.intercepotr.MyTimerAction2"></interceptor>
        <!-- 定义拦截器栈 -->
        <interceptor-stack name="stackName">
            <!-- 指定引用的拦截  -->
            <interceptor-ref name="myTimer"></interceptor-ref>
            <interceptor-ref name="myTimer2"></interceptor-ref>
            
        </interceptor-stack>
    </interceptors>
    <!-- 定义默认的拦截器引用 -->
    <default-interceptor-ref name="defaultStack"></default-interceptor-ref>
    

    <action name="action" class="com.jbit.intercepotr.MyTimerAction">
        <result>index.jsp</result>
        <interceptor-ref name="stackName"></interceptor-ref>
        
    </action>
  
</package>





 

       

                









               

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值