关于@RequestParam与@RequestBody注解
在SpringMvc后台进行获取数据,一般有三种:
1.request.getParameter(“参数名”)
2.用@RequestParam注解获取
3.Springmvc默认支持的数据类型接收参数,可直接通过controller方法参数对应jsp中请求参数name直接获取
@RequestParam的作用
简单一点说作用就是把请求中的指定参数名称传递给控制器里的形参值
属性
1. value / name:请求参数中的名称 (必写参数)
2. required:请求参数中是否必须提供此参数,默认值是true,true为必须提供
3. defaultValue:默认值
源码
关于是value属性还是name属性,可以理解源码注解的意思就是name的别名是value,value的别名是name。二者皆可,并且开发中两个都能获得参数,获得一样的结果。
1 public @interface RequestParam {
2 @AliasFor("name") String value() default "";
3
4 @AliasFor("value") String name() default "";
5
6 boolean required() default true;
7
8 String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
9 }
使用
@RequestParam
注解的 value
属性值没有对应上jsp中 name
值则会直接报400错误,因为 required
属性默认为 true
,如果加上 required=false
,没对应上则不会报错,而是获取值为 null
。
使用
1.用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)
@RequestParam可以接受简单类型的属性,也可以接受对象类型。(也就是说,无法传递json格式,如果传递json格式会报错400)
2.用来处理 multipart/form-data (表单上传的)
@RequestParam、@RequestBody、@ResponseBody使用
什么时候用@RequestParam呢,什么时候用@RequestBody呢。其实@RequestParam注解和@RequestBody注解是互补的。这样说大家就可以理解了吧。
A、@RequestParam注解接收可以是POST和GET方式,数据格式为application/x-www-form-urlencoded,发送方式为GET或者POST,可以把数据封装到Map集合中,,没有@RequestParam注解封装不成功。有注解不能封装到POJO中。
数据格式为application/json,发送方式为GET,可以封装到Map集合中,并且有值,没有注解不能封装到Map。有@ReuquesParam POST可以请求成功,但是没有值,为NULL。有注解不能封装到POJO中。
B、注意1:封装POJO对象中,不能使用注解,直接省略就可以自动封装到对象中。使用会报400。(发送json格式时,可以不是字符串,json对象即可)
不使用注解application/x-www-form-urlcoded数据格式,发送POST和GET都可以封装到POJO对象中。数据格式application/json,发送GET方式可以封装到POJO中。POST方式可以请求成功,但是值为NULL,也就是说不能用。
C、@RequestBody接收只能发送请求POST方式,因为GET没有请求体。数据格式是application/json,但是数据格式不能是application/x-www-form-urlencoded。当然还有其他数据格式可以自己了解下。该注解可以把数据封装到Map和POJO对象中。(该注解需要发送json字符串)
说到这里你们应该明白为何说@RequestParam和@RequestBody互补了吧。
D、封装List集合大家是不是有的封装不进去呢?上面的格式也要符合(abc)
@RequestParam:
get方式,数据格式application/x-www-form-urlencode或者application/json,发送数组,那么到后端的键变为key+[]也就是字符串"key[]",获取用key[]获取不是原来的key。
post方式,数据格式application/x-www-form-urlencode,发送数组,获取格式同上。
@RequestBody:
post方式,数据格式application/json,直接把请求体中的数组封装成List集合。
注意2:
a.只要是POST请求数据格式是application/json传送数据需要是json字符串格式,否则会报错,分别把里面的键值对看做一个变量;
b.POST请求方式发送application/x-www-form-urlencoded发送json字符串相当于一个变量,发送json对象相当于把每个键值对看做一个变量。都可以。
c.但是GET请求发送数据格式是application/json或者application/x-www-form-urlencoded传送数据不需要是json字符串,json对象即可,否则会报错。
1、封装到POJO对象的时候是不需要@RequestParam注解的。不用注解的时候数据格式application/x-www-form-urlcoded发送GET或者POST请求方式都可以的。数据格式为application/json是GET方式可以,POST方式可以请求成功,但是值为NULL。封装Map对象的时候需要有注解@RequestParam注解,否则封装不能成功。
关于@RequestParam传json的方法以及@RequestBody的详解以后再补
参考链接:https://blog.csdn.net/qq_40470612/article/details/104225419
https://blog.csdn.net/m0_48983233/article/details/109701540
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!