【SpringMVC源码三千问】@RequstMapping和RequestCondition

news2024/9/22 11:23:27

@RequestMapping 是 SpringMVC 中最常用的定义请求映射关系的注解。
下面我们来分析一下它的源码。

@RequestMapping

先看下 @RequestMapping 的定义:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {

    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    /*************限制匹配范围的参数******************/
    // 请求方法限定
    RequestMethod[] method() default {};
    
    // 请求参数限定
    String[] params() default {};

    // 请求头限定
    String[] headers() default {};

    // 接收的 Content-Type 内容类型限定
    String[] consumes() default {};
    
    // 返回的 Content-Type 内容类型限定
    String[] produces() default {};
}

可以看到,@RequestMapping 除了可以定义 path 之外,还可以通过 RequestMethod、param、header、Content-Type 来更加精细化的匹配 request。

所以,在 SpringMVC 中抽象出了 RequestMappingInfo 来支持多样化的 request 请求映射。

RequestMappingInfo

RequestMappingInfo 是用来保存 @RequestMapping 中定义的请求映射信息的。
它里面包含了一系列的请求映射条件:

1、PathPatternsRequestCondition、PatternsRequestCondition  
2、RequestMethodsRequestCondition -- 处理 RequestMethod,如:GET, POST, PUT, DELETE 等
3、ParamsRequestCondition  -- 处理 params
4、HeadersRequestCondition  -- 处理 headers
5、ConsumesRequestCondition  -- 处理 consumes Content-Type
6、ProducesRequestCondition  -- 处理 produces Content-Type
7、RequestCondition (用户自定义的 RequestCondition)

RequestCondition

RequestCondition 是 request 请求映射条件,RequestCondition 可以组合叠加使用。

RequestCondition 的类图如下:
RequestCondition

PathPatternsRequestCondition: 处理简单 path 和通配符的请求映射

PathPatternsRequestCondition 是一种逻辑析取请求条件,用于根据一组 URL 路径模式匹配 request 请求。
它内部是通过解析出的 PathPattern 来匹配字符串。

  • PathPattern
    用于解析 URL 路径,处理简单的字符串 path 和含通配符的。

PathPattern 使用以下规则匹配 URL 路径:

  • ?: 匹配一个字符
  • *: 匹配路径段中的零个或多个字符
  • **: 匹配零个或多个路径段,直到路径结束
  • {spring}: 匹配路径段并将其捕获为名为 “spring” 的变量
  • {spring:[a-z]+}: 匹配正则 [a-z]+ ,并将匹配值赋值给 “spring” 的路径变量
  • {*spring}: 匹配零个或多个路径段,直到路径结束,并将其捕获为名为 “spring” 的变量

注意:
PathPattern 与 AntPathMatcher 不同,** 仅在模式末尾受支持。例如 /pages/{**} 有效,但 /pages/{**}/details 无效。
这同样适用于捕获变体 {*spring}。目的是在比较模式的特异性时消除歧义。

用法示例:

/pages/t?st.html - 匹配/pages/test.html以及/pages/tXst.html,但不匹配/pages/trast.html  
/resources/*.png - 匹配 resources 目录中的所有 .png 文件  
/resources/** - 匹配 /resources/ 路径下的所有文件,包括/resources/image.png和/resources/css/spring.css  
/resources/{*path} - 匹配/resources/和/resources下的所有文件,并在名为“path”的变量中捕获它们的相对路径/resources/image.png将与“path”匹配→ “/image.png”和/resources/css/spring.css将与“path”匹配→ “/css/spring.css”  
/resources/{filename:\\w+}.dat - 可以匹配 /resources/spring.dat,并将值 “spring” 赋值给 filename 变量  

参考:org.springframework.web.util.pattern.PathPattern 的源码注释

PatternsRequestCondition: 处理 ant 风格的请求映射

PatternsRequestCondition 是一种逻辑析取请求条件,用于根据一组URL路径模式匹配 request 请求。
它内部是通过 AntPathMatcher 来匹配字符串的。

  • AntPathMatcher
    AntPathMatcher 是 Ant 样式路径模式的 PathMatcher 实现,代码的一部分实现是从 ApacheAnt 借来的。

映射使用以下规则匹配URL:

  • ?: 匹配一个字符
  • *: 匹配零个或多个字符
  • **: 匹配路径中的零个或多个目录
  • {spring:[a-z]+}: 匹配正则 [a-z]+ ,并将匹配值赋值给 “spring” 的路径变量

示例

com/t?st.jsp - 匹配 com/test.jsp,但也匹配 com/tast.jsp 或 com/txst.jsp 
com/*.jsp - 匹配 com 目录中的所有 .jsp 文件
com/**/test.jsp - 匹配 com 路径下的所有 test.jsp 文件
org/springframework/**/*.jsp - 匹配 org/springframework 路径下的所有 .jsp 文件
org/**/servlet/bla.jsp - 匹配 org/springframework/servlet/bla.jsp,但也匹配 org/springframework/testing/servlet/bla.jsp 和 org/servlet/bla.jsp
com/{filename:\\w+}.jsp - 将与 com/test.jsp 匹配,并将值 test 赋值给 filename 变量

参考:org.springframework.util.AntPathMatcher 源码注释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day4 - 使用图像绘制动态时钟

本期的主要内容是利用OpenCV中包含的绘图函数,例如绘制线段、绘制矩形、绘制圆形等来绘制一个动态时钟的表盘。 完成本期内容,你可以: 掌握OpenCV常见的绘图函数 学会使用绘图函数绘制简单的图像 若要运行案例代码,你需要有&a…

linux——搭建NTP服务器

1、设置服务器时区 (使用外部NTP时间源可不设置) 在Linux系统中设置时区可以使用以下命令: 查看当前时区: timedatectl列出所有可用时区: timedatectl list-timezones设置时区: sudo timedatectl set-…

一、尚医通手机登录

文章目录 一、登录需求1、登录效果2、登录需求 二、登录1,搭建service-user模块1.1 搭建service-user模块1.2 修改配置1.3 启动类1.4 配置网关 2、添加用户基础类2.1 添加model2.2 添加Mapper2.3 添加service接口及实现类2.4 添加controller 3、登录api接口3.1 添加…

OpenAI再出新作,AIGC时代,3D建模师的饭碗危险了!

大家好,我是千与千寻,也可以叫我千寻哥,说起来,自从ChatGPT发布之后,我就开始焦虑,担心自己程序员的饭碗会不会哪天就被AIGC取代了。 有人说我是过度焦虑了,但是我总觉有点危机感肯定没有坏处。…

分布式事务解决方案-Seata

分布式事务解决方案-Seata 1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.3.微服务集成Seata…

C++ string类 迭代器 范围for

string类 在C语言当中 ,也有字符串,它是以 " \0 " 结尾 的 一些字符的集合,在C的标准库当中还有一些 用于操作 str 类型的库函数,但是,这些函数的功能不是很全面,而且这些操作函数和 str 类型是分…

B2B企业需要什么样的客户体验管理?销售易出手了

导读:如何将类似B2C领域的私域体验延展到B2B领域? “不愿在顾客上花时间带来的结果只有一个,那就是让客户转而寻找值得他们花时间的消费体验。”2012年问世的《体验经济》一书,一语道破客户体验的重要性。 过去,提到体…

PG安装使用walminer插件教程

一、下载源码 https://gitee.com/movead/XLogMiner/tree/walminer_3.0_stable/ 二、编译安装插件 克隆下载源码后,将walminer目录放进pg下的contrib目录中 cd /home/postgres/postgresql-15.3/contrib/将walminer源码目录放进此路径下,进入walminer目…

卷麻了,公司新来的00后测试用例写的比我还好,简直无地自容......

经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 如何编写测试用例? 作为一个测试新人,刚开始接触测试,对于怎么写测试用例很是头疼,无法…

STM32寄存器映射

1. 寄存器基本原理 寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制,我们编写程序最终就是去控制寄存器 下面的举例平台为STM32F407ZG 1.1 STM32寄存器分类 大类小类说明 内核寄存器 内核相关寄存器 包含R0~R15、xPSR、特殊功能寄…

《幸福关系的7段旅程》

关于作者 本书作者安德鲁∙马歇尔,英国顶尖婚姻咨询机构RELATE的资深专家,拥有 30年丰富的咨询经验,并为《泰晤士报》《观察家》和《星期日快报》撰写专栏文章。已出版19部作品,并被翻译成20种语言。 关于本书 《幸福关系的7段…

SQL查询比较慢,如何进行排查?如何进行SQL优化?

目录 一、开启慢查询日志 二、SQL优化 三、总结 一、开启慢查询日志 SQL慢查询是指执行时间较长的SQL语句,可能导致系统性能下降和响应时间延长。通过以下步骤可以开启慢查询日志记录: #查询是否开启慢查询日志 slow_query_log显示ON说明已开启&#…

广和通携手有人物联网完成5G SUL辅助上行功能验证

近日,广和通5G模组FM650-CN已在商用网络中实现5G SUL上行能力增强,助力有人物联网工业路由器在仿真网络环境中完成SUL辅助上行功能的验证。本次验证成功,意味着FM650-CN已具备SUL辅助上行商用能力,有利于推动更多5G终端支持SUL特性…

es 7 Es分布式基础

目录 复杂特性es已经做了分片副本负载均衡实现 设置分片数副本数 双机器读写 自动横向扩容 Node 节点宕机主节点切换 数据路由 增删改操作 读操作 _bulk 复杂特性es已经做了分片副本负载均衡实现 1.每个索引包含多个分片 设置分片数副本数 双机器读写 自动横向扩容 No…

React | React的CSS方式

✨ 个人主页:CoderHing 🖥️ React.js专栏:React的CSS方式 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React Node专栏 &#x…

Axure教程—多色折线图(中继器)

本文将教大家如何用AXURE中的中继器制作多色折线图 一、效果介绍 如图: 预览地址:https://xpdm3g.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87814320 二、功能介绍 简单填写中继器内容即可动态显示值样…

AppJoint2-2023再看安卓组件化框架

零、什么是组件化 为了避免一些小伙伴一脸懵的进来,又一脸懵的出去,我先简单的说一下什么是组件化。 开发程序时,我们都希望功能间的耦合度尽可能的低,这样的好处是:便于并行开发、代码易于维护、出问题时也好定位。…

抖音seo矩阵系统源码开发开源型私有化部署方案

抖音SEO矩阵系统是基于抖音平台的搜索引擎优化技术的一种系统,其主要作用是通过一系列的技术手段,提高抖音视频的曝光和排名,使其获得更多的流量和粉丝。在本文中,我们将介绍抖音SEO矩阵系统的开发技术,包括系统设计、…

map reduce实现累加器

需求:数组长度为100,每一项为对应下标,累加求和。 切题思路: 1.如何声明一个长度为100的数组?答:new Array(100) 2.数组每一项如何比前一项1 答:map(item,index)index为数组下标,…

企业推行OKR的必要条件

今天我们的话题是“OKR在企业落地执行,有哪些必要条件?” 对于有落地 OKR 经验的人可能更深有感触,OKR理解起来容易,但落地起来却困难重重,常言道“万事开头难”,那接下来我们就先从落地 OKR 的先决条件开始说起吧。 …