@RequestParam、@RequestBody 和 @ModelAttribute 的区别

三种注解的区别和使用场景

@RequestParam

用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容
GET 和 POST 请求的参数会自动赋值给 @RequestParam 注解的变量
例如,@RequestParam(value=“username”) String userName 会直接将请求中名称为 username 变量的值赋值给 userName 参数
如果不加该注解,则必须保证请求中的参数名与函数的参数名一致,即 函数中的参数要是 String username

@RequestBody

一般用来处理 HttpEntity 传来的 Content-Type 非 application/x-www-form-urlencoded 编码的数据

GET 请求没有 HttpEntity,所以 @RequestBody 不适用于 GET 请求
POST 请求通过 HttpEntity 传输的参数,要在请求中声明 Content-Type 类型,Spring 会解析 HttpEntity 中的数据,并绑定到相应的 bean 上

@ModelAttribute

一般用于 GET 请求,将参数和 Model 对象参数绑定,变量名要和对象的属性值相对应


前端使用 GET 或 POST 方式提交数据时,数据编码格式由请求头的 Content-Type 指定,分为以下几种情况:

  1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute可以处理,@RequestBody也可以处理。
  2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
  3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。

参考

@RequestParam、@RequestBody和@ModelAttribute区别