@responsebody跟@RequestBody

@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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章