文章目录
在平时项目开发中,接收前端不同形式的参数是基本操作。 下面梳理出Spring Boot 接收前端不同形式参数的各种情况。
1. 项目准备
首先,确保你已经创建了一个 Spring Boot 项目,并且在 pom.xml
中添加了必要的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2. 定义学生实体类
创建一个 Student
类,用于封装学生的相关信息:
public class Student {
private Long id;
private String name;
private int age;
private String major;
// 无参构造函数
public Student() {}
// 有参构造函数
public Student(Long id, String name, int age, String major) {
this.id = id;
this.name = name;
this.age = age;
this.major = major;
}
// Getter 和 Setter 方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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 getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", major='" + major + '\'' +
'}';
}
}
3. 创建控制器类
创建一个 StudentController
类,用于处理各种接收学生信息的请求:
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/students")
public class StudentController {
// 1. 路径参数
@GetMapping("/{id}")
public String getStudentById(@PathVariable("id") Long id) {
return "获取到 ID 为 " + id + " 的学生信息";
}
// 2. 请求参数
@GetMapping("/search")
public String searchStudents(@RequestParam("name") String name, @RequestParam("age") int age) {
return "搜索姓名为 " + name + ",年龄为 " + age + " 的学生";
}
// 3. 请求体参数 - 接收单个学生对象
@PostMapping("/add")
public String addStudent(@RequestBody Student student) {
return "添加学生:" + student.toString();
}
// 4. 请求体参数 - 接收学生对象数组
@PostMapping("/addAll")
public String addAllStudents(@RequestBody List<Student> students) {
StringBuilder result = new StringBuilder("添加以下学生:\n");
for (Student student : students) {
result.append(student.toString()).append("\n");
}
return result.toString();
}
// 5. 请求头参数
@GetMapping("/header")
public String getStudentFromHeader(@RequestHeader("Student-ID") String studentId) {
return "从请求头中获取到学生 ID 为 " + studentId + " 的信息";
}
// 6. Cookie 参数
@GetMapping("/cookie")
public String getStudentFromCookie(@CookieValue("Student-Name") String studentName) {
return "从 Cookie 中获取到学生姓名为 " + studentName + " 的信息";
}
// 7. 表单参数
@PostMapping("/form")
public String addStudentFromForm(@ModelAttribute Student student) {
return "通过表单添加学生:" + student.toString();
}
// 8. 使用 Map 接收所有请求参数
@PostMapping("/allParams")
public String getAllParams(@RequestBody Map<String, Object> allParams) {
StringBuilder result = new StringBuilder("接收到的所有参数:\n");
for (Map.Entry<String, Object> entry : allParams.entrySet()) {
result.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
}
return result.toString();
}
}
4. Postman 测试示例
4.1 路径参数
4.2 请求参数
4.3 请求体参数 - 接收单个学生对象
4.4 请求体参数 - 接收学生对象数组
4.5 请求头参数
4.6 Cookie 参数
4.7 表单参数
4.8 Map接收所有参数
总结
以下是各种情况的总结:
参数位置/类型 | 使用的注解/对象 | 示例代码 | 适用场景 |
---|---|---|---|
URL查询参数 | @RequestParam | @RequestParam String name | GET请求,URL中的?name=value 形式参数 |
URL路径参数 | @PathVariable | @PathVariable Long id | RESTful风格URL,如/user/{id} |
请求体(JSON/XML) | @RequestBody | @RequestBody User user | POST/PUT请求,接收JSON/XML格式的复杂对象 |
表单数据 | @ModelAttribute | @ModelAttribute User user | 表单提交(x-www-form-urlencoded 或multipart ) |
请求头参数 | @RequestHeader | @RequestHeader("User-Agent") String userAgent | 获取请求头中的特定字段 |
Cookie参数 | @CookieValue | @CookieValue("JSESSIONID") String sessionId | 从Cookie中提取值 |
文件上传 | @RequestParam + MultipartFile | @RequestParam MultipartFile file | 接收上传的文件(multipart/form-data ) |
原生Servlet对象 | HttpServletRequest | 直接作为参数:(HttpServletRequest request) | 直接操作请求对象(如原生API交互) |
默认参数值 | @RequestParam(defaultValue) | @RequestParam(defaultValue = "0") int page | 参数可选时设置默认值 |
参数绑定到对象 | 无注解或@ModelAttribute | public String method(User user) | 自动将参数绑定到POJO对象的属性 |
Map接收所有参数 | @RequestParam Map | @RequestParam Map<String, String> params | 接收所有查询参数到Map中 |
补充说明:
-
@ModelAttribute
vs 无注解对象- 当方法参数是POJO对象时,Spring Boot会自动绑定请求参数到对象属性(隐式使用
@ModelAttribute
)。 - 显式使用
@ModelAttribute
可自定义模型属性名称。
- 当方法参数是POJO对象时,Spring Boot会自动绑定请求参数到对象属性(隐式使用
-
文件上传扩展
- 多文件上传:
@RequestParam List<MultipartFile> files
或MultipartFile[]
。
- 多文件上传:
-
其他注意事项
@RequestBody
仅支持POST
/PUT
等有请求体的方法,且需指定Content-Type
(如application/json
)。HttpServletRequest
对象可直接获取参数、请求头、Session等原生功能。
通过这样一个例子,清晰地展现了 Spring Boot 接收参数的各种情况,希望对大家能有所帮助!创作不易,欢迎关注/点赞/收藏!