spring mvc中@RequestBody注解的作用是什么


这篇文章主要介绍“springmvc中@RequestBody注解的作用是什么”,在日常操作中,相信很多人在springmvc中@RequestBody注解的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springmvc中@RequestBody注解的作用是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),所以只能发送POST请求。GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。jQuery中,$.ajax()默认发送的参数类型及编码为:application/x-www-form-urlcoded,而@RequestBody处理的参数类型及编码为:aplication/json或者是application/xml,通过contentType属性来指定在传递之前,对JSON对象要使用JSON.stringify(),JSON.stringify() 方法将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、数组、集合、对象等等(即:当,@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)通过Http传递参数一般有两种方式,一种是通过url解析参数,一种是通过body来解决,那么我们本次说的RequestBody就是去解析请求体然后映射到我们的参数,那它该如何解析body呢?这就是本篇博客诞生的目的。这个其实是SpringMVC中做的一个处理机制,在整个SpringMVC的处理流程中,会通过HandlerMethod来代理每个Map后的controller和method,在通过反射invoke method的过程中,会解析request来获得arguments,而@RequestBody就是在解析参数的这个过程中起作用的在InvocableHandlerMethod#getMethodArgumentValues中,它会遍历当前HandlerMethod的参数,对于每一个参数,它都会通过HandlerMethodArgumentResolverComposite#supportsParameter来判断是否可以被解析器解析,如果可以被解析,则通过HandlerMethodArgumentResolverComposite#resolveArguement进行解析对于@RequestBody来说,它对应的解析器是RequestResponseBodyMethodProcessor,那么,我们就深入到它的源码中来一探究竟:那么RequestResponseBodyMethodProcessor是如何被注册到resolver中呢?主要是在RequestMappingHandlerAdapter中:RequestMappingHandlerAdapter实现了HandlerAdapter这个接口,这个接口是MVC框架的SPI,DispatcherServlet通过此接口访问所有已安装的处理程序。HandlerAdapter主要是路由之后方法的适配器,DispatcherServlet在路由之后通过HandlerAdapter来执行真实的操作(handlerAdapter是通过HandlerMethod来执行的)对于RequestResponseBodyMethodProcessor来说,它实现了InitializingBean,在bean初始化之后会添加参数处理器和返回值处理器,对于参数处理器来说,内容如下:从图中我们可以看到,RequestMappingH免费云主机域名andlerAdapter在初始化的时候会把系统给定的,自定义的参数解析器加载到内存中。加入说,我们要自定义一个参数解析器,系统会在什么时候加载进入内存呢?我们发现RequestMappingHandlerAdapter#setCustomArgumentResolvers这个方法就是要去设置自定义参数解析器的,那么我们只需要找到它的调用方即可。我们只需要实现WebMvcConfigurer即可(这点关系到Spring的自动装配,暂时没有看到,先鸽一下)设计模式采用策略模式+工厂模式 + 组合模式:对于HandlerMethod的参数和返回值处理来说,对应着不同的处理方式,即对应着不同的策略,所以此处用的策略模式来处理的。至于HandlerMethodArgumentResolverComposite它则对应着策略工厂,同时,因为这个类实现了HandlerMethodArgumentResolver,所以它也是组合模式的变形,具体的策略类是HandlerMethodArgumentResolver类图如下:缓存处理在参数解析工厂中,刚开始的参数解析器是在刚启动时注册到list中,但是如果之后被使用的时候就会存放到map中,可以直接获得(key是MethodParam),提高路由效率对于url解析参数来说,有两个注解,分别是pathVariable(指一种占位符)和requestParam,对于body来说,有requestBody。不加注解,也可以直接把url转为对应参数或者实体类1.@PathVariable: www.666.com/web/62.@ReqeustParam: www.666.com/web?user=13.@RequestBody: www.666.com/web body中是json4.无注解:www.666.com/web?userId=1&pwd=2到此,关于“springmvc中@RequestBody注解的作用是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: CSS3怎么实现无限循环的无缝滚动效果

这篇文章主要讲解了“CSS3怎么实现无限循环的无缝滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3怎么实现无限循环的无缝滚动效果”吧!1. 使用CSS3来实现若要用CSS3的属性实现的话,非ani…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/30 19:50
Next 03/30 19:54

相关推荐