首先先说明一下,三者都是作用于Controller层用来接收前端传递过来的数据。下面就来简单说一下三者之间的区别、使用方式以及常见的应用场景。
@RequestParam
- @RequestParam注解一般与get请求一起使用。
- 一个请求(一个方法中)可以有多个@RequestParam。
- @RequestParam 用来接收普通参数。
那么问题来了,加@RequestParam和不加有什么区别呢?我们又该在什么时候用它呢?
(1)加@RequestParam注解
@RequestMapping("/user")
public String user(int userId) {
return "user";
}
(2)不加@RequestParam注解
@RequestMapping("/user")
public String user(@RequestParam("userId") int userId) {
return "user";
}
- 不添加该注解则参数为非必传,反之参数为必传。参数名为userId。
- 通过注解中的参数required = false可以设置参数为非必传。required值默认为true。
- 通过@RequestParam("userId")或者@RequestParam(value = "userId")指定参数名。
- 通过参数defaultValue = "0"可以指定参数默认值。注意:当为require设置为false时才可以使用defaultValue。
@RequestMapping("/user")
public String user(@RequestParam(value = "userId", defaultValue = "0", required = false) int userId) {
return "user";
}
@RequestBody(常用)
- @RequestBody注解一般与post方法使用。
- 一个请求中只能存在一个@RequestBody注解。
- @RequestBody 用于接收前端传递给后端的json字符串中的数据。(处理json格式的数据)
语法格式:
(@RequestBody Map map)
(@RequestBody Object object)
(1)(@RequestBody Map map)方式:
这种方式相对来说比较简单,我们将json解析成Map形式的key-value键值对,通过map.get(“Key”)就可以拿到值。
(2)(@RequestBody Object object)方式:
通过json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合实体类的对应属性的类型要求时,会调用实体类的setter方法将值注入到该属性。
代码样例:
public Result deleteBookById(@RequestBody HashMap<String, String> map) {
bookService.deleteBookById(Long.parseLong(map.get("id")));
return Result.createWithSuccessMessage();
}
public Result updateBookById(@RequestBody Book book){
Book record = bookService.updateBookById(book);
return Result.createWithModel(record);
}