@RequestBody(把接收的数据转换为java对象)
作用: 用于读取Request请求的body部分数据,是放在方法中参数类型之前,@RequestBody需要接的参数是一个string化的json字符串,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到对象(javaBean)上。再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
一般此注解用于ajax获取数据,因此请求时注意的是Content-Type的值是application/json, application/xml这种,如下:
var answerinfo = {
"address":1,
"answer":2,
"phone":3,
"giftId":3,
"name":3
}
function submit(){
$.ajax({
url:"/dior-inside-gift/submitUserData.do",
contentType:"application/json;charset=UTF-8",
type:'POST',
dataType:'json',// 返回值类型
data:JSON.stringify(answerinfo)//参数转化为json字符串
success:function(data){
alert(data.text);
}
});
}
contentType:"application/json;charset=UTF-8",
type:'POST',
dataType:'json',// 返回值类型
data:JSON.stringify(answerinfo)//参数转化为json字符串
success:function(data){
alert(data.text);
}
});
}
另外要使用@RequestBody这个注解还需要额外配置一个Bean,也就是自动帮我们接收json并转成对象的消息转换器messageConverter,Spring3.1之后的版本,那么配置在RequestMappingHandlerAdapter下:
如不要求复杂的转化也可以通过<mvc:annotation-driven />来代替省略上面配置
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
</bean>
</list>
</property>
</bean>
在下一个注解之前,穿插一个点:
SpringMVC提供了一个@RequestBody,它是用来处理前台定义发来的数据Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
在Ajax中,我们没有定义Content-type的类型,Jquery默认使用application/x-www-form-urlencoded类型。那么意思就是SpringMVC的@RequestParam注解,Servlet的request.getParameter是可以接受到以这种格式传输的JSON对象的。
为什么呢!?GET请求想必大家都不陌生,它将参数以url?username=”admin”&password=123这种方式发送到服务器,并且request.getParameter可以接收到这种参数,我们在浏览器地址栏上也可以看到这一点。而我们Ajax使用的POST,并且发送的是JSON对象,那这个Content-Type x-www-form-urlencoded的编码方式把JSON数据转换成一个字串,(username=”admin”&password=123)然后把这个字串添加到url后面,用?分割,(是不是和GET方法很像),提交方式为POST时候,浏览器把数据封装到HTTP BODY中,然后发送到服务器。所以并不会显示在URL上。
所以使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json,如果没有更改,后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported,,所以前台的Content-Type需要更改,同时我们的data也要更改成JSON字符串而不是JSON对象
@ResponseBody(把服务器端的java对象转换为指定格式的数据并作为返回值)
作用:
该注解用于将Controller的方法返回的对象,注解可以放在方法前也可以放在返回值类型前,通过适当的HttpMessageConverter转换为指定格式(JSON)后,写入到Response对象的body数据区。要注意的是
返回的不是html标签的页面,而是其他某种格式的数据时(如json、xml等);因此大多是应用于ajax加载内容的情况下。
在使用 <mvc:annotation-driven />标签配置时,默认配置了RequestMappingHandlerAdapter(注意是RequestMappingHandlerAdapter不是AnnotationMethodHandlerAdapter,,并为他配置了一下默认的HttpMessageConverter。
最后说@restcontroller
@restcontroller其实是@controller和@responsebody的结合 ,实际开发中可以用@restcontroller代替@cotroller使用,而且直接省略@responsebody注解也可以实现方法返回数据对象。