【SpringBoot 2】(七)请求处理——映射 常用注解 方法参数的小技巧

写在前面在这里插入图片描述🛫更多知识总结见SpringBoot 2专栏
🚕本篇知识点总结自尚硅谷雷神的视频
🚒博主对于该知识尚在学习阶段
🚄如果发现存在问题请毫不吝啬的指出
🚀🚀扎哇太枣糕的博客首页🚀🚀

文章目录

  • 1 请求映射
    • 1.1 Rest风格
    • 1.2 表单提交Rest的原理
    • 1.3请求映射的原理
  • 2 请求处理常用注解
    • 2.1 @RequestParam
    • 2.2 @PathVariable
    • 2.3 @RequestHeader
    • 2.4 @RequestBody
    • 2.5 @RequestAttribute
    • 2.5 @RequestAttribute
  • 3 方法参数小技巧
    • 3.1 复杂参数属性值
    • 3.2 自定义参数实现数据绑定

1 请求映射

  在SpringBoot中使用@XxxMapping注解完成前端请求与后端方法的一个映射。以前的时候,通常使用url映射命名的方式完成增删改查的操作,比如:/getUser 查找用户/deleteUser 删除用户 /editUser更改用户 /saveUser 添加用户。但是,后来出现了Rest风格的请求方式一直沿用至今。

1.1 Rest风格

  Rest风格就是使用HTTP请求方式动词来表示对资源的增删改查等操作,比如:GET查找用户DELETE删除用户PUT更改用户 POST添加用户。具体使用如下:
在这里插入图片描述  但是前端form表单的method只有POST、GET两种方法,如何使用PUT、DELETE两种方法呢?这就使用到了HiddenHttpMethodFilter,在源码的WebMvcAutoConfiguration自动配置类中使用OrderedHiddenHttpMethodFilter方法(方法源码在下面),其中返回它同名类对象,该类向上两层的父类HiddenHttpMethodFilter中定义了如何使用PUT、DELETE两种方法(源码见下面图片)

@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
// 这里的隐藏方法过滤器默认是不开启的,通过下面的prefix和name即可在配置文件将其配置为true
@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter",name = {"enabled"}
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {return new OrderedHiddenHttpMethodFilter();
}

在这里插入图片描述  了解源码的规范之后,让我们试着进行编码,总结上述文字得知:若想使用Rest风格的请求,需要进行两步操作配置文件中开启隐藏方法过滤器(据说高版本的SpringBoot源码中默认是开启的)form表单的method为POST并加入_method的值为相应的PUT、DELETE
在这里插入图片描述

1.2 表单提交Rest的原理

  表单在使用Rest风格的请求方式提交的时候,会带上input标签里_method的对应值PUT、DELETE,当请求发送过来的时候将会被HiddenHttpMethodFilter所拦截进行判断(form表单的method是否为POST且无报错),判断通过之后获取_method对应的值。原生request(post)的包装模式xxxWrapper重写了getMethod方法,返回的是_method传入的值。后面的controller方法中url映射的method的值就是经过方法重写之后获得的传入值。

⚠  像form表单的method只有POST、GET两个值的情况需要将配置文件中的隐藏方法过滤器开启,别的如PostMan直接发送Put、delete等方式请求就无需使用HiddenHttpMethodFilter
⚠  根据四种配置演变出的四个新注解在这里插入图片描述⚠  自定义_method名称的方法:自定义一个webConfig类类中来创建一个HiddenHttpMethodFilter方法,调用它的setMethodFilter方法即可实现定制在这里插入图片描述

1.3请求映射的原理

  SpringBootSpringMVC一样,前端发送的所有请求都一定会到DispatcherServlet中,而DispatcherServlet本身就是一个servlet继承自HttpServlet。一个servlet必定会重写doGet和doPost方法,于是通过对源码进行分析发现在HttpServlet的子类FrameworkServlet(它同时也是DispatcherServlet的父类)中重写了doGet和doPost方法,并且重写之后的doXxx方法都是调用了本类的processRequest方法,这个方法的底层又调用了本类的doService抽象方法,抽象方法没有方法体,继承该类的子类必须重写该方法,于是乎在它的子类中找到了重写之后的doService方法,这个方法中除了前面一大堆的初始化之外调用本类的doDispatch方法(这个才是最重要的一个方法)在这里插入图片描述
  从上文的析得知,SpringMVC的功能都要从DispatcherServlet类的doDispatch方法中分析得出,此方法使用getHandler(processedRequest)有参构造器里的对获取到的所有请求使用for循环逐个匹配下面的handlerMappings,而前两个都是在WebMvcAutoConfiguration自动配置类中配置过的。
在这里插入图片描述

⚠  拓展知识:如果一些特殊场景需要对不同的请求映射不同的代码包,比如普通用户和VIP用户的功能肯定是不一样的,所以在此时我们就可以借助给容器中注册自定义HandlerMapping的方式来完成。

2 请求处理常用注解

  以下的注解都可以通过键名获取单个键的值,也可以使用map集合(kv都是必须String)获取所有的参数

2.1 @RequestParam

  @RequestParam注解用来获取请求参数的值在这里插入图片描述

2.2 @PathVariable

  在Restful请求风格中,通常使用路径的方式进行参数的传递,@PathVariable注解就是用来获取url路径中参数的值在这里插入图片描述

2.3 @RequestHeader

  @RequestHeader注解用来获取请求头的值在这里插入图片描述

2.4 @RequestBody

  @RequestBody注解用来获取请求体的值
在这里插入图片描述

2.5 @RequestAttribute

  @RequestAttribute用来获取request域的值,两种获取方式:直接@RequestAttribute注解 HttpServletRequest对象的getAttribute方法。这个注解无法使用map获取所有的值在这里插入图片描述

2.5 @RequestAttribute

  使用session.set(k, v)设置的属性值存储在session中,而每个用户都有其唯一对应的jsessionid保存在cookie中,每次发送请求cookie都会携带这个jsessionid,服务器通过jsessionid解析出session对象之后再调用get(k)方法获取对应的属性值。
  但是现在有这么一个情况,在页面开发的时候禁用了cookie(相当于session也失效了),这个时候怎么获取属性值?通过url重写使用矩阵变量的方式进行传递。使用该方法需要有以下两步:

第一步: SpringBoot默认禁用矩阵变量,可通过自定义配置类向容器注册WebMvcConfigurer组件替代默认的组件来开启矩阵变量在这里插入图片描述第二步: 分单矩阵和多矩阵两种用法在这里插入图片描述在这里插入图片描述

3 方法参数小技巧

3.1 复杂参数属性值

  方法中有时会传入一些复杂的参数,比如Map、Model、request、response等,其中前三种参数的设置的属性值数据都会存放在request请求域中。接下来使用代码证实一下这个说法:在这里插入图片描述

3.2 自定义参数实现数据绑定

  页面提交的请求数据(GET、POST)都可以和自定义对象参数的属性(也就是POJO类的参数)进行绑定在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北方人思想为什么落后_广西人为什么很少到北方打工?

广西虽然山青水秀,环境优美,但目前还是个经济欠发达的地区,很多人在本地很难找到合适的工作,所以纷纷选择外出打工了,包括我自己。在广西外出打工的人群当中,绝大部分人都去了广东,当然&#xf…

刷网络课_网络营销实践心得—刘荟萌

一、实践时间2020.9.1~2020.12.25二、实践内容1、实践资源准备:实践平台账号注册、了解相关网站的使用方法。2、认识网络营销系统:企业网络营销信息源类别及传递渠道调查。3、信息源构建:微信公众号运营、新媒体平台运营(微博、博客)4、网络推…

【SpringBoot 2】(八)数据响应 页面响应

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

2020年最快的dns_2020年哪里换旅行证最快取证?需要几天?

关注我的都知道了很多的实用攻略你还在等什么~美妈不论去哪个地方更换旅行证,都喜欢问“这个地方是否可以加急?”“最快几天可以拿到新的旅行证?”今天就来整理一下2020年各地换证需要几天,是否可以加急。"目前更换旅行证有两…

语句拼接_Linux 进阶语句

日常工作需要用到,shell语句用于分析定位生产问题,本次做个记录# 将日志先拷贝到当前目录cp /tmp/nginx.log .本次目标是: 找出log中的404 500的报错#使用管道取出相关日志less nginx.log 通过/ 查询得知 状态码处于第9个字段#使用 awk 筛选出…

【SpringBoot 2】(九)异常处理 web原生组件的注入

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

项目管理最佳实践方法_项目管理最佳实践,企业如何进行有效的项目管理

前言:企业在划分项目时,可按照项目的复杂程度、管理范围等将项目分为三个级别,分别是企业级、部门级和小组级(与目标划分原则相同),然后将每一级的目标与项目对应起来。我们知道,企业制定的目标…

【SpringBoot 2】(十)数据库相关

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

【SpringBoot 2】(十一)单元测试JUnit 5 指标监控

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

多个containers 共用一个pvc_2020阜新PVC-UH市政管厂家-烟台塑胶

2020阜新PVC-UH市政管厂家烟台金沃泉塑胶有限公司主要产品PVC-U、PVC-M、PVC-UH聚氯乙烯给给水管材、HDPE高密度聚乙烯给水管材、CPVC氯化聚氯乙烯、MPP高压电力电缆护套管、PERT-Ⅱ型热力管道、高分子托辊管、水处理膜壳管。公司为电网、南方电网、电建集团、建筑集团、五矿集…

【SpringBoot 2】(十二) profile功能 自定义starter

写在前面🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

pb 怎么判断是 小数_考试90分以上的孩子是怎么学数学的?听听老师怎么说?

一二年级,考试上九十分很轻松。但是,不少小朋友一上三年级,成绩就落下来了。那么,我们来看看三年级起,考试还能够保持在90分以上的孩子是怎么学习数学的吧!第一,计算能力过关通过这两张图片的对…

快速上手Mybatis-Plus 入门案例

写在前面🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

黑苹果 选择语言 点不了_什么是天然的“黑钻”?—科普贴

天然黑钻也被成为“碳酸氢”,具有与白钻相同的化学成分,然而黑钻石的晶体结构是不同的,这意味着它们由许多小晶体组成,它们以随机的形式粘在一起,而不是一个具有可识别自然线的固体锥形。天然黑钻石有极高的含物&#…

sim卡没坏但苹果手机无服务_解决手机插SIM卡后都显示“无SIM卡”的故障问题

故障现象顾客描述手机插SIM卡后都显示“无SIM卡”。维修过程引起插入SIM卡却显示“无SIM卡”的故障,除了可能是SIM卡座的供电、时钟、复位及SIM卡插入检测信号不正常导致外,还有可能是基带不正常导致的。插上手机卡,左上角提示“无SIM卡”&am…

Mybatis-Plus实现简单的增删改查 实体类上的注解

写在前面🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

conda失败说没有写权限_爱情中,为什么男生表白失败,女生还说可以继续做朋友,想过没有...

在爱情中,不是每个男生都是幸运的,也不是每次的表白都是如你所愿的。有成功总有失败,成功是喜悦的,但是失败却是痛苦的。不过有的时候男生和女生表白以后,女生对男生说了这样的一段,其实我希望以后我们还是…

Mybatis-Plus中Wrapper条件构造器的使用

写在前面 🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀&#x1f680…

springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...

前言在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈。此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不?今天陈某教你一…

Mybatis-Plus的分页 乐观锁插件 通用枚举 多数据源

写在前面🛫更多知识总结见Mybatis-Plus专栏 🚕内容总结自尚硅谷杨博超老师的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…