对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类的深入理解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 对handlerexecutionchain类的深入理解

    HandlerExecutionChain类比较简单,好理解. /* * 处理器执行链由处理器对象和拦截器组成. */ public class HandlerExecutionChain { 下面是类的部分属性. private final Object handler; //处理器对象. private HandlerInterceptor[] interceptors; //拦截器数组 private List<HandlerInterceptor> interceptorList; /

  • Java TreeSet类的简单理解和使用

    这篇文章主要介绍了Java TreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性.给对象排序的方式有很多,比如一些基本类型int.String等类型就已经提供了很多排序的方法了,但是这并不说明TreeSet类就没有什么用了.在一些时候我们需要自定义一些类,同时需要对这个类的对象进行排序,那么这个时候我们就可以通过这个TreeS

  • Java String类字符串的理解与认知

    目录 一.前言 二.String类概述 三.字符串的特点 四.String 构造方法 图示: 代码演示: 五.String类对象的特点 六.比较字符串的方法 用法: 代码图示: 七.判断两个字符串地址是否相等 StringBuilder和StringBuffer的区别 一.前言 在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们 一起来学习一下. 二.String类概述 string在软件包java.lang下,所以不需要导包. String字符串是java中的重

  • php全局变量和类配合使用深刻理解

    情况1: father.php如下定义: 复制代码 代码如下: <?php $jack = 1000; ?> children.php 如下定义: <?php require("father.php"); $jack=123; echo $jack."/n"; ?> php children.php 运行输出为123. 如果将$jack=123注释掉,运行为1000,如果将$jack=123放到require("father.php

  • java String 类的一些理解 关于==、equals、null

    1.String 的==与equal() 在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同.大多数时候==跟equal()的结果都是相同的.这是因为String对象是不变模式的,如果你不是明确地new一个String对象,Java对于String对象的保存默认的是会把新生成的String 对象放到一个缓冲区,然后每次判断缓冲区中是否已经有了这个对象,如果有了,那么后建立的同样字符值的String对象也会指向最初建立是该字符值对象的地址.也就是说字符值相同的时候

  • C++中对象&类的深入理解

    什么是对象 任何事物都是一个对象, 也就是传说中的万物皆为对象. 对象的组成: 数据: 描述对象的属性 函数: 描述对象的行为, 根据外界的信息进行相应操作的代码 具有相同的属性和行为的对象抽象为类 (class) 类是对象的抽象 对象则是类的特例 面向过程 vs 面向对象 面向过程 面向过程的设计: 围绕功能, 用一个函数实现一个功能 程序 = 算法 +数据结构 算法和数据结构两者互相独立, 分开设计 面向对象 面向对象的设计: 把算法和数据封装在一个对象中 设计所需要的歌者类和对象 向有关对

  • 深入理解Python中的元类(metaclass)

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

  • 深入理解java.lang.String类的不可变性

    1. 字符串 String 的不可变性 什么是不可变类? 这样理解:         一个对象在创建完成后,不能去改变它的状态,不能改变它的成员变量(如果成员变量包含基本数据类型,那么这个基本数据类型的值不能改变:如果包含引用类型,那么这个引用类型的变量不能指向别的对象) 不可变类只是其实例不能被修改的类.每个实例中包含的所有信息都必须在创建该实例的时候就提供,并且在对象的整个生命周期内固定不变.为了使类不可变,要遵循下面五条规则: 不要提供任何会修改对象状态的方法 保证类不会被扩展. 一般的做

  • python 类相关概念理解

    目录 什么是类,对象,实例,类## 标题变量(类属性),实例变量(实例属性) 类变量和类属性的分类 类调用实例方法 类的封装(enclosure),继承和多态 迭代,迭代器(iterator),可迭代对象(iterable object),生成器(generator) 总结 什么是类,对象,实例,类## 标题变量(类属性),实例变量(实例属性) 面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法.比如说,将乱七八糟的数据扔进列表中,这就是一

  • php class类的用法详细总结

    一:结构和调用(实例化): class className{} ,调用:$obj = new className();当类有构造函数时,还应传入参数.如$obj = new className($v,$v2-); 二:构造函数和析构函数: 1.构造函数用于初始化:使用__construct(),可带参数. 2.但析构函数不能带参数(用于在销去一个类之前执行一些操作或功能).析构函数用__destruct()做名称.在脚本执行结束时,会销掉内存中的对象,因此可不用析造函数,但有些比如COOKIE等

随机推荐