SpringBoot六:获取请求参数汇总

获取请求参数汇总

导读
  1. 通过前面对JavaWEB和SpringMVC的学习,有通过servletAPI的,也有通过注解的

  2. 分为五类

    ① 注解

    ② Servlet原生API

    ③ 复杂参数

    ④ 实体类映射

    ⑤ 方法参数名与请求中的参数名保持一致

一、注解
  1. 获取参数的注解汇总表
    注解 使用场景
    1 @PathVariable 作用于RestFul风格的请求,标注在对应的方法参数前
    可以获取单个参数,也可以获取所有参数的Map
    2 @RequestHeader 获取请求头
    3 @RequestParam 对普通风格请求中参数的获取,即queryString查询字符串
    4 @CookieValue 有的请求可能没有cookie,会报错
    5 @RequestBody 只有post请求有请求体
    6 @RequestAttribute 和@RequestParam用法一样,
    用于获取存在request作用域中的数据
  2. @PathVariable测试

    可以获取单个参数,也可以获取所有参数的Map

    html

    <a href="/car/2/owner/zhangsan">获取请求参数测试a>
    

    controller

    @RestController
    public class ParamsTestController {
        @GetMapping("/car/{id}/owner/{username}")
        public Map<String,Object> restfulTest(@PathVariable("id") Integer id,
                                              @PathVariable("username") String username,
                                              @PathVariable Map<String,String> pv) {
            Map<String, Object> map = new HashMap<>();
            map.put("id",id);
            map.put("username",username);
            map.put("pv",pv);
            return map;
        }
    }
    

    Browser响应结果

    SpringBoot六:获取请求参数汇总_第1张图片

  3. @RequsetHeader测试

    html

    <a href="/car/2/owner/zhangsan">获取请求参数测试a>
    

    controller

    @RestController
    public class ParamsTestController {
        @GetMapping("/car/{id}/owner/{username}")
        public Map<String,Object> restfulTest(
                                           @RequestHeader("User-Agent") String userAgent,
                                           @RequestHeader Map<String,String> rh
        ) {
            Map<String, Object> map = new HashMap<>();
            map.put("userAgent",userAgent);
            map.put("rh",rh);
            return map;
        }
    }
    
    

    Browser响应结果

    SpringBoot六:获取请求参数汇总_第2张图片

  4. @RequestParam测试

    对普通风格请求中参数的获取

    html

    <a href="/car/2/owner/zhangsan?age=18&inters=basketball&inters=game">获取请求参数测试a>
    

    controller

    @RestController
    public class ParamsTestController {
        @GetMapping("/car/{id}/owner/{username}")
        public Map<String,Object> restfulTest(
                                              @RequestParam("age") Integer age,
                                              @RequestParam Map<String,String> rp
        ) {
            Map<String, Object> map = new HashMap<>();
            map.put("age",age);
            map.put("rp",rp);
            return map;
        }
    }
    

    Browser响应结果

    SpringBoot六:获取请求参数汇总_第3张图片

  5. @CookieValue测试
    @RestController
    public class ParamsTestController {
        @GetMapping("/car/{id}/owner/{username}")
        public Map<String,Object> restfulTest(
                                              @CookieValue("_ga") String _ga,
                                              @CookieValue Cookie cookie
                                              ) {
            Map<String, Object> map = new HashMap<>();
            map.put("_ga",_ga);
            map.put("cookie",cookie);
            return map;
        }
    }
    
二、矩阵变量@MatrixVariable
  1. 书写规则
    <a href="/car/sell;low=34;brand=byd,audi,yd">获取请求参数测试a>
    <a href="/car/sell;low=34;brand=byd;brand=audi;brand=yd">获取请求参数测试a>
    <a href="/boss/1;age=20/2;age=10">获取请求参数测试a>
    
  2. SpringBoot对矩阵变量默认是不生效的

    SpringBoot的web场景的底层是SpringMVC,SpringMVC的自动配置组件WebMvcAutoConfiguration中路径匹配配置方法中,调用了调用了UrlPathHelper对象

    public void configurePathMatch(PathMatchConfigurer configurer) {
        // 此处省略了部分源码
        if (servletUrlMapping.equals("/") && this.singleDispatcherServlet()) {
            // 调用了UrlPathHelper对象
            UrlPathHelper urlPathHelper = new UrlPathHelper();
            urlPathHelper.setAlwaysUseFullPath(true);
            configurer.setUrlPathHelper(urlPathHelper);
        }
    
        });
    }
    

    在UrlPathHelper类中,有一个属性是removeSemicolonContent=true,因为其作用是移除分号后的内容,故无法匹配矩阵变量

  3. 如何可以识别矩阵变量

    需要更改SpringMVC的配置,需要让自己创建的配置类实现 WebMvcConfigurer接口,然后重写configurePathMatch方法,设置removeSemicolonContent=false,并重置UrlPathHelper

    @Configuration(proxyBeanMethods = false)
    public class MyConfig implements WebMvcConfigurer {
        @Override
        public void configurePathMatch(PathMatchConfigurer configurer) {
            UrlPathHelper urlPathHelper = new UrlPathHelper();
            // 矩阵变量才能生效
            urlPathHelper.setRemoveSemicolonContent(false);
            configurer.setUrlPathHelper(urlPathHelper);
        }
    }
    
  4. 获取矩阵变量的controller
    @RestController
    public class MatrixTest {
        // 针对该方式的矩阵变量获取参数测试
        @GetMapping("/cars/{path}")
        public Map<String,Object> matrixTest(
                @MatrixVariable("low")  Integer low,
                @MatrixVariable("brand") List<String> brand,
                @PathVariable("path") String path) {
            Map<String, Object> map = new HashMap<>();
            map.put("low",low);
            map.put("brand",brand);
            map.put("path",path);
            return map;
        }
        
        // 针对该方式的矩阵变量 获取请求参数测试
    	@GetMapping("/boss/{bossId}/{empId}")
        public Map<String,Object> matrixTest1(
                @MatrixVariable(value = "age",pathVar = "bossId")  Integer bossId,
                @MatrixVariable(value = "age",pathVar = "empId")  Integer empId ) {
            Map<String, Object> map = new HashMap<>();
            map.put("bossId",bossId);
            map.put("empId",empId);
            return map;
        }
    }
    
  5. 浏览器响应结果

    SpringBoot六:获取请求参数汇总_第4张图片

    SpringBoot六:获取请求参数汇总_第5张图片

三、错误
  1. Required matrix variable ‘path’ for method parameter type String is not present

    SpringBoot六:获取请求参数汇总_第6张图片

  2. 解决方法

    ① 需要使用{path}来接收矩阵变量类型的请求参数

    ② 路径类型的请求参数需要使用注解@PathVariable

参考资料
  1. SpringMVC三:获取请求参数_e_nanxu的博客-CSDN博客

你可能感兴趣的:(SpringBoot,spring,boot,servlet,java)