1、参数接收和基本注解

1.1 注解

@PathVariable
@RequestHeader
@ModelAttribute
@RequestParam
@MatrixVariable
@RequestBody

1.2 Servlet API

WebRequest
ServletRequest
MultiPartRequest
HttpSession
javax.servlet.http.PushBuilder
Pricipal
InputStream
ServletUriComponentsBuilder

1.3 复杂参数

Map
Errors/BindingResult
Model
RedirectAttributes
ServletResponse
SessionStatus
UriComponentsBuilder
ServletUriComponentsBUilder

1.4 自定义对象参数

可以自动类型转化和格式化,可以级联封装

2、创建模块进行测试

2.1 创建模块:h-springboot-param

20-SpringBoot的参数接收和基本注解_请求头

2.2 编写controller来测试上面的注解或API
  • 测试路径变量@PathVariable
    20-SpringBoot的参数接收和基本注解_请求头_02

20-SpringBoot的参数接收和基本注解_mvc_03

结果如下
20-SpringBoot的参数接收和基本注解_取值_04

  • 测试@RequestHeader,获取请求头

    该注解可以获取请求头中单某一部分,也可以获取请求头中的所有东西,请求头内容如下
    20-SpringBoot的参数接收和基本注解_ico_05

    我们获取其中的User-Agent中的内容或者和上面的一样把请求头的所有内容放进一个map集合中
    20-SpringBoot的参数接收和基本注解_ico_06

20-SpringBoot的参数接收和基本注解_spring_07

20-SpringBoot的参数接收和基本注解_取值_08

  • 测试获取请求参数注解@RequestParam

    这个注解是获取请求路径上的参数,可以将发送过来的某一个变量的一个参数赋值给处理器方法中的某一个变量,也可以将一个变量的多个参数值赋值给一个处理器方法中的集合变量(一般定义为List集合)。除此之外,该注解的源码中也提到和上面两个注解一样的注释,即可以在处理器方法中用一个集合变量将请求路径上的参数封装进来。
    20-SpringBoot的参数接收和基本注解_取值_09

20-SpringBoot的参数接收和基本注解_ico_10

结果如下
20-SpringBoot的参数接收和基本注解_mvc_11

  • 测试获取cookie值得注解:@CookieValue
    20-SpringBoot的参数接收和基本注解_mvc_12

    我们使用该注解获取上图中的isg这个cookie的值,当然我们从注解的源码中也知道,可以在处理器方法定义一个Cookie类型的变量来获取发送过来的某个cookie对象。
    20-SpringBoot的参数接收和基本注解_取值_13

20-SpringBoot的参数接收和基本注解_mvc_14

结果如下
20-SpringBoot的参数接收和基本注解_请求头_15

20-SpringBoot的参数接收和基本注解_取值_16

  • 测试获取请求体参数注解:@RequestBody

    该注解是获取请求体中的参数,需要发送的是POST请求,所以我们用Postman进行测试。
    20-SpringBoot的参数接收和基本注解_请求头_17

    结果如下
    20-SpringBoot的参数接收和基本注解_请求头_18

  • 测试获取request域中属性的注解:@RequestAttribute

    我们写两个处理器方法,一个处理器方法中存储一个数据到请求域中,并进行转发到另一个处理器方法,这另一个处理器方法进行取值,返回到浏览器。
    20-SpringBoot的参数接收和基本注解_mvc_19

20-SpringBoot的参数接收和基本注解_ico_20

  • 测试获取矩阵变量值得注解:@MatrixVariable

    了解在URL中什么是矩阵变量。

    1、首先,矩阵变量是和路径变量在一起的,就是说路径变量中包含矩阵变量
        如这条路径:/cars/{userId}?xxx=sss&yyy=mmm
        其中{userId}就是路径变量,?后面的是请求参数
        一般情况下,路径变量就是一个值,我们可以直接用@PathVariable这个注解取值
        即:/cars/1?xxx=sss&yyy=mmm
    
    2、矩阵变量就是路径变量中前面值分号后面的那部分
        比如{userId}=1;age=2;name=boss
        /cars/1;age=2;name=boss?xxx=sss&yyy=mmm
        这时1后面的各个key-value就需要用@MatrixVariable注解来取值了
        矩阵变量的一个key可以有多个值,写法如下
        /cars/1;age=2;name=boss;name=boss2;name=boss3?xxx=sss&yyy=mmm
        /cars/1;age=2;name=boss,boss2,boss3?xxx=sss&yyy=mmm
        
    3、有时候我们有这样的需求,即URL中有两个或以上的路径变量,其中多个矩阵变量中有重名的key,那么我们需要获取哪个路径变量就需要用到该注解的一个属性:pathVar,即这个属性的值填的是路径变量名。表明取出的是哪个路径变量中的矩阵变量。
    
    

    应用场景

    当我们禁用cookie后,存储jsessionid的cookie就没办法发送了。需要让服务器知道我们当前的请求仍然是同一个用户,我们不能直接在路径的后面添加如:/abc?jsessionid=xxxx 的样子将jsessionid放到参数位置,这样就无法区分和普通参数的区别了,后台没法识别。所以需要进行URL重写

    即在可以当做路径变量的位置添加矩阵变量:/abc;jsessionid=xxxx

    所以我们得出结论,矩阵变量一般代表的是cookie对象类型的key-value。后台就是将矩阵变量中的key-value当做cookie中的key-vakue
    20-SpringBoot的参数接收和基本注解_请求头_21

    当我们启动项目访问该处理器方法时,会出现请求错误的页面
    20-SpringBoot的参数接收和基本注解_mvc_22

    原因是springboot默认禁用掉了矩阵变量的功能,需要手动开启

    这个和WebMvcAutoConfiguration有关。我们找到这个自动配置类的源码,查看其中的一个路径映射配置的方法
    20-SpringBoot的参数接收和基本注解_ico_23

    在查看UrlPathHelper这个帮助器的源码,可以看到有一个属性,这个属性翻译过来是移除分号内容,是一个布尔类型,默认是TRUE
    20-SpringBoot的参数接收和基本注解_mvc_24

    下载源码,再查看一些这个属性的相关说明
    20-SpringBoot的参数接收和基本注解_ico_25

20-SpringBoot的参数接收和基本注解_mvc_26

我们想手动开启矩阵变量,或者说关闭这个截断设定,需要弄清对路径处理的原理。

对UrlPathHelper进行解析。我们对SpringMvc进行配置。

就是写一个配置类实现WebMvcConfigurer接口,重写其中的某个方法更改removeSemicolonContent属性的值,交到spring容器中。我们查看WebMvcAutoConfiguration中的一个静态内部类WebMvcAutoConfigurationAdapter也是实现WebMvcConfigurer这个接口
20-SpringBoot的参数接收和基本注解_spring_27

而这个内部类中的正好是路径映射方法的配置
20-SpringBoot的参数接收和基本注解_取值_28

所以我们在自己的配置类中按照上图步骤关闭URL的分号截断设置
20-SpringBoot的参数接收和基本注解_mvc_29

20-SpringBoot的参数接收和基本注解_请求头_30

我们也可以不实现这个接口,直接在这个配置类中写一个方法返回WebMvcConfigurer对象,方法内容中写一个匿名内部类。然后用@Bean把返回的这个WebMvcConfigurer对象放进容器中,然后生效
20-SpringBoot的参数接收和基本注解_ico_31

测试:

  • 路径中只有一个路径变量的URL
    20-SpringBoot的参数接收和基本注解_请求头_32

    结果
    20-SpringBoot的参数接收和基本注解_取值_33

  • 路径中有两个或两个以上的路径变量,具体如下
    20-SpringBoot的参数接收和基本注解_请求头_34

    结果如下
    20-SpringBoot的参数接收和基本注解_取值_35