看了很多网站都没详细讲解java后端是怎么数据交换的,特别是看B站视频时,一些教程十分详细,反而缺少了一些总体上的讲解。使得像我这类初学者学的十分懵懂,所以,我总结了SpringMVC及SpringBoot中数据是如何交换的。
首先,经典的SpringMVC中有着Service层,Control层和Dao层。
-
DAO层(Data Access Object):负责与数据源(数据库)进行交互,封装数据访问逻辑,对数据库进行增删改查操作。通常使用MyBatis或者JDBC来实现。DAO层的方法通常返回数据对象或者集合。
-
Service层:负责业务逻辑的处理,提供服务接口供Control层调用,处理事务管理、数据校验、数据处理等。Service层一般依赖于DAO层来获取数据,并对数据进行处理、组装等操作,然后返回给Controller层。
-
Controller层:负责接收和处理来自前端的请求,调用Service层提供的服务接口,并将结果封装为响应返回给前端。Controller层主要负责请求的路由、参数解析、验证、异常处理等,通过调用Service层的方法来获取和处理数据。
数据交换通常通过参数传递和返回值来实现:
- Controller层通过参数接收来自前端的请求数据,并将其传递给Service层的方法。
- Service层根据业务逻辑的需要,可能会调用DAO层的方法来获取数据,然后对数据进行处理和组装。
- Service层将处理后的数据通过返回值返回给Controller层,Controller层再将其封装为响应返回给前端。
-
示例:
@Controller @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ResponseEntity<UserDTO> getUser(@PathVariable("id") int id) { User user = userService.getUserById(id); if (user != null) { // 数据转换,将User对象转换成UserDTO对象 UserDTO userDTO = convertToDTO(user); return ResponseEntity.ok(userDTO); } else { return ResponseEntity.notFound().build(); } } // 其他请求处理方法... }
在上述示例中,Controller层通过@Autowired注解将UserService注入进来,然后调用UserService的方法来获取User对象。Controller层再将User对象转换成UserDTO对象,最后封装为响应返回给前端。数据交换主要是通过参数传递和返回值来实现的。
其次,后端是如何和前端数据进行交换的呢?
主要是javaweb中学到的request和response,中翻一下就是“请求”和“响应”,请求是前端向后端发送数据的过程中,常见的请求方式有Get和Post两种方式,两者区别即:Get是浏览器将请求头和请求体一起发出给服务器,如果状态码为200,即成;Post是浏览器先将请求头发出,报100,成功,再发送请求体,报200,成功。具体更多区别请看HTTP 方法:GET 对比 POST | 菜鸟教程
此链接,
我所要讲解的是在Restful风格下,我们如何利用注解对数据的交换:
-
@RequestMapping:用于将方法映射到特定的URL路径,处理客户端的请求。底层逻辑见。
-
@PathVariable:用于将URL路径中的变量(占位符)映射到方法的参数上。通过该注解,可以获取URL中的特定路径变量,并作为方法的参数传递。底层逻辑为通过解析URL路径,将变量值传递给方法参数。
-
@RequestParam:用于获取请求参数的值。通过该注解,可以获取URL中的查询参数或者表单提交的参数,并将其赋值给方法的参数。底层逻辑为通过解析请求,获取对应的参数值,并将其转换为方法参数的数据类型。
-
@RequestBody:用于将请求体中的数据绑定到方法的参数上。通过该注解,可以获取请求体中的数据,并将其转换为方法参数的数据类型。底层逻辑为先将请求体中的数据读取出来,然后使用转换器(如JSON转换器)将其转换为方法参数的数据类型。
-
@ResponseBody:用于将方法的返回值直接作为响应体返回给客户端。通过该注解,可以将方法的返回值转换为响应体的数据类型(如JSON、XML等),并发送给客户端。底层逻辑为将方法返回值转换为响应体的数据类型,然后发送给客户端。
-
@ResponseStatus:用于指定方法执行成功后的响应状态码。通过该注解,可以定义方法执行成功后返回的HTTP状态码。底层逻辑为在方法执行完成后,设置响应的状态码。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable("id") int id) {
User user = userService.getUserById(id);
if (user != null) {
UserDTO userDTO = convertToDTO(user);
return ResponseEntity.ok(userDTO);
} else {
return ResponseEntity.notFound().build();
}
}
@PostMapping
public ResponseEntity<Void> createUser(@RequestBody UserDTO userDTO) {
User user = convertToUser(userDTO);
userService.createUser(user);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
// 其他请求处理方法...
}
在上述示例中,使用了@RequestParam、@PathVariable、@RequestBody和@ResponseBody等注解来处理请求和响应。通过这些注解,可以方便地获取和处理请求参数,将请求体数据绑定到方法参数,以及将方法的返回值作为响应体返回给客户端。底层逻辑为根据注解的功能,解析请求,提取参数值或者请求体数据,并根据需求进行数据转换和处理,最后返回响应给客户端。
点点关注吧