-
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
- 最后解析后返回getmodel(map也是这样)
- model和map如何放在请求域中?
- 目标方法执行完成后,将所有的数据放在ModelAndViewContainer
- 目标方法返回一个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