Spring MVC 参数传递详解:从基础到实战
在 Spring MVC 中,参数传递是前后端交互的关键环节。通过掌握不同类型的参数传递方式,开发者可以更高效地构建功能完善的 Web 应用。本文将详细介绍 Spring MVC 中的参数传递方法,包括查询参数、路径变量、请求体、数组、集合以及 JSON 数据的互换。
一、查询参数(Query Parameters)
查询参数通过 URL 的查询字符串传递,通常用于 GET 请求。
1. 通过postman
传递单个参数
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r1")
public String r1(String keyword){
return "接收参数"+keyword;
}
}
12345678
2.通过postman
传递多个参数
typescript
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r2")
public String r2(String Username,String password){
return "用户名Username:"+Username+"密码password:"+password;
}
}
12345678
通过postman传递多个参数。
3. 通过 @RequestParam
进行重命名
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r4")
public String r4(@RequestParam(value = "q",required = false) String keyword){
return "接收参数:"+keyword;
}
}
12345678
通过postman观察:
4.可选参数
required 的默认值为true, 表⽰含义就是: 该注解修饰的参数默认为必传
既然如此, 我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错.
less
@GetMapping("/users")
public List<User> getUsers(@RequestParam(name = "age", required = false) int age) {
return userService.getUsers(age);
}
1234
二、路径参数(Path Variables)
路径参数将参数嵌入到 URL 路径中,适用于资源标识。
1. 通过 @PathVariable
接收参数
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
//从url当中获取参数
@RequestMapping("/artic/{type}/{articID}")//必传参数
public String r8(@PathVariable String type,@PathVariable Integer articID){
return "文章类型:"+type+"获取文章ID:"+articID;
}
}
123456789
通过postman
测试:
如果不传这个参数通过postman
测试:
得到验证:可以看到这个参数是必须传的。
2. 参数重命名
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
//从url当中获取参数(对articID重命名)
@RequestMapping("/artic/{type}/{articID}")//必传参数
public String r9(@PathVariable String type,@PathVariable("articID") Integer articalID){
return "文章类型:"+type+"获取文章ID:"+articalID;
}
}
123456789
三、对象
传递对象
先创建一个类UserInfo:
typescript
import lombok.Data;
@Data
public class UserInfo {
private String name;
private String gender;
private Integer age;
}
12345678
引入lombok
依赖:
xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
12345
解释: 引入lombok
依赖,然后通过@Data注解,可以自动生成构造方法等等。
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r3")
public String r3(UserInfo userInfo){
return "UserInfo="+userInfo.toString();
}
}
12345678
通过postman进行传递对象的参数:
四、数组(Arrays)
用于传递一组相同类型的数据。
1. 传递数组
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
//传递数组
@RequestMapping("r5")
public String r5(String[] arr){
return "接收参数:arr="+ Arrays.toString(arr);
}
}
123456789
通过postman
进行观察:
五、集合(Collections)
传递一组对象或复杂数据类型。
1. 通过 @RequestBody
传递集合
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
//传递集合
@RequestMapping("r6")
public String r6(@RequestParam List<Integer> list){
return "接收参数:List="+ list;
}
}
123456789
postman
传参测试:
六、JOSN
1.JSON概念
JSON:JavaScript Object Notation
【JavaScript 对象表示法】
JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简单来说:JSON就是⼀种数据格式, 有自己的格式和语法, 使用文本表示⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语言中数据传递和交换
类似于:
• 国际通用语言-英语
• 中国56个民族不同地区的通用语言-普通话
有自己的语法, 其他语言也认识。
2.JSON语法
JSON 是⼀个字符串,其格式非常类似于 JavaScript 对象字面量的格式。
我们先来看⼀段JSON数据:
json
{
"name": "John",
"age": 30,
"city": "New York"
}
12345
也可以压缩表示:
json
{"name": "John","age": 30,"city": "New York"}
1
语法
- 数据在 键值对(Key/Value) 中
- 数据由逗号 , 分隔
- 对象用 {} 表示
- 数组用 [] 表示
- 值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构 - 对象: 大括号 {} 保存的对象是⼀个无序的 键值对 集合. 一个对象以左括号 { 开始, 右括号 }结束。每个"键"后跟⼀个冒号 : ,键值对使用逗号 , 分隔。
- 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括号 ] 结束。
以下都是合法的JOSN数据:
css
{"name":"admin","age":18}
["hello", 3.1415, "json"]
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
1
1234
本质上是jackson-databind提供的功能, Spring MVC框架中已经把该工具包引入了进来, 咱们直接使用即可, 如果脱离Spring MVC使用, 需要引入相关依赖:
xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.0</version>
</dependency>
123456
3.传递JOSN对象
接收JSON对象, 需要使⽤
@RequestBody 注解
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
//传递Joson
@RequestMapping("r7")
public String r7(@RequestBody UserInfo userInfo){
return userInfo.toString();
}
}
123456789
通过postman
测试:
不用@RequstBody注解看看:
七、文件请求
1.获取文件
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r10")
public String r10(MultipartFile file){
System.out.println(file.getOriginalFilename());
return "获取文件成功!";
}
}
123456789
通过postman
测试:
2.上传文件
less
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r11")
//@RequestPart("file1") 对file进行重命名为file1
public String r11(@RequestPart("file1") MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());
//文件上传
file.transferTo(new File("D:\temp\"+file.getOriginalFilename()));
return "获取文件成功!";
}
}
123456789101112
通过postman
测试:
可以看到上传成功了!!!
八、注意事项与最佳实践
-
参数校验:
- 使用
@Valid
注解对参数进行校验。
less@PostMapping("/users") public User createUser(@RequestBody @Valid User user) { return userService.createUser(user); } 1234
- 使用
-
参数命名:
- 保持前后端参数名称一致,减少重命名的复杂性。
-
解决常见问题:
- 避免通过
GET
请求传递敏感数据。 - 使用
POST
或PUT
请求传递大数据或敏感信息。
- 避免通过
九、总结
通过本文,你已经掌握了如何在 Spring MVC 中传递各种类型的参数,包括简单类型、对象、数组、集合、JSON 数据等。合理运用这些参数传递方式,可以开发出功能强大且易于维护的 Web 应用。
希望这篇详解能够帮助你更好地理解 Spring MVC 的请求处理机制,提升你的开发技能!