Handler可以傳回多種類型
其實@RequestMapping方法可以傳回多種類型的資料,但是我們現在基本上都隻會用@ResponseBody這種方式,别的方式基本上不會使用了。
Handler可以傳回的類型如下(從官網截圖,隻截圖了一部分)
其他傳回String,View等類型的方式在Spring MVC時代還挺常見的。找了一個之前的Spring MVC項目,給大家示範一下其他傳回值類型的處理
index.jsp
notice.jsp
方法或者類上加了@ResponseBody注解,則會直接傳回json,xml等内容。
方法或者類上沒有加@ResponseBody注解,傳回了String,View或者ModelAndView等時則會解析為相應的試圖傳回。
可以看到根據不同的傳回值,需要執行不同的解析邏輯,這時就需要HandlerMethodReturnValueHandler(傳回值處理器),根據不同的傳回值調用相應的HandlerMethodReturnValueHandler來處理
HandlerMethodReturnValueHandlerComposite#handleReturnValue
找到第一個支援特定傳回值的傳回值處理器,然後處理傳回值
RequestResponseBodyMethodProcessor同時實作了HandlerMethodArgumentResolver接口
和HandlerMethodReturnValueHandler接口,是以既是參數處理器,也是傳回值處理器
HandlerMethodArgumentResolver:用來支援@RequestBody注解
HandlerMethodReturnValueHandler:用來支援@ResponseBody注解
ViewNameMethodReturnValueHandler
用來處理傳回值類型是void或者字元串
将試圖相關的資訊放到ModelAndViewContainer中,後續會根據ModelAndViewContainer中的值建立ModelAndView
RequestResponseBodyMethodProcessor
RequestResponseBodyMethodProcessor#supportsReturnType
方法上或者類上有ResponseBody注解,則利用RequestResponseBodyMethodProcessor來處理傳回值RequestResponseBodyMethodProcessor#handleReturnValue
可以看到首先執行mavContainer.setRequestHandled(true),這樣handler傳回的ModelAndView為null,就不會進行視圖渲染的過程方法裡面會利用HttpMessageConverter來進行封包和對象的轉換。