@RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。
GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置来解析HttpEntity中的数据,然后绑定到相应的bean上。
如果前端向后端传递的是非实体类对象,后台也可以使用@RequestBody注解,那就用List
@RequestParam
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)
POST类型和GET类型都可以使用@RequestParam注解来接收参数
@RequestParam注解有三个参数
required 表示是否必须,默认为 true,必须。
defaultValue 可设置请求参数的默认值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。
value 为接收url的参数名(相当于key值)。
举例:
//一下两种写法效果一模一样
@RequestParam("") 或 @RequestParam(value="")
//当配置多个属性的时候
@RequestParam(value="", required=true, defaultValue="")
//如果使用下面这种方式接值,那么前台穿过来的参数名称就要和inputStr一样,这里才能接收到
@RequestParam String inputStr
//但是如果加上value属性的话,那么前台传过来的参数名称就要和value属性中的一致才能接收到
@RequestParam(value="aa") String inputStr
//如果加上required属性,当required=true就是必须要传参值过来, 当required=false表示不传的话,会给参数赋值为null
@RequestParam(value="aa", required=true)
//有一种特殊情况是参数为int类型时,设置required=false后参数不传值得话会给int类型参数赋值为null,而int是基本数据类型不能赋值为null,所以会报错,此时要将int类型改为Integer类型
@RequestParam(value="inputInt", required=false) int inputInt
@RequestParam接收对象类型
这里举个栗子
实体类是People属性如下
private String name; //姓名
private int age; //年龄
private String sex; //性别
前台代码(拿JSP举例)
后台代码
int addPeople(@RequestParam People people) {}
//这时候使用@RequestParam注解修饰参数 只要前台传的参数名称和people类中的属性名一致就可以自动封装进People实体类
这里我又想到一个问题,加和不加@RequestParam参数有什么区别呢?
其实不加@RequestParam参数也没问题(此时的参数名称要和前台传过来的参数名称保持一致),也可以接收到前台传过来的参数,当前台没有传值时接收到的为null,只不过使用@RequestParam是为了用它里面的一些属性,比如默认值或required属性。
总结
Post请求接收@RequestBody修饰的参数和@RequestParam修饰的参数,而Get请求则只能接收@RequestParam修饰的参数。
如果前端传的是Json类型的对象,后台就要使用@RequestBody修饰的实体类接收,如果是单个属性就使用@RequestParam修饰的变量或实体类接收