spring服务器接收参数格式
注:@RequestParam 或@RequestBody等注解是否添加有什么区别
不加:参数可有可无;无参数时为null,当参数是数字的引用类型无参数时也为null,但当参数类型是 数字基本类型(int、double)时会报错;
加上@RequestParam 或 @RequestParam(“ 参数名”):必须传参;
添加@RequestParam(value=“ 参数”, required = false):效果同不加注解;
添加@RequestParam(value=“ 参数”, required = false,defult=“默认值”):不论是否传参都不会报错;
在springMVC中,controller中方法的参数是自动注入的,在使用注解的方式下,通常有:
@RequestParam: ·取querystring当中的参数
@PathVariable: 取 在@RequestMapping中定义的占位符中的参数(/test/{id})
@RequestBody: 取request 这个消息体 (可以组装json对象)
在不使用注解的情况下,默认有一些对象可以自动注入如:
HttpServletRequest
HttpServletResponse
MultipartFile
MultipartRequest
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、
数组、集合、对象等等(即:当,@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收
参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value
里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。
即:如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到;
如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或
则形参前 什么也不写也能接收。
注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通
过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400。
注:如果参数前不写@RequestParam(xxx)的话,那么就前端可以有可以没有对应的xxx名字才行,如果有xxx名
的话,那么就会自动匹配;没有的话,请求也能正确发送。
追注:这里与feign消费服务时不同;feign消费服务时,如果参数前什么也不写,那么会被默认是@RequestBody的。
除此之外不使用注解的情况下,也可以接受前台传入的querystring中的参数
1、从querystring中的参数中获取:
@RequestParam:接受对象类型(Integer、String、Boolean等基本数据类型),不能接收自定义类型。
不带注解:接受基本数据类型,若接收类型为自定义类型,会组装参数中与自定义类型属性名和类型相符的参数。
这种方式总结:
(1).获取自定义类型的对象时,不使用注解即可以获取
(2).在组装对象时可以使用以被获取过的参数
注意:$.ajax contenType是appliation/json的时候,在后台用spring mvc的@Requestparam注解接收参数,始终接收不到。因为@RequestParam 底层是通过request.getParameter方式获得参数的,也就是说,@RequestParam 和 request.getParameter是同一回事。
所以@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容(及表单内容数据),提交方式GET、POST。
2、从请求体(body)中获取(及获取对象数据)
当请求体中是一段json数据时,@RequestBody会解析该json字符串并将其注入指定的自定义类型中。
通过@RequestBody的方式可以接收以json数据传输的对象,但前提是请求的Content-Type必须为application/json,并且引入了jackson-databind包
注意:
1.@RequestBody该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
2.@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。
3.不使用@RequestBody注解时,可以接收Content-Type为application/x-www-form-urlencoded类型的请求所提交的数据,数据格式:aaa=111b b b = 222 。 f o r m 表 单 提 交 以 及 j Q u e r y 的 bbb=222。form表单提交以及jQuery的bbb=222。form表单提交以及jQuery的.post()方法所发送的请求就是这种类型。例如后台接口接收数据的对象前不加@RequestBody修饰。
3、接收前端传递的数组
接收数组可以使用注解方式的@RequestParam、@RequestBody或者无注解的方式,也可以同时使用他们三个
在接受数组时,默认按照方法的参数名来映射请求的参数,目前很多前端框架喜欢传递数组时在请求参数后面加上"[]",所以使用@RequestParam时可以规定value使之对应如@RequestParam(“ids[]”) Integer[] ids。
springmvc 实体与文件同时提交时需要注意的地方
//如果只是上传一个文件,则只需要MultipartFile类型接收文件即可,而且无需显式指定@RequestParam注解
//如果想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,并且还要指定@RequestParam注解
//并且上传多个文件时,前台表单中的所有<input type=”file” />
的name都应该是files,否则参数里的files无法获取到所有上传的文件
@RequestMapping(value = “/save”, method = RequestMethod.POST) public String saveDocinfo(DocInfo doc, @RequestParam MultipartFile[] files) { }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-08-02 php获取POST数据的三种方法
2018-08-02 Http请求中请求头Content-Type讲解
2018-08-02 5种PHP创建数组的方式
2018-08-02 js数组
2018-08-02 js发送get 、post请求的方法简介