• springboot5:底层接受的传参类型


    一.传参为注解

    1.形参中的注解

    • @PathVariable(“id”) Integer id
      • “/car/{id}” 获取路径变量上的值,用路径变量id赋值给形参id
      • 也可 @PathVariable Map pv,把路径变量的kv都提取出来放到map中
    • @RequestHeader(“User-Agent”) String userAgent
      • 获取请求头中名为"User-Agent"的参数 ,即获取浏览器信息
      • 也可@RequestHeader Map header,把请求头的kv都提取出来放到map中
    • @RequestParam(“age”) Integer age
      • /car?age=10获取请求参数中为age的值,用请求参数age赋值给形参age
      • @RequestParam(“inters”) Map inters,把所有的请求参数的kv都提取出来放入Map中
    • @CookieValue(“_ga”) String _ga
      • 获取cookie中的_ga的值
      • @CookieValue(“_ga”) Cookie cookie,把整个cookie的值放入cookie中
    • @RequestBody String content(Post请求才有)
      • 拿到post请求中的请求体内容(表单中的数据),把请求体的数据放入content中
    • @RequestAttribute(“msg”) String msg
      • 获取request域中的值(请求转发过来的数据,上一个controller已经request.setAttribute(“msg”,“成功”)
    • @MatrixVariable(“low”) Integer low
      • 查询字符串 /cars/{path}?xxx=xxx&xxx=xxx
        矩阵变量 /cars/sell;low=34;brand=byd,audi ;矩阵变量中最开始的一个是真正的访问路径,后面是矩阵变量
      • href=“/cars/see;low=34;brand=byd,audi” 可在形参中用
        @getmapping(“/chars/{path}”)
        @MatrixVariable注解来获取矩阵变量的值
      • 其他例子
        • @GetMapping(“/boss/{bossId}/{empId}”)直接用会有歧义。故可以设置pathVar
          @MatrixVariable(value = “age”,pathVar = “bossId”) Integer bossAge,
          @MatrixVariable(value = “age”,pathVar = “empId”) Integer empAge
      • 原理解析使用时注意 springboot默认禁用掉了矩阵变量功能,需要手动开启,对于路径的处理
        • 在webMVCConfigurer配置类中
        • 使用urlPathhelper解析,其中有一个属性是判断是否移除分号内容。
        • 我们需要自定义一个配置类 webMVCConfigurer或者直接返回一个webMVCConfigurer到IOC容器中
        • 在里面定义一个urlpathhelper解析,然后set该属性为true即可

    2.形参注解解析

    ①handler中的形参注解如何解析出请求并且转换为形参的?

    • 先从handlermapping中找到具体的handler处理请求
    • 为当前handler寻找到一个适配器handlerAdapter
      • 目前有四种handlerAdapter
        • requestmappingHandlerAdapter(默认得到) 支持方法上标注@requestMapping的
        • …支持函数式编程
    • 具体的handlerAdapter去执行目标方法
      • 具体执行过程
      • 先为目标方法封装了一个argumentResolvers参数解析器(确定执行目标方法的参数值)
        • 寻找使用哪种参数解析器(当前解析器是否支持解析这种参数,支持就解析)
        • RequestParam
        • PathVariable
      • 为目标方法封装了一个retturnValueHandler返回值处理器(确定目标方法的返回值)
        • ModelAndView
        • ResponseBody
      • 封装完成之后执行目标方法(先确定形参的值,调用目标方法,)
        • 如何确定形参的值:
          • 获取方法中所有参数的详细信息(注解和类型)
          • 循环参数解析器(哪个能支持解析该参数,各种注解解析器,每个相同注解又有多个处理返回结果的解析器)
            • 判断是否标某个注解
            • 标注某个注解后判断map还是普通
          • 解析具体参数的名称(正则表达式)
          • 在request域中获取该参数的值

    二.传参为Servlet API

    1.具体使用

    • public String goToPage(HttpServletRequest request)

    2.原理解析

    • 找argumentResolvers参数解析器时
      • 用ServletRequestargumentResolvers解析器(支持)
        • 判断类型是否为…原生提供的封装
      • 解析

    三.传参为复杂参数(Model,Map数据会被放在request请求域中)

    1.具体使用

    • public String testparam(Model model)
      • model最后会当做request.setAttribute()
      • model,map,request都是给request域放数据

    2.原理

    • 找argumentResolvers参数解析器时
      • 用ModelmethodArgumentResolver
        • 判断参数类型是否没model.calss
    • 最后解析后返回getmodel(map也是这样)
    • model和map如何放在请求域中?
    • 目标方法执行完成后,将所有的数据放在ModelAndViewContainer
      • 包含去的地址view
      • 包含model和map的数据
    • 目标方法返回一个mv(ModelAndView)
    • 处理结果
      • 处理派发view(渲染页面,解析视图,视图解析器,得到视图名)
      • 处理mv中的数据到request域中(把mv数据保存到request域中)
        • 将mv中model封装到hasmap
        • 获取原生request,将hasmap放入request域中

    四.处理自定义对象参数

    1.表单中所有属性对应类的每个属性

    • 希望直接封装为Person person(数据绑定)

    2.原理解析

    • 找argumentResolvers参数解析器时
      • 用ServletModelAttributeMethodProcesspr参数解析器
        • 判断是否是简单类型(自定义类型不是简单类型)
    • 拿到参数解析器(如何解析)
      • 先创建一个空person对象
      • 封装请求数据到webDataBinder(web数据绑定器)
        • 绑定器中还有很多类型转换器converter(124个)
      • 利用web数据绑定器将数据封装到javabean中
        • 里面各种循环 利用反射获取javabean的类型,利用web绑定器的类型转换器(循环寻找哪一个可以转换成功)转换类型后进行绑定
    • 数据绑定器就在webMVC配置类中有初始化到IOC容器中

    3.自定义数据

    • 封装类时 name=pet value=“阿猫,3”,此时springmvc中不知道如何转换value数据到类的类型
    • 自定义converter
    • 在webmvcConfigure配置类中加入方法的重写addFormatters
    • 里面新建一个
      • new converter
      • 重写里面的方法 public Pet Convert(String source)
      • 然后利用以逗号分割source赋值给pet的各个属性最后返回pet即可
  • 相关阅读:
    数据量大、类型多!数据资产管理如何确保安全合规“不掉队”?
    【在SpringBoot项目中使用Validation框架检查数据格式】
    【力扣每日一题】2023.9.10 打家劫舍Ⅳ
    02:项目二:感应开关盖垃圾桶
    docker报错解决方法
    Servlet | Servlet原理、开发第一个带有Java小程序Servlet
    临时增加ASM diskgroup做备份用要及时取消,否则去掉DG 导致CRS 重启
    R语言七天入门教程四:对象数据类型
    ptmalloc源码分析 - 多线程争抢竞技场Arena的实现(04)
    十八、字符串(2)
  • 原文地址:https://blog.csdn.net/qq_44724899/article/details/127860191