SpringMVC—请求传参
1. 传递对象
如果参数比较多时,方法声明就需要有很多形参;并且后续每次新增一个参数,也需要修改方法声明.
我们不妨把这些参数封装为一个对象
;
Spring MVC 也可以自动实现对象参数的赋值,比如 Userinfo 对象:
我们对 Userinfo 定义属性:name ,gender ,age,并且通过下列方式,重写 getter
,setter
,toString
方法:
package com.example.springmvc_demo;public class Userinfo {private String name;private Integer gender;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Userinfo{" +"name='" + name + '\'' +", gender=" + gender +", age=" + age +'}';}
}
传递对象代码实现:
我们启动程序,通过 Postman 构造请求:
如果我们把属性的 Integer 设置成 int,并且不传值 (取消勾选),也不会报错,默认为0;
我们在传递对象时,设置的属性名字,必须与后端代码中的对应属性的名字相同!
2. 后端参数重命名(后端参数映射)
某些特殊的情况下,前端传递的参数 key 和我们后端接收的key可以不一致;
比如
前端
传递了一个 kw 给后端,而后端
是使用 keyword 字段来接收的;这样就会出现参数接收不到的情况;
如果出现这种情况,我们就可以使用
@RequestParam
来重命名前后端的参数值
具体示例如下,后端实现代码:
使用 Postman 发送请求并传参,通过传参结果我们可以知道,对于前端命名的 kw
是可以正确传参的:
但是,如果我们使用后端命名的 keyword
,则无法传参:
我们查看错误日志:
报错信息的意思是:方法参数类型的所需请求参数‘kw’不存在
因此,我们加了注解 @RequestParam("kw")
后, kw 这个参数就是必须传递的了;
但是我们刚刚在 Postman 构造请求时,并没有使用 kw 参数,keyword 是前端的 kw 赋值的,而不是r6 方法中,传入的参数 keyword
;
结论:
使用
@RequestParam
进行参数重命名时,请求参数
只能和@RequestParam
声明的名称一致
,才能进行参数绑定和赋值;使用
@RequestParam
进行参数重命名时,参数就变成了必传参数
;
3. 非必传参数设置
如果我们的实际业务前端的参数是一个非必传的参数
,针对上述问题,如何解决呢?
先来了解下参数必传的原因
,我们查看@RequestParam
注解的实现细节,就可以发现端倪,注解实现如下:
可以看到 required
的默认值为 true
,表示含义就是:该注解修饰的参数默认为必传
既然如此,我们可以通过设置 @RequestParam
中的 required=false
来避免不传递时报错;
具体实现如下:
可以看到,添加 required=false
之后,kw 前面也加了key,变成了 value =“kw”
注解属性赋值时,没有指明key的话,默认为 value 属性;
如果需要有多个属性进行赋值时,需要写上 key
重写运行程序,再次使用 Postman 发送请求,响应结果的值虽然为 null,但是没有报错:
4. 传递数组
Spring MVC可以自动绑定数组参数的赋值,后端实现代码:
注意打印数组的 Arrays.toString(kunkunLike)
打开 Postman ,重新构造数组请求:
也可以这样:
5. 传递集合
运行程序,使用 Postman 发送请求:
说明如果要传递集合,我们的后端代码是不可以这样写的;
我们查看错误日志:
错误日志的意思是:没有为接口java.util.List找到主要的或唯一的构造函数
但是错误日志并不是根本原因,要想解决问题,传递参数,我们就需要使用@RequestParam绑定参数关系
集合参数:
- 和数组类似,同一个请求参数名有为多个,且需要
使用@RequestParam绑定参数关系
默认情况下,请求中
参数名相同的多个值
,是封装到数组
;如果要封装到
集合
,要使用@RequestParam绑定参数关系
请求方式和数组类似: