springboot接收参数注解,springboot注解大全以及怎么实现的
00-1010 1请求映射1.1 Rest风格1.2表单提交到Rest的原则1.3请求映射的原则2请求处理的常见注释2.1 @ Request param 2.2 @ path variable 2.3 @ Request header 2.4 @ Request body 2.5 @ Request attribute 2 .6 @RequestAttribute3方法参数提示3.1复杂参数属性值3.2自定义参数实现数据绑定
00-1010在SpringBoot中使用@XxxMapping注释完成前端请求和后端方法之间的映射。在过去,通常使用url映射命名来完成添加、删除和搜索的操作,例如:/getUser查找用户/deleteUser删除用户/editUser更改用户/saveUser添加用户。然而,Rest式的请求方法应运而生,并一直沿用至今。
00-1010 REST风格是用HTTP请求动词来表达添加、删除、检查资源等操作,例如:GET查找用户DELETE删除用户PUT更改用户POST添加用户。具体用途如下:
但是,前端表单只有POST和GET方法。如何使用PUT和DELETE方法?这就使用了HiddenHttpMethodFilter,它使用了源代码的WebMvcAutoConfiguration自动配置类中的OrderedHiddenHttpMethodFilter方法(方法的源代码在下面),其中返回了它的同名类对象。这个类的父类HiddenHttpMethodFilter向上两级定义了如何使用PUT和DELETE方法(源代码见下图)。
@ bean @ conditionalonmissingbean({ hiddenHttpMethodFilter . class })//这里的隐藏方法过滤器默认是不打开的,下面的前缀和名称可以用来在配置文件中将其配置为true @ conditional property(prefix= spring . MVC . hidden method . filter ,name={ enabled })public ordered hiddenHttpMethodFilter hiddenHttpMethodFilter(){ return new ordered hiddenHttpMethodFilter();}
了解了源代码的规格之后,我们来试着编码一下。总结上面的话,我们知道如果要使用Rest风格的请求,需要做两步:打开配置文件中的隐藏方法过滤器(据说在SpringBoot的高版本源代码中是默认打开的)表单form的方法是POST,添加_method的值作为对应的PUT和DELETE。
当00-1010表单由Rest风格的请求提交时,它将在输入标记中引入相应的PUT和DELETE of _method值。当请求发出后,会被HiddenHttpMethodFilter拦截,做出判断(表单的方法是否为POST,没有错误)。判断通过后,会得到_method对应的值。本机请求(post)的包装器模式XxxWrapper覆盖getMethod方法并返回by _method传入的值。后面的控制器方法中url映射的方法的值是方法重写后得到的传入值。
例如,如果表单的方法只有两个值,POST和GET,则需要打开配置文件中的隐藏方法筛选器。对于其他人来说,如果PostMan直接发送Put和delete请求,就不需要使用HiddenHttpMethodFilter根据四个配置开发的四个新注释。
customizing _method name的方法:自定义一个webConfig类创建一个HiddenHttpMethodFilter方法,调用其setMethodFilter方法实现自定义。
00-1010 Spring Boot和SpringMVC一样,前端发出的所有请求肯定都会去DispatcherServlet,dispatcher Servlet本身就是一个servlet,继承自HttpServlet。一个servlet必然会重写doGet和doPost方法,所以通过分析源代码,发现HttpServlet的一个子类FrameworkServlet(也是Dispatch
erServlet的父类)中重写了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.6 @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类的参数)进行绑定
到此这篇关于SpringBoot2零基础到精通之映射与常用注解请求处理的文章就介绍到这了,更多相关SpringBoot2 映射与常用注解内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。