SpringMVC適配器模式作用范圍介紹
Spring MVC 啟動的關(guān)鍵流程我們已經(jīng)學(xué)習(xí)了 Handler 與 HandlerMapping,還未掌握的小伙伴可以翻看前面的文章進(jìn)行學(xué)習(xí),今天我們將進(jìn)入啟動的第四步,了解 HandlerAdapter 的基本實(shí)現(xiàn)與作用。

HandlerAdapter的作用
HandlerAdapter 的作用是將 HTTP 請求與控制器之間的接口進(jìn)行轉(zhuǎn)換。它接受一個處理請求的控制器(Handler,任何實(shí)現(xiàn)了Controller接口或者注解了 @Controller注解的類),并將請求的參數(shù)、請求的類型、響應(yīng)的類型等信息適配給控制器進(jìn)行處理,最終將處理結(jié)果封裝成一個 ModelAndView 對象返回給 DispatcherServlet。
HandlerAdapter 的主要作用包括:
請求參數(shù)適配
當(dāng) Handler 方法需要參數(shù)時,HandlerAdapter 會根據(jù)參數(shù)類型和名稱,將請求中的參數(shù)適配給 Handler 的方法。例如,當(dāng) Handler 方法需要一個 String 類型的參數(shù)時,HandlerAdapter 會從請求中獲取參數(shù),并將其轉(zhuǎn)換成 String 類型的參數(shù)傳遞給 Handler 的方法。
請求類型適配
HandlerAdapter 還負(fù)責(zé)將請求的類型適配給 Handler。例如,當(dāng)請求為 GET 請求時,HandlerAdapter 會調(diào)用控制器方法中的 GET 方法;當(dāng)請求為 POST 請求時,HandlerAdapter 會調(diào)用 Handler 中的 POST 方法。
響應(yīng)類型適配
Handler 返回的結(jié)果通常應(yīng)該是一個 ModelAndView 對象,因此 HandlerAdapter 負(fù)責(zé)將 Handler 的返回結(jié)果適配給 ModelAndView 對象。例如,當(dāng) Handler 返回一個字符串時,HandlerAdapter 會將該字符串封裝成 ModelAndView 對象并返回給 DispatcherServlet。
HandlerAdapter的源碼實(shí)現(xiàn)
HandlerAdapter 接口定義了一個方法,即 handle() 方法,用于處理請求并返回 ModelAndView 對象。
Spring MVC 框架提供了多個 HandlerAdapter 的實(shí)現(xiàn)類,主要包括以下幾個:
| 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");
}
}
該方法接受三個參數(shù):HttpServletRequest、HttpServletResponse 和 Object。其中,HttpServletRequest 和 HttpServletResponse 分別表示當(dāng)前請求和響應(yīng)對象,Object 表示當(dāng)前請求所對應(yīng)的 Handler 的 HandlerMethod 對象。
在 handle() 方法中,
- 首先判斷傳入的 Handler 是否為 HandlerMethod 類型。
- 如果是,則強(qiáng)制轉(zhuǎn)換為 HandlerMethod 對象,并初始化一個 ModelAndView 對象。
- 然后,通過 getViewName() 方法獲取視圖名稱,并通過 getModelAndView() 方法獲取控制器方法的參數(shù)值并封裝成 ModelAndView 對象。
- 最后,將 ModelAndView 對象返回給 DispatcherServlet。
總結(jié)
HandlerAdapter 通過適配器模式將 HTTP 請求與 Handler 之間的接口進(jìn)行轉(zhuǎn)換,從而實(shí)現(xiàn)了請求的分發(fā)和處理。
HandlerAdapter 通過 handle() 方法將請求參數(shù)適配給 Handler 參數(shù),將請求的類型適配給 Handler,將響應(yīng)的類型適配給 ModelAndView 對象,并最終將 ModelAndView 對象返回給 DispatcherServlet。
Spring MVC 框架提供了多個 HandlerAdapter 的實(shí)現(xiàn)類,其中最常用的是 RequestMappingHandlerAdapter。RequestMappingHandlerAdapter 支持使用 @RequestMapping 注解來定義請求映射。
到此這篇關(guān)于SpringMVC適配器模式作用范圍介紹的文章就介紹到這了,更多相關(guān)SpringMVC適配器模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java.net.SocketException: Connection reset 解決方法
最近糾結(jié)致死的一個java報(bào)錯java.net.SocketException: Connection reset 終于得到解決2013-03-03
Java 高并發(fā)五:JDK并發(fā)包1詳細(xì)介紹
本文主要介紹 Java高并發(fā)JDK并發(fā)包1的資料,這里對1.各種同步控制工具的使用 2.并發(fā)容器及典型源碼分析,有需要的小伙伴可以參考下2016-09-09
使用Spring事件機(jī)制實(shí)現(xiàn)異步的方法
這篇文章主要介紹了使用Spring事件機(jī)制實(shí)現(xiàn)異步的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
詳解RocketMQ中的消費(fèi)者啟動與消費(fèi)流程分析
本文主要介紹了RocketMQ的消費(fèi)者啟動流程,結(jié)合官方源碼和示例,一步步講述消費(fèi)者在啟動和消息消費(fèi)中的的工作原理及內(nèi)容,并結(jié)合平時業(yè)務(wù)工作中,對我們所熟悉的順序、push/pull模式等進(jìn)行詳細(xì)分析,以及對于消息消費(fèi)失敗和重投帶來問題去進(jìn)行分析,需要的朋友可以參考下2022-07-07
JAVA數(shù)字千分位和小數(shù)點(diǎn)的現(xiàn)實(shí)代碼(處理金額問題)
這篇文章主要介紹了JAVA數(shù)字千分位和小數(shù)點(diǎn)的現(xiàn)實(shí)代碼(處理金額問題),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Java C++實(shí)現(xiàn)相同MD5加密算法的方式
這篇文章主要介紹了Java與C++實(shí)現(xiàn)相同MD5加密算法的方法,需要的朋友可以參考下面文章內(nèi)容2021-09-09

