@ResponseBody & @RequestBody
@RequestBody 將 HTTP 懇求正文插入辦法中,應用合適的HttpMessageConverter將懇求體寫入某個對象。
@ResponseBody 將內容或對象作爲 HTTP 響應正文返回,應用@ResponseBody將會跳過視圖處理懲罰項目組,而是調用合適HttpMessageConverter,將返回值寫入輸出流。
HttpMessageConverter接口
<mvc:annotation-driven />開啓了之後它給AnnotationMethodHandlerAdapter初始化7個轉換器,可以經由過程調用AnnotationMethodHandlerAdapter類的getMessageConverts()辦法來獲取轉換器的一個湊集 List<HttpMessageConverter>
默認給AnnotationMethodHandlerAdapter初始化的有(當然我們也可以添加自定義的converter)
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter<T>
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
Spring是如何尋找最佳的HttpMessageConverter
1 起首獲取註冊的所有HttpMessageConverter湊集
2 然後客戶端的懇求header中尋找客戶端可接管的類型,
比如 Accept application/json,application/xml等,構成一個湊集
3 所有的HttpMessageConverter 都有canRead和canWrite辦法 返回值都是boolean,看這個HttpMessageConverter是否支撐當前懇求的讀與寫,讀對應@RequestBody註解, 寫對應@ResponseBody註解
4 遍歷HttpMessageConverter湊集與前面獲取可接管類型進行匹配,若是匹配直接應用當前第一個匹配的HttpMessageConverter,然後return(一般是經由過程Accept和返回值對象的類型進行匹配)
例如
StringHttpMessageConverter
支撐String , Accept所有類型
MappingJacksonHttpMessageConverter
支撐Map List 實體對象等等 ,Accept:application/json