天天看點

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

Handler可以傳回多種類型

其實@RequestMapping方法可以傳回多種類型的資料,但是我們現在基本上都隻會用@ResponseBody這種方式,别的方式基本上不會使用了。

Handler可以傳回的類型如下(從官網截圖,隻截圖了一部分)

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

其他傳回String,View等類型的方式在Spring MVC時代還挺常見的。找了一個之前的Spring MVC項目,給大家示範一下其他傳回值類型的處理

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型
Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

index.jsp

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型
Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

notice.jsp

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型
Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

方法或者類上加了@ResponseBody注解,則會直接傳回json,xml等内容。

方法或者類上沒有加@ResponseBody注解,傳回了String,View或者ModelAndView等時則會解析為相應的試圖傳回。

可以看到根據不同的傳回值,需要執行不同的解析邏輯,這時就需要HandlerMethodReturnValueHandler(傳回值處理器),根據不同的傳回值調用相應的HandlerMethodReturnValueHandler來處理

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型
Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

HandlerMethodReturnValueHandlerComposite#handleReturnValue

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型
Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

找到第一個支援特定傳回值的傳回值處理器,然後處理傳回值

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

RequestResponseBodyMethodProcessor同時實作了HandlerMethodArgumentResolver接口

和HandlerMethodReturnValueHandler接口,是以既是參數處理器,也是傳回值處理器

HandlerMethodArgumentResolver:用來支援@RequestBody注解

HandlerMethodReturnValueHandler:用來支援@ResponseBody注解

ViewNameMethodReturnValueHandler

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

用來處理傳回值類型是void或者字元串

将試圖相關的資訊放到ModelAndViewContainer中,後續會根據ModelAndViewContainer中的值建立ModelAndView

RequestResponseBodyMethodProcessor

RequestResponseBodyMethodProcessor#supportsReturnType

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

方法上或者類上有ResponseBody注解,則利用RequestResponseBodyMethodProcessor來處理傳回值RequestResponseBodyMethodProcessor#handleReturnValue

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

可以看到首先執行mavContainer.setRequestHandled(true),這樣handler傳回的ModelAndView為null,就不會進行視圖渲染的過程方法裡面會利用HttpMessageConverter來進行封包和對象的轉換。

Spring MVC源碼解析:傳回值處理器,處理多種傳回值類型

參考部落格