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响应结果

    在这里插入图片描述

  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响应结果

    在这里插入图片描述

  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响应结果

    在这里插入图片描述

  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 {
        // 针对该方式的矩阵变量<a href="/cars/sell;low=34;brand=byd,audi,yd">获取参数测试</a>
        @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;
        }
        
        // 针对该方式的矩阵变量 <a href="/boss/1;age=20/2;age=10">获取请求参数测试</a>
    	@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. 浏览器响应结果

    在这里插入图片描述

    在这里插入图片描述

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

    在这里插入图片描述

  2. 解决方法

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

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

参考资料
  1. SpringMVC三:获取请求参数_e_nanxu的博客-CSDN博客
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

e_nanxu

感恩每一份鼓励-相逢何必曾相识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值