对handlerexecutionchain类的深入理解

 更新时间:2017年07月04日 08:36:07   投稿:jingxian  
下面小编就为大家带来一篇对handlerexecutionchain类的深入理解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

HandlerExecutionChain类比较简单,好理解。

/*
 * 处理器执行链由处理器对象和拦截器组成。
 */
public class HandlerExecutionChain {

下面是类的部分属性。

private final Object handler; //处理器对象。

  private HandlerInterceptor[] interceptors; //拦截器数组

  private List<HandlerInterceptor> interceptorList; //拦截器列表
/**
   * Apply preHandle methods of registered interceptors.
   * @return {@code true} if the execution chain should proceed with the
   * next interceptor or the handler itself. Else, DispatcherServlet assumes
   * that this interceptor has already dealt with the response itself.
   * 执行已经注册的拦截的 preHandle()方法。如果返回true,则执行链可以执行下一个拦截器的preHandle()方法或 handler 自身。
   * 否则,
   */
  boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HandlerInterceptor[] interceptors = getInterceptors();
    if (!ObjectUtils.isEmpty(interceptors)) {
      for (int i = 0; i < interceptors.length; i++) {
        HandlerInterceptor interceptor = interceptors[i];
        if (!interceptor.preHandle(request, response, this.handler)) {
          triggerAfterCompletion(request, response, null);
          return false;
        }
        this.interceptorIndex = i;
      }
    }
    return true;
  }
/*
   * 执行已经注册的拦截器 postHandle()方法。
   */
  void applyPostHandle(HttpServletRequest request, HttpServletResponse response, ModelAndView mv) throws Exception {
    HandlerInterceptor[] interceptors = getInterceptors();
    if (!ObjectUtils.isEmpty(interceptors)) {
      for (int i = interceptors.length - 1; i >= 0; i--) {
        HandlerInterceptor interceptor = interceptors[i];
        interceptor.postHandle(request, response, this.handler, mv);
      }
    }
  }
/**
   * 这个方法只会执行preHandle()方法已经成功执行并且返回true的拦截器中的postHandle()方法。
   */
  void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, Exception ex)
      throws Exception {

    HandlerInterceptor[] interceptors = getInterceptors();
    if (!ObjectUtils.isEmpty(interceptors)) {
      for (int i = this.interceptorIndex; i >= 0; i--) {
        HandlerInterceptor interceptor = interceptors[i];
        try {
          interceptor.afterCompletion(request, response, this.handler, ex);
        }
        catch (Throwable ex2) {
          logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
        }
      }
    }
  }

以上这篇对handlerexecutionchain类的深入理解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Maven的安装及修改为阿里云下载依赖

    浅谈Maven的安装及修改为阿里云下载依赖

    下面小编就为大家带来一篇浅谈Maven的安装及修改为阿里云下载依赖。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • PowerShell用户认证Function实例代码

    PowerShell用户认证Function实例代码

    这篇文章主要介绍了PowerShell用户认证Function的资料,并附实例代码,帮助大家学习理解,有需要的小伙伴可以参考下
    2016-09-09
  • 使用Spring启动时运行自定义业务

    使用Spring启动时运行自定义业务

    这篇文章主要介绍了使用Spring启动时运行自定义业务的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java在读取文件内容的时候,如何判断出空白行的操作

    Java在读取文件内容的时候,如何判断出空白行的操作

    这篇文章主要介绍了Java在读取文件内容的时候,如何判断出空白行的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot注入自定义的配置文件的方法详解

    SpringBoot注入自定义的配置文件的方法详解

    在实际的项目开发过程中,我们经常需要将某些变量从代码里面抽离出来,放在配置文件里面。今天,我们就一起来聊一聊SpringBoot加载配置文件的几种玩法,需要的可以参考一下
    2022-09-09
  • Java 多线程并发ReentrantLock

    Java 多线程并发ReentrantLock

    这篇文章主要介绍了Java 多线程并发ReentrantLock,Java 提供了 ReentrantLock 可重入锁来提供更丰富的能力和灵活性,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java与kotlin详细对比

    Java与kotlin详细对比

    这篇文章主要介绍了Java与kotlin详细对比,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • SpringBoot+LayIM+t-io 实现好友申请通知流程

    SpringBoot+LayIM+t-io 实现好友申请通知流程

    这篇文章主要介绍了 SpringBoot+LayIM+t-io 实现好友申请通知流程,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12
  • Jmeter结构体系及运行原理顺序解析

    Jmeter结构体系及运行原理顺序解析

    这篇文章主要介绍了Jmeter结构体系及运行原理顺序解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot 如何从容器中获取对象

    SpringBoot 如何从容器中获取对象

    这篇文章主要介绍了SpringBoot 如何从容器中获取对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论