浅析 @RequestBody和 @ResponseBody 注解

@RequestBody

作用:

1)  该注解用于刦Request请求的body部分数据,使用系统默认的 HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上。

2)  再把HttpMessageConverter返回的对象绑定到controller方法的参数上。

使用时机:

1) 当提方式为Get和Post时,根据Content_Type的值来判断有以下几种情况

a. Application/x-www-form-urlencoded可选(这种情况的数据        @RequestParam,@ModelAttribute也可以处理)。

b. Multipart/form-data的数据@RequestBody不能处理

c. 其他格式必须用 @RequestBody处理

2)  当提交方式为put时有以下几种情况

a.  Multipart/form-data的数据@RequestBody不能处理

b. 其他格式(包括Application/x-www-form-urlencoded)必须用 

springMvc对@RequestBody解析过程(以下面的代码为例)

springMvc进入select0方法之前会根据@RequestBody注解来选择适当HttpMessageConverter实现类来将请求参数解析到map变量中。

具体步骤如下:

在配置文件中找相应的HttpMessageConverter实现类(一般前台传到后台的参数为json格式),配置文件中的信息如下:

根据Request对象的header部分的 content-Typede类型找到类MappingJackson2HttpMessageConverter它是继承AbstractJackson2HttpMessageConverter类,在AbstractJackson2HttpMessageConverter继承了

AbstractHttpmessageConverter<Object>类它实现了HttpMessageConverter<T>这个接口(就是前边提到的HttpMessageConverter)它定义了成对的canRead(),read和canWrite,write和getSupportedMediaType这几个方法,如下图所示:

AbstractHttpmessageConverter<Object>重写了这几个方法也就是说前台传过来的content-Type的类型和你后台方法形参的类型会进入的这个类中的canRead()方法里,如果这个方法返回true则会进入read()方法将读取到的消息交给HttpInputMessage转换为方法中形参声明的对象(也就是上边的Map<String,Object>)并绑定到select0方法中的map中。canRead()方法如下:

springMvc执行完select0这个方法后由于返回值标识了@ResponseBody这个注解,所有会进入AbstractHttpmessageConverter<Object>这个类中的canWrite()方法当canWrite()方法返回值为true时会进入write方法中将信息交给HttpOutputMessage将结果写入响应报文中,canWrite()方法如下:

@ResponseBody:

作用: 

   该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:

      返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;