1. 后端传参重命名(后端参数映射)
某些特殊情况下,前端传递的参数
key
和我们后端接收的
key
可以不一致,比如前端传了一个
time
给后端,而后端是使用
createtime
字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用
@RequestParam
来重命名前后端的参数值
@RequestMapping("/m4")publicObjectmethod4(@RequestParam("time")String createtime){return"收到参数:createtime="+ createtime;}
- 使用浏览器发送请求并传参: http://127.0.0.1:8080/param/m4?time=2024-10-4 可以看到,
Spring
可以正确的把浏览器传递的参数time
绑定到后端参数createtime
上。此时,如果浏览器使用createtime
进行参数传递呢? 错误日志信息为: - 控制台打印日志显示:请求参数“
time
”不存在
可以得出结论:
- 使用
@RequestParam
进行参数重命名时,请求参数只能和@RequestParam
声明的名称一致,才能进行参数绑定和赋值 - 使用
@RequestParam
进行参数重命名时,参数就变成了必传参数(不传参数的话就会报 400 错误)
非必传参数设置
如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?
先来了解一下参数必传的原因,我们查看
@RequestParam
注解的实现细节就可以发现端倪,注解实现如下:
@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRequestParam{@AliasFor("name")Stringvalue()default"";@AliasFor("value")Stringname()default"";booleanrequired()defaulttrue;StringdefaultValue()default"\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";}
可以看到,
required
的默认值为
true
,表示含义就是:该注解修饰的参数默认为必传。既然如此,我们可以通过设置
@RequestParam
中的
require=false
来避免不传递时报错,具体实现如下:
@RequestMapping("/m5")publicObjectmethod5(@RequestParam(value ="time", required =false)String createtime){return"接收到参数 createtime: "+ createtime;}
- 可以看到,添加
required=false
之后,time
前面也加了key
,变成了value=“time”
- 注解属性时,没有指明
key
的话,默认为value
属性 - 如果需要对多个属性进行赋值时,需要写上
key
2. 传递数组
Spring MVC 可以自动绑定数组参数的赋值。后端代码实现:
@RequestMapping("/m6")publicStringmethod6(String[] arrayParam){returnArrays.toString(arrayParam);}
数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数
- http://127.0.0.1:8080/param/m6?arrayParam=zhangsan&arrayParam=lisi&arrayParam=wangwu
- http://127.0.0.1:8080/param/m6?arrayParam=zhangsan%2clisi%2cwangwu
- http://127.0.0.1:8080/param/m6?arrayParam=zhangsan,lisi,wangwu
%2c
是,
的意思,第二个解码后就是第三个。他们三个的浏览器响应结果都一样
3. 传递集合
集合参数:和数组类似,同一个请求参数名有为多个,且需要使用
@RequestParam
绑定参数关系
- 默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,就要使用
@RequestParam
绑定参数关系
请求方式和数组类似,后端代码为:
@RequestMapping("/m7")publicStringmethod7(@RequestParamList<String> listParam){return"size: "+ listParam.size()+", listParam:"+ listParam;}
- http://127.0.0.1:8080/param/m7?listParam=zhangsan&listParam=lisi&listParam=wangwu
- http://127.0.0.1:8080/param/m7?listParam=zhangsan%2clisi%2cwangwu
- http://127.0.0.1:8080/param/m7?listParam=zhangsan,lisi,wangwu
4. 获取 URL 中参数 @RathVariable
path variable
:路径变量。和字面意思表达的一样,这个注解主要作用是在请求 URL 路径上进行数据绑定
- 默认传参数写在 URL 上,Spring MVC 就可以获取到
后端实现代码:
@RequestMapping("/m10/{id}/{name}")publicObjectmethod10(@PathVariableInteger id,@PathVariable("name")String userName){return"解析参数id: "+id+", name: "+userName;}
- 可以看到,后端正确获取到了 URL 中的参数,参数对应关系如下:
- 如果方法参数名称和需要绑定的 URL 中的变量名称一致时,可以简写,不用给
@PathVariable
的属性赋值,如上述例子中的id
变量 - 如果方法参数名称和需要绑定的 URL 中的变量名称不一致时,需要
@PathVariable
的属性value
赋值,如上述例子中的userName
5. 上传文件 @RequestPart
后端代码实现:
@RequestMapping("/m11")publicObjectmethod11(@PathVariable("file")MultipartFile file)throwsIOException{//获取文件名称 String fileName = file.getOriginalFilename();//文件上传到指定路径
file.transferTo(newFile("D:/"+ file.getOriginalFilename()));return"接收到文件名称为: "+fileName;}
使用 Postman 发送请求:
观察目标路径,文件是否上传成功
版权归原作者 椰椰椰耶 所有, 如有侵权,请联系我们删除。