SpringBoot 控制器注解
@RequestBody、@RequestParam和@PathVariable的区别
@RequestParam 和 @PathVariable 一样,都是用于从request请求中绑定参数的,区别在于:
1. @RequsetParam是用于接收URL的查询串中的相应参数及请求体中的参数;
@RequestParam有三个配置参数:
-
required 表示是否必须,默认为 true,必须。
-
defaultValue 可设置请求参数的默认值。
-
value 为接收url的参数名(相当于key值)。
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。
@RequestParam也可用于其它类型的请求,例如:POST、DELETE等请求。比如向表中插入单条数据,但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null。
当请求头中的 Content-Type 类型为:multipart/form-data 或 application/x-www-form-urlencoded 时,该@RequestParam注解同样可以把请求体中相应的参数绑定到Controller方法的相应形参中
@Controller
@RequestMapping("receive")
public class receiveTest {
@RequestMapping("/receiveFile")
@ResponseBody
public String receiveFile(@RequestParam(required = false, value = "file2") MultipartFile File2,
@RequestParam String FirstName, @RequestParam String LastName) {
System.out.println("FirstName : " + FirstName);
System.out.println("LastName : " + LastName);
return "Success";
}
}
@RequestParam 示例;接收请求行中URL后的查询串参数,当访问URL为 localhost:8080/page?pagenum=1&pageSize=5&ausername=a
时,将会把查询串中的参数按名绑定到page方法的相应形参上
@GetMapping("/page") public Map<String,Object> findPage(@RequestParam Integer pageNum, @RequestParam Integer pageSize, @RequestParam String username){ Map<String,Object> map=new HashMap<>(); pageNum=(pageNum - 1) * pageSize; List<User> userList = userMapper.findPageSize(pageNum, pageSize,username); Integer total = userMapper.findTotal(username); map.put("data",userList); map.put("total",total); return map; }
@RequestParam 示例;接收请求行中URL后的查询串参数,当访问URL为 localhost:8080/page?pagenum=1&pageSize=5&ausername=a
时,将会把查询串中的参数按名绑定到page方法的相应形参上
@GetMapping("/page")
public IPage<User> findPage(@RequestParam Integer pageNum, @RequestParam Integer pageSize, @RequestParam(defaultValue = "") String username) {
Page<User> userPage = new Page<>(pageNum,pageSize);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
/* if(!"".equals(username)){
userQueryWrapper.like("username",username);
}*/
if(!Util.isEmptyString(username)){
userQueryWrapper.like("username",username);
}
//userQueryWrapper.orderByAsc("uid");//添加倒叙排列
Page<User> page = userService.page(userPage,userQueryWrapper);
return page;
}
2. @PathVariable 是用于接收URL中占位符的参数
现有Controller如下,当访问URL为 localhost:8080/del/12
时,将会把URL占位符的的参数按名绑定到del方法的相应形参上
@DeleteMapping("/del/{uid}")
public boolean del(@PathVariable String uid){
return userService.removeById(uid);
}
@RequestBody:
. @RequestBody是用于接收post请求中form表单中的数据;,请求后台方法,传递的参数是JSON时候,传入对象时候
现有Controller如下,当访问URL为 localhost:8080/save
时,而且post的部分数据为user对象,或者表单数据
@PostMapping("/save")
public boolean save(@RequestBody User user){
user.setUid(UUID.randomUUID().toString());
user.setPassword("123456");
user.setCreatedUser(user.getUsername());
user.setModifiedUser(user.getUsername());
user.setCreatedTime(new Date());
return userService.save(user);
}
注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded
编码格式的数据,比如:application/json、application/xml
等类型的数据。
就application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。