SpringMVC源代码学习外传(三)RequestCondition

原创 2016年05月17日 10:08:25

以下内容基于书:《看透SpringMVC-源代码分析与实践》
基本照搬。。。用于自己查阅备忘。加上外传关键字的是讨论一些SpringMVC的特定类的使用方法,非外传的是对启动流程/请求处理流程,我们可以看作主线剧情。

RequestCondition是一个springMVC的接口,专门用于保存从request提取出的用于匹配handler的条件。
它的继承树如下:

RequestCondition继承树

代码如下:

public interface RequestCondition<T> {
    T combine(T other);
    T getMatchingCondition(HttpServletRequest request);
    int compareTo(T other, HttpServletRequest request);
}

可以看到它的抽象实现,AbstractRequestCondition有8个子类,下面介绍下他们

CompositeRequestCondition

它本身不实际做匹配,而是可以存储多个RequestCondition,用的时候遍历它存储的这些RequestCondition进行匹配即可,也就是责任链模式,这种模式在SpringMVC中很常见,类名是CompositeXXX或者XXXComposite的就是。部分代码如下:

private final RequestConditionHolder[] requestConditions;
@Override
public CompositeRequestCondition getMatchingCondition(HttpServletRequest request) {
    if (isEmpty()) {
        return this;
    }
    RequestConditionHolder[] matchingConditions = new RequestConditionHolder[getLength()];
    for (int i = 0; i < getLength(); i++) {
        matchingConditions[i] = this.requestConditions[i].getMatchingCondition(request);
        if (matchingConditions[i] == null) {
            return null;
        }
    }
    return new CompositeRequestCondition(matchingConditions);
}

AbstractRequestCondition的其他子类

每个子类表示一种匹配条件,如,PatternsRequestCondition使用url匹配。
RequestMethodsRequestCondition使用RequestMethod做匹配。

RequestMappingInfo

我们在介绍AbstractHandlerMethodMapping1时提到它的泛型默认实现是RequestMappingInfo,
它的内部用七个变量保存了七个RequestCondition,匹配时用他们进行匹配,这也就是@RequestMapping中可以给处理器指定多种匹配方式的原因。

private final PatternsRequestCondition patternsCondition;
private final RequestMethodsRequestCondition methodsCondition;
private final ParamsRequestCondition paramsCondition;
private final HeadersRequestCondition headersCondition;
private final ConsumesRequestCondition consumesCondition;
private final ProducesRequestCondition producesCondition;
private final RequestConditionHolder customConditionHolder;

应用实例

先留空以后写代码测试补上


  1. http://blog.csdn.net/xia4820723/article/details/51418676 SpringMVC源代码学习(四)九大组件上

SpringMVC那些事-请求映射匹配-处理器匹配

1.概述 2.主要过程 3.分析 4.相关类 5.部分源码注释 1.概述 根据MVC的概念,我们知道,请求到服务器后都需要经过控制器.这就需要一种机制把请求准确的调用控制器, 也就是需要明确哪个请求...
  • yhjyumi
  • yhjyumi
  • 2015年09月27日 14:06
  • 3327

详解SpringMVC请求的时候是如何找到正确的Controller

目录 前言源码分析 重要接口介绍SpringMVC初始化的时候做了什么HandlerExecutionChain的获取 实例资源文件映射总结参考资料 前言 ...
  • JIESA
  • JIESA
  • 2017年02月06日 19:04
  • 3275

springmvc实现webapi接口版本兼容

文章出处:http://www.cnblogs.com/jcli/p/springmvc_restful_version.html主要实现webapi版本兼容和降级,比如访问api/v3/hello但...
  • qq1593232480
  • qq1593232480
  • 2017年04月09日 23:10
  • 2657

Spring MVC 之 调用复用

如果大家看过Spring MVC的源代码都会知道.Spring MVC框架在Spring容器初始化的时候,通过@RequestMapping建立起请求路径与调用方法的映射(没有看过源码的同学应该也能够...
  • u012410733
  • u012410733
  • 2017年08月08日 22:19
  • 1242

Spring MVC — @RequestMapping原理讲解-2

Spring MVC 解读——@RequestMapping     上一篇文章中我们了解了Spring如何处理@RequestMapping注解,并将请求映射信息保存到系统中以处理客户端发送来的请求...
  • J080624
  • J080624
  • 2017年02月21日 11:30
  • 1374

SpringMVC源代码学习外传(三)RequestCondition

以下内容基于书:《看透SpringMVC-源代码分析与实践》 基本照搬。。。用于自己查阅备忘。加上外传关键字的是讨论一些SpringMVC的特定类的使用方法,非外传的是对启动流程/请求处理流程,我...
  • xia4820723
  • xia4820723
  • 2016年05月17日 10:08
  • 1446

详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析]

详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析] 目录 前言源码分析 重要接口介绍SpringMVC初始化的时候做了什么HandlerEx...
  • u014551624
  • u014551624
  • 2017年12月22日 19:27
  • 51

SpringMVC源代码学习(三)DispatcherServlet

DispatcherServlet是 SpringMVC最核心的类。 上文提到对请求的处理传递到了DispatcherServlet的, 代码如下: DispatcherServlet(do...
  • xia4820723
  • xia4820723
  • 2016年05月13日 21:46
  • 345

广电总局禁播 《武林外传》称其影响社会和谐?

近来,随着“黄金档”古装剧的减少,家庭伦理剧等情感剧逐渐增多。但是,家庭伦理剧中的第三者感情问题过多,被监管机构认为与建设和谐社会环境不符。  据一位了解内部政策的业内人士透露,广电总局已经正在酝酿限...
  • kevinhalu
  • kevinhalu
  • 2006年09月09日 01:52
  • 1282

11111

前面我们简单了解RequestMappingInfo,它包含了7个condition。 1、RequestMethodsRequestCondition 现在我们研究最简单的RequestMeth...
  • hong10086
  • hong10086
  • 2018年02月03日 22:56
  • 25
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SpringMVC源代码学习外传(三)RequestCondition
举报原因:
原因补充:

(最多只允许输入30个字)