Spring_MVC 中的 JSON 数据处理与 REST 风格开发
一、JSON 格式参数
1. 格式布置
依赖导入
为了处理 JSON 数据,需要在项目中引入 Jackson 库,它是 Spring_MVC 默认使用的 JSON 处理工具。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.4</version>
</dependency>
配置类
在 Spring 配置类中启用 @EnableWebMvc
注解,以激活 Spring_MVC 的高级功能,包括 JSON 数据的自动处理。
@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class WebConfig {
}
- @EnableWebMvc:启用 Spring_MVC 的高级功能,包括数据绑定、内容协商等。
- @ComponentScan:指定 Spring 容器扫描的包路径,确保控制器类被正确加载。
2. JSON 数组格式
示例:接收 JSON 数组
使用 @RequestBody
注解可以接收客户端发送的 JSON 数组,并将其自动转换为 Java 对象。
@Controller
@RequestMapping("/json")
public class JsonController {
@PostMapping("/so")
@ResponseBody
public String handleJsonArray(@RequestBody List<String> teachers) {
System.out.println("Received teachers: " + teachers);
return "{\"model\": \"springmvc\"}";
}
}
- @RequestBody:将请求体中的 JSON 数据绑定到方法参数。
- List:接收一个字符串数组。
Postman 测试
在 Postman 中,可以将请求类型设置为 POST
,并在请求体中输入 JSON 数组:
[
"Alice",
"Bob",
"Charlie"
]
3. JSON 引用类型
示例:接收 JSON 对象
Spring_MVC 可以自动将 JSON 对象转换为对应的 Java 类。
@PostMapping("/st")
@ResponseBody
public String handleJsonObject(@RequestBody Teacher teacher) {
System.out.println("Received teacher: " + teacher.getName());
return "{\"model\": \"springmvc\"}";
}
Teacher 类:
public class Teacher { private String name; private int age; // Getters and Setters 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; } }
Postman 测试
在 Postman 中,发送以下 JSON 数据:
{
"name": "Alice",
"age": 30
}
4. JSON 引用数组类型
示例:接收 JSON 对象数组
Spring_MVC 也可以处理 JSON 对象数组,并将其转换为 Java 对象列表。
@PostMapping("/sf")
@ResponseBody
public String handleJsonArrayObject(@RequestBody List<Teacher> teachers) {
System.out.println("Received teachers: " + teachers);
return "{\"model\": \"springmvc\"}";
}
Postman 测试
在 Postman 中,发送以下 JSON 数据:
[
{
"name": "itcsa",
"id": 123
},
{
"name": "itcsass",
"id": 125
}
]
5. 细节讲述
@RequestBody 与 @RequestParam 的区别
- @RequestBody:用于接收请求体中的 JSON 数据,并将其反序列化为 Java 对象。
- @RequestParam:用于接收 URL 参数或表单数据。
示例
@PostMapping("/example")
@ResponseBody
public String example(@RequestBody User user, @RequestParam String token) {
System.out.println("User: " + user.getName());
System.out.println("Token: " + token);
return "{\"status\": \"success\"}";
}
- @RequestBody User user:接收 JSON 数据并转换为
User
对象。 - @RequestParam String token:接收 URL 参数
token
。
二、响应类型处理
1. 返回 JSP 页面
在 Spring_MVC 中,可以直接返回 JSP 页面的名称,而无需使用 @ResponseBody
。
@GetMapping("/save")
public String save() {
return "index.jsp";
}
- 返回的字符串是 JSP 页面的路径,Spring_MVC 会自动解析并渲染该页面。
2. 返回纯文本
使用 @ResponseBody
注解可以返回纯文本响应。
@GetMapping("/text")
@ResponseBody
public String text() {
return "This is a plain text response.";
}
- @ResponseBody:将方法的返回值直接作为响应体返回。
3. 返回 JSON 数据
@RequestMapping("/sv")
@ResponseBody
public student sv(){
System.out.println("返回json数据类型");
student student = new student();
student.setId(123);
student.setName("智能");
return student;
}
是通过respnsebody进行设置的,设置返回类型转换为下面设置的student的类型
数组类型的json:
@RequestMapping("/sm")
@ResponseBody
public List<student> sm(){
System.out.println("返回json数据引用类型");
student student = new student();
student.setId(123);
student.setName("智能");
student student1 = new student();
student1.setName("王五");
student1.setId(456);
List<student> students = new ArrayList<>();
students.add(student1);
students.add(student);
return students;
}
4、@ResponseBody
类型:方法注解
作用:设置当前控制器作为返回值
三、REST 风格开发
1. REST 原理
REST(Representational State Transfer,表现层状态转换)是一种软件架构风格,用于设计网络应用程序。它强调使用 HTTP 方法(GET、POST、PUT、DELETE 等)来操作资源。
2. REST 风格的使用规范
示例:CRUD 操作
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable int id) {
return userService.getUserById(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable int id, @RequestBody User user) {
return userService.updateUser(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable int id) {
userService.deleteUser(id);
}
}
- @RestController:标记控制器为 REST 风格。
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:分别用于处理 GET、POST、PUT、DELETE 请求。
3. REST 风格的注解使用场景
4. REST 风格的简用用法
示例:使用 @RestController
和 @RequestMapping
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public List<Book> getAllBooks() {
return bookService.getAllBooks();
}
@GetMapping("/{id}")
public Book getBookById(@PathVariable int id) {
return bookService.getBookById(id);
}
@PostMapping
public Book createBook(@RequestBody Book book) {
return bookService.createBook(book);
}
@PutMapping("/{id}")
public Book updateBook(@PathVariable int id, @RequestBody Book book) {
return bookService.updateBook(id, book);
}
@DeleteMapping("/{id}")
public void deleteBook(@PathVariable int id) {
bookService.deleteBook(id);
}
}
@RestController:标记控制器为 REST 风格。
@RequestMapping(“/books”):设置控制器的基础路径。
k updateBook(@PathVariable int id, @RequestBody Book book) {
return bookService.updateBook(id, book);
}@DeleteMapping(“/{id}”)
public void deleteBook(@PathVariable int id) {
bookService.deleteBook(id);
}
}
- @RestController:标记控制器为 REST 风格。
- @RequestMapping("/books"):设置控制器的基础路径。
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:简化了 HTTP 方法的注解。