SpringMVC適配器模式作用范圍介紹
Spring MVC 啟動(dòng)的關(guān)鍵流程我們已經(jīng)學(xué)習(xí)了 Handler 與 HandlerMapping,還未掌握的小伙伴可以翻看前面的文章進(jìn)行學(xué)習(xí),今天我們將進(jìn)入啟動(dòng)的第四步,了解 HandlerAdapter 的基本實(shí)現(xiàn)與作用。
HandlerAdapter的作用
HandlerAdapter 的作用是將 HTTP 請(qǐng)求與控制器之間的接口進(jìn)行轉(zhuǎn)換。它接受一個(gè)處理請(qǐng)求的控制器(Handler,任何實(shí)現(xiàn)了Controller接口或者注解了 @Controller注解的類),并將請(qǐng)求的參數(shù)、請(qǐng)求的類型、響應(yīng)的類型等信息適配給控制器進(jìn)行處理,最終將處理結(jié)果封裝成一個(gè) ModelAndView 對(duì)象返回給 DispatcherServlet。
HandlerAdapter 的主要作用包括:
請(qǐng)求參數(shù)適配
當(dāng) Handler 方法需要參數(shù)時(shí),HandlerAdapter 會(huì)根據(jù)參數(shù)類型和名稱,將請(qǐng)求中的參數(shù)適配給 Handler 的方法。例如,當(dāng) Handler 方法需要一個(gè) String 類型的參數(shù)時(shí),HandlerAdapter 會(huì)從請(qǐng)求中獲取參數(shù),并將其轉(zhuǎn)換成 String 類型的參數(shù)傳遞給 Handler 的方法。
請(qǐng)求類型適配
HandlerAdapter 還負(fù)責(zé)將請(qǐng)求的類型適配給 Handler。例如,當(dāng)請(qǐng)求為 GET 請(qǐng)求時(shí),HandlerAdapter 會(huì)調(diào)用控制器方法中的 GET 方法;當(dāng)請(qǐng)求為 POST 請(qǐng)求時(shí),HandlerAdapter 會(huì)調(diào)用 Handler 中的 POST 方法。
響應(yīng)類型適配
Handler 返回的結(jié)果通常應(yīng)該是一個(gè) ModelAndView 對(duì)象,因此 HandlerAdapter 負(fù)責(zé)將 Handler 的返回結(jié)果適配給 ModelAndView 對(duì)象。例如,當(dāng) Handler 返回一個(gè)字符串時(shí),HandlerAdapter 會(huì)將該字符串封裝成 ModelAndView 對(duì)象并返回給 DispatcherServlet。
HandlerAdapter的源碼實(shí)現(xiàn)
HandlerAdapter 接口定義了一個(gè)方法,即 handle() 方法,用于處理請(qǐng)求并返回 ModelAndView 對(duì)象。
Spring MVC 框架提供了多個(gè) HandlerAdapter 的實(shí)現(xiàn)類,主要包括以下幾個(gè):
HandlerAdapter |
---|
SimpleControllerHandlerAdapter |
HttpRequestHandlerAdapter |
AnnotationMethodHandlerAdapter |
RequestMappingHandlerAdapter |
下面以 RequestMappingHandlerAdapter 為例,介紹 HandlerAdapter 的源碼實(shí)現(xiàn)。
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; ModelAndView mav = new ModelAndView(); mav.setViewName(getViewName(handlerMethod)); mav.addAllObjects(getModelAndView(handlerMethod, request, response)); return mav; } else { throw new IllegalArgumentException("handler is not a HandlerMethod"); } }
該方法接受三個(gè)參數(shù):HttpServletRequest、HttpServletResponse 和 Object。其中,HttpServletRequest 和 HttpServletResponse 分別表示當(dāng)前請(qǐng)求和響應(yīng)對(duì)象,Object 表示當(dāng)前請(qǐng)求所對(duì)應(yīng)的 Handler 的 HandlerMethod 對(duì)象。
在 handle() 方法中,
- 首先判斷傳入的 Handler 是否為 HandlerMethod 類型。
- 如果是,則強(qiáng)制轉(zhuǎn)換為 HandlerMethod 對(duì)象,并初始化一個(gè) ModelAndView 對(duì)象。
- 然后,通過 getViewName() 方法獲取視圖名稱,并通過 getModelAndView() 方法獲取控制器方法的參數(shù)值并封裝成 ModelAndView 對(duì)象。
- 最后,將 ModelAndView 對(duì)象返回給 DispatcherServlet。
總結(jié)
HandlerAdapter 通過適配器模式將 HTTP 請(qǐng)求與 Handler 之間的接口進(jìn)行轉(zhuǎn)換,從而實(shí)現(xiàn)了請(qǐng)求的分發(fā)和處理。
HandlerAdapter 通過 handle() 方法將請(qǐng)求參數(shù)適配給 Handler 參數(shù),將請(qǐng)求的類型適配給 Handler,將響應(yīng)的類型適配給 ModelAndView 對(duì)象,并最終將 ModelAndView 對(duì)象返回給 DispatcherServlet。
Spring MVC 框架提供了多個(gè) HandlerAdapter 的實(shí)現(xiàn)類,其中最常用的是 RequestMappingHandlerAdapter。RequestMappingHandlerAdapter 支持使用 @RequestMapping 注解來定義請(qǐng)求映射。
到此這篇關(guān)于SpringMVC適配器模式作用范圍介紹的文章就介紹到這了,更多相關(guān)SpringMVC適配器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloudAlibaba整合Feign實(shí)現(xiàn)遠(yuǎn)程HTTP調(diào)用的簡單示例
這篇文章主要介紹了SpringCloudAlibaba 整合 Feign 實(shí)現(xiàn)遠(yuǎn)程 HTTP 調(diào)用,文章中使用的是OpenFeign,是Spring社區(qū)開發(fā)的組件,需要的朋友可以參考下2021-09-09SpringBoot Pom文件依賴及Starter啟動(dòng)器詳細(xì)介紹
這篇文章主要介紹了SpringBoot Pom文件的依賴與starter啟動(dòng)器的作用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09解決@CachePut設(shè)置的key值無法與@CacheValue的值匹配問題
這篇文章主要介紹了解決@CachePut設(shè)置的key的值無法與@CacheValue的值匹配問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java的外部類為什么不能使用private和protected進(jìn)行修飾的講解
今天小編就為大家分享一篇關(guān)于Java的外部類為什么不能使用private和protected進(jìn)行修飾的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04SpringBoot封裝響應(yīng)處理超詳細(xì)講解
這篇文章主要介紹了SpringBoot封裝響應(yīng)處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12一文教會(huì)你使用jmap和MAT進(jìn)行堆內(nèi)存溢出分析
本文介紹關(guān)于jmap和MAT的使用來進(jìn)行堆內(nèi)存溢出分析,因?yàn)檫@個(gè)內(nèi)存溢出是我們手動(dòng)構(gòu)造出來的,查找比較簡單,真的到了生產(chǎn)上面需要我們仔細(xì)排除2021-09-09springmvc集成shiro登錄權(quán)限示例代碼
本篇文章主要介紹了springmvc集成shiro登錄權(quán)限示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例
這篇文章主要介紹了JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法,簡單說明了TCP通訊的原理并結(jié)合具體實(shí)例形式分析了java實(shí)現(xiàn)TCP通訊的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08