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


    @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 {};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    可以看到,@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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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 变量  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参考: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 变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    【简单模拟】第十二届蓝桥杯省赛第一场C++ B组/C组/研究生组《时间显示》(c++)
    java设计模式之外观代理模式
    雅思口语高分课程
    基于小波变换编码的纹理图像分割
    WebGL笔记:WebGL中绘制圆点,设定透明度,渲染动画
    TypeScript中使用superagent
    mysql存储过程
    基于SSM的仓库管理系统
    【重识云原生】第四章云网络4.7.2节——virtio网络半虚拟化简介
    一文弄懂 Diffusion Model
  • 原文地址:https://blog.csdn.net/wang489687009/article/details/130854041