Spring MVC 参数绑定详解:单多参/对象/集合/JSON/文件上传
Spring MVC 中处理请求参数的多种方法,包括单个及多个参数接收、对象封装绑定、参数重命名、数组与集合传递、JSON 数据交互(@RequestBody)、URL 路径变量(@PathVariable)以及文件上传。通过代码示例和错误分析,讲解了基本类型与包装类型的区别、必填参数设置及常见异常处理,帮助开发者掌握不同场景下的参数绑定策略。

Spring MVC 中处理请求参数的多种方法,包括单个及多个参数接收、对象封装绑定、参数重命名、数组与集合传递、JSON 数据交互(@RequestBody)、URL 路径变量(@PathVariable)以及文件上传。通过代码示例和错误分析,讲解了基本类型与包装类型的区别、必填参数设置及常见异常处理,帮助开发者掌握不同场景下的参数绑定策略。

本文介绍了 Spring MVC 中处理不同请求参数的多种方式,涵盖单个及多个参数、对象封装、数组与集合、JSON 数据交互、路径变量及文件上传。
接收单个参数,在 Spring MVC 中直接用方法中的参数即可。
@RequestMapping("Param")
@RestController
public class ParamController {
@RequestMapping("a1")
public String tex1(String string) {
return "接收到参数:" + string;
}
}
访问 http://127.0.0.1:8080/Param/a1?string=Spring 可获取结果。
Spring MVC 会根据方法参数名找到对应的请求参数并赋值。若参数不一致,则获取不到(包装类型为 null)。
注意:
@RequestMapping("a2")
public Object text2(int a) {
return "接收到参数 a:" + a;
}
HTTP 响应状态码为 200。
若未传参数且使用基本类型,服务器返回 500 错误。
日志提示:可选的整型参数存在,但由于被声明为基本类型,无法转换为 null 值。建议将其声明为对应基本类型的对象包装器。
对于包装类型,如果不传对应参数,Spring 接收到的数据则为 null。开发中,对于可能为空的数据,建议使用包装类型。
传递多个参数和传输一个参数一样,直接使用方法的参数接收即可。
@RestController
public class ParamController {
@RequestMapping("Param")
public String Demo1(String name, String age) {
return "接收到参数 name: " + name + ",age: " + age;
}
}
后端程序根据参数名称进行匹配,参数位置不影响获取结果。
当参数较多时,可将参数封装成一个对象。Spring MVC 支持自动实现对象参数的赋值。
public class Cat {
private String name;
private int age;
private String hobby;
// Getter 和 Setter 省略
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getHobby() { return hobby; }
public void setHobby(String hobby) { this.hobby = hobby; }
@Override
public String toString() {
return "Cat{name='" + name + "', age=" + age + ", hobby='" + hobby + "'}";
}
}
@RequestMapping("Cat")
public Object Cat(Cat cat) {
return cat.toString();
}
Spring 会根据参数名称自动绑定到对象的各个属性上。如果属性未传递,基本类型会被赋值为默认初始值(如 int 为 0),引用类型为 null。
前端传递的参数 key 和后端接受的 key 可以不一致。可以使用 @RequestParam 来重命名前后端的参数值。
@RequestMapping("A1")
public String A1(@RequestParam("p") String password) {
return "接收参数:password:" + password;
}
该注解表示从前端接收到 p 赋值给 password。
若直接传递给后端的参数 password 而不传 p,会抛出 MissingServletRequestParameterException,返回 HTTP 400 错误。因为使用该注解时,参数默认为必传。
可通过设置 required 使该参数为非必传参数:
@RequestMapping("A1")
public String A1(@RequestParam(value = "p", required = false) String password) {
return "接收参数:password:" + password;
}
@RequestMapping("A2")
public String A2(String[] arr) {
return "接收参数:arr:" + Arrays.toString(arr);
}
同一个请求中出现多个同名参数,可以直接传递数组。元素之间通常以逗号分隔,如需传递逗号本身需转义。
集合参数与数组类似,需要使用 @RequestParam 绑定参数关系,Spring 会自动将其值收集到一个集合中。
@RequestMapping("A1")
public String A1(@RequestParam List<Integer> list) {
return "接收参数:" + list;
}
JSON(JavaScript Object Notation)是一种轻量级的数据交互格式,本质是字符串,用于在不同语言中传递和交换数据。
JSON 有特定的格式和语法,支持对象和数组嵌套。可使用在线工具校验。
简单易用、跨平台支持、轻量级、易于扩展、安全性高。
Spring MVC 框架集成了 JSON 转换工具(基于 jackson-databind)。使用 ObjectMapper 对象提供的两个方法完成互转:
writeValueAsString: 把对象转为 JSON 字符串readValue: 把字符串转为对象public class Animals {
private String name;
private int age;
private String color;
// Getter 和 Setter 省略
@Override
public String toString() {
return "Animals{name='" + name + "', age=" + age + ", color='" + color + "'}";
}
}
public class JSONText {
@Test
public void JsontoJava() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String s = "{\"name\":\"咪咪\",\"age\":1,\"color\":\"blue\"}";
Animals cat = mapper.readValue(s, Animals.class);
System.out.println(cat.toString());
}
@Test
public void JavatoJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Animals cat = new Animals();
cat.setName("cat");
cat.setAge(1);
cat.setColor("blue");
String str = mapper.writeValueAsString(cat);
System.out.println(str);
}
}
接收 JSON 对象,需要使用 @RequestBody 注解。该注解作用在请求正文的数据绑定,请求参数必须写在请求正文中。
@RequestMapping("A3")
public String A3(@RequestBody Animals animals) {
return animals.toString();
}
Spring 会将传入的 JSON 字符串转化为对象,开发者可直接对对象进行操作。
该注解主要作用在请求 URL 路径上的数据绑定。
@RequestMapping("A4/{id}")
public String A4(@PathVariable Integer id) {
return "获取 id: " + id;
}
可传递多个路径变量:
@RequestMapping("A4/{id}/{age}")
public String A4(@PathVariable Integer id, @PathVariable Integer age) {
return "获取 id: " + id + ",age: " + age;
}
路径变量默认为必传参数。若只传递一个参数,Spring 无法区分是 id 还是 age,因此必须全部传递或重命名。
@RequestMapping("A5")
public String A5(MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "文件获取成功";
}
通过 MultipartFile 接口获取上传的文件信息。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online