某些特殊情况下,前端传递的参数 key
和我们后端接收的 key
可以不一致,比如前端传了一个 time
给后端,而后端是使用 createtime
字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam
来重命名前后端的参数值
@RequestMapping("/m4")
public Object method4(@RequestParam("time") String createtime) {
return "收到参数:createtime="+ createtime;
}
可以看到,Spring
可以正确的把浏览器传递的参数 time
绑定到后端参数 createtime
上。此时,如果浏览器使用 createtime
进行参数传递呢?
错误日志信息为:
time
”不存在可以得出结论:
@RequestParam
进行参数重命名时,请求参数只能和 @RequestParam
声明的名称一致,才能进行参数绑定和赋值@RequestParam
进行参数重命名时,参数就变成了必传参数(不传参数的话就会报 400 错误)如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?
先来了解一下参数必传的原因,我们查看 @RequestParam
注解的实现细节就可以发现端倪,注解实现如下:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
可以看到,required
的默认值为 true
,表示含义就是:该注解修饰的参数默认为必传。既然如此,我们可以通过设置 @RequestParam
中的 require=false
来避免不传递时报错,具体实现如下:
@RequestMapping("/m5")
public Object method5(@RequestParam(value = "time", required = false) String createtime) {
return "接收到参数 createtime: " + createtime;
}
required=false
之后,time
前面也加了 key
,变成了 value=“time”
key
的话,默认为 value
属性key
Spring MVC 可以自动绑定数组参数的赋值。后端代码实现:
@RequestMapping("/m6")
public String method6(String[] arrayParam) {
return Arrays.toString(arrayParam);
}
数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数
%2c
是 ,
的意思,第二个解码后就是第三个。他们三个的浏览器响应结果都一样 集合参数:和数组类似,同一个请求参数名有为多个,且需要使用 @RequestParam
绑定参数关系
@RequestParam
绑定参数关系请求方式和数组类似,后端代码为:
@RequestMapping("/m7")
public String method7(@RequestParam List<String> listParam) {
return "size: " + listParam.size() + ", listParam:" + listParam;
}
path variable
:路径变量。和字面意思表达的一样,这个注解主要作用是在请求 URL 路径上进行数据绑定
后端实现代码:
@RequestMapping("/m10/{id}/{name}")
public Object method10(@PathVariable Integer id, @PathVariable("name") String userName){
return "解析参数id: "+id+", name: "+userName;
}
@PathVariable
的属性赋值,如上述例子中的 id
变量@PathVariable
的属性 value
赋值,如上述例子中的 userName
后端代码实现:
@RequestMapping("/m11")
public Object method11(@PathVariable("file")MultipartFile file) throws IOException {
//获取文件名称
String fileName = file.getOriginalFilename();
//文件上传到指定路径
file.transferTo(new File("D:/" + file.getOriginalFilename()));
return "接收到文件名称为: "+fileName;
}
使用 Postman 发送请求:
观察目标路径,文件是否上传成功