SpringMVC源代码学习外传(三)RequestCondition
以下内容基于书:《看透SpringMVC-源代码分析与实践》
基本照搬。。。用于自己查阅备忘。加上外传关键字的是讨论一些SpringMVC的特定类的使用方法,非外传的是对启动流程/请求处理流程,我们可以看作主线剧情。
RequestCondition是一个springMVC的接口,专门用于保存从request提取出的用于匹配handler的条件。
它的继承树如下:
代码如下:
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;
应用实例
先留空以后写代码测试补上
- http://blog.csdn.net/xia4820723/article/details/51418676 SpringMVC源代码学习(四)九大组件上 ↩
SpringMVC源代码学习外传(三)RequestCondition相关推荐
- SpringMVC源代码学习外传(一)xml命名空间的解析NamespaceHandler
以下内容基于书:<看透SpringMVC-源代码分析与实践> 基本照搬...用于自己查阅备忘. 加上外传关键字的是讨论一些SpringMVC的特定类的使用方法, 非外传的是对启动流程/请求 ...
- SpringMVC源代码学习外传(二)如何在重定向时传递参数FlashMap
以下内容基于书:<看透SpringMVC-源代码分析与实践> 基本照搬...用于自己查阅备忘. 加上外传关键字的是讨论一些SpringMVC的特定类的使用方法, 非外传的是对启动流程/请求 ...
- BT源代码学习心得(三):种子文件的编码方式 -- 转贴自wolfenstein (NeverSayNever)
BT源代码学习心得(三):种子文件的编码方式 author: wolfenstein BT的作者使用了一种比较简单易懂的编码方式来对设计种子文件.这种编码方式能够很简单得对python中的各种数据类型 ...
- SpringMVC源代码学习(一)从HTttpServletBean到DispatcherServlet
以下内容基于书:<看透SpringMVC-源代码分析与实践>基本照搬...用于自己查阅备忘. 观察DispatcherServlet继承树 做Java web的应该都知道Generi ...
- SpringMVC的学习(三)——Controller传递数据
一.Controller传递数据 有三种实现方案: 第一种:ModelAndView 第二种:Map 第三种:Model接口 ①:ModelAndView public class DemoContr ...
- SpringMVC基础学习之Restful风格的简单使用
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...
- 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例
强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例 1. 引言 在这个部分补充之前马尔科夫决策和动态规划部分的代码.在以后的内容我会把相关代码都附到相关内容的后面.本部 ...
- Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream
Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...
- SpringMVC深度探险(三) —— DispatcherServlet与初始化主线
本文是专栏文章(SpringMVC深度探险)系列的文章之一,博客地址为:http://downpour.iteye.com/blog/1341459. 在上一篇文章中,我们给出了构成SpringMVC ...
最新文章
- Jmail的主要参数列表
- Bloom Filter 大规模数据处理利器
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- fopen参数mode详解
- c语言不被O2优化,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
- wsdl文件是怎么生成的_C++ 动态库.dll的生成---超级详细!!!
- 项目开发中对使用的第三方库统一进行管理__添加属性表/页
- 机器视觉入门资料大全
- 环境规划与管理--知识点总结
- 东财《组织行为学B》综合作业
- c语言模拟洪泛路由算法,[Angular, TypeScript, 路由算法] 模拟IP层路由协议,实现LS算法、洪泛算法、DV算法、路由毒化...
- java调用python库pyd_Java怎么调用pyd文件
- 2021中国开源优秀人物榜出炉!
- python进程和线程大全
- el轮播图片image单张图比例缩放及多张图宽度固定高度等比例自适应展示;
- 4月21日V反再次来临?
- 爱读掌阅java版_爱读掌阅app官方下载-爱读掌阅旧版本 - 超好玩
- Linux基础Day02
- USB Type-C 协议
- 华为p20Android怎么解开,【华为P20】解锁EMUI8.1系统下华为P20的各种玩法新技巧
热门文章
- 培训机构微信裂变引流方案,培训机构如何利用微信群裂变引流招生?
- 100种思维模型之卡尼曼双系统思维模型-015
- matlab官网大纲,系统仿真与Matlab-教学大纲模板(2015版)
- 1.1 日本蜡烛图技术之十字线和支撑压力线
- c语言处理单色bmp文件,C语言处理单色BMP文件
- 奥尔所有java游戏_奥尔-少年侦探JS
- 初学C语言:根据输入的身高,求出标准体重。
- 全平台最佳密码管理工具大全:支持 Windows、Linux、Mac、Android、iOS 以及企业应用
- 什么是混合实体/曲面建模?有什么优势?
- 环迅支付打造定制化服务,为智慧教育高效发展加速