【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专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀…

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

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

python 历遍子弹_python之子弹移动

"""新增功能:完成我方坦克发射子弹的移动"""import pygameimport timeimport randomwin_width 700win_height 500bg_color pygame.Color(0, 0, 0)text_color pygame.Color(255, 0, 0)class MainGame():window Nonemy_tank None…

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

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

线性分组码的最小汉明距为6_第二章 线性代数

2.1 标量、向量、矩阵和张量标量(scalar)一个标量就是一个单独的数,用斜体表示标量。向量(vector)一个向量是一列有序排列的数,用粗写的小写字母表示。矩阵(matrix)矩阵式一个二维数组,其中的么一个元素由两个索引(而非一个)所确定&#xff0…

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

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

sklearn中lstm_分别用sklearn和tensorflow做房价预测

原标题:分别用sklearn和tensorflow做房价预测本篇是后面用tensorflow做回归时的一个参照,忍不住要说的是sklearn真是简单好用,要不是他没有卷积cnn等时髦模型,真是不想用其他家的了。经典的sklearn集成模型结果:真是又…

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

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

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

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

jpa transaction 回滚_我遇到的JPA中事务回滚的问题

在最近的项目中,做的是解析XML文件,解析过程中会有异常,比如:XML文件中节点的数据和与之对应的数据库的字段中数据的类型不匹配;XML中数据长度超过数据库定义的长度;有数据了的重复插入问题;读取…

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

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

快速上手Mybatis-Plus 入门案例

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

交换机分布缓存_网络交换机缓存在数据中心的作用

什么产生了缓存?网络交换机要配置多少缓存才够用?缓存容量是否有标准可以衡量? 当网络交换机接口收到超出其所能处理的流量后,它会选择要么将其缓存,或者将其丢弃。 缓存通常都是因为网络接口速率不同造成的&#xff0…

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

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

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

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