1. 程式人生 > >DispatchServlet請求處理原始碼分析

DispatchServlet請求處理原始碼分析

 1、Spring MVC框架核心控制器DispatchServlet攔截到請求後,呼叫doService進行請求處理:

a) 設定spring mvc框架中的相關物件到Request作用域中:

b) 呼叫doDispath()方法進行請求處理:

 

2、DispatchServlet物件doDispatch()進行請求處理:

a) 檢查請求資訊,如是否是檔案上傳請求等;

b) 調動getHandle()方法,遍歷Spring Dispatch上下中註冊的HandlerMapping物件,使用HandlerMapping處理器對映器根據url找到處理請求的Controller和處理方法。找到後就停止遍歷,最終會返回一個

HandlerExecutionChain物件。其中包括處理請求的Controller,處理方法,還有新增在該url上的攔截器(包括spring mvc預設新增的攔截器)

 


注意:

預設新增的攔截器有:

ConversionServiceExposingInterceptor:每次請求處理前新增Conversion Service物件到Request作用域裡面。

ResourceUrlProviderExposingInterceptor:每次請求處理前新增Resource UrlProvider物件到Request作用域裡面。

啟用spring mvc功能,如<mvc:annotaion-drivern/>

或者@EnableWebMvcspring會自動註冊一些HandlerMapping物件,也可以手動配置。不同的handlerMapping實現,根據url對映到Controller的處理方法上的對映規則不一樣,如:

BeanNameUrlHandlerMapping:根據urlBeanname進行對映找到處理器物件ControllerBeanname屬性定義是已“/"開頭,

RequestMappingHandlerMappingspring3.1後使用,也是根據註解@Controller@RequestMappingurl進行對映匹配物件的處理器Controller和處理方法。

c) 呼叫getHandlerAdapter()方法;遍歷Spring Dispatch容器中的HandlerAdapter物件,檢視每個HandlerAdapter物件能否支援上面找到controller(實際上並非Controller型別,是HandlerMapping物件返回的,不同的HandlerMapping返回的型別不一樣)

 

 

 

Spring MVC定了不同的HandlerAdapter物件,能夠適配不同Controller實現物件,如:

SimpleControllerHandlerAdapter:要求Controller控制器實現Controller介面,以及實現介面中的方法handleRequest()方法來處理請求,通常和處理對映器BeanNameUrlHandlerMapping或者SimpleUrlHandlerMapping聯合使用。

RequestMappingHandlerAdapter:適配使用註解@Controller@RequestMapping標識的處理器,spring3.1後使用,替換了DefaultAnnotationHandlerAdapter,和RequestMappingHandler Mapping聯合使用。

d) 請求預先處理,呼叫HandlerExecutionChain物件的applyPreHandle()預處理請求;遍歷攔截該url的攔截器列表,執行preHandle()方法:

 

 

注意:攔截器列表中包括Spring MVC內建的攔截器。如:

ConversionServiceExposingInterceptorpreHandler()方法:

request.setAttribute(ConversionService.class.getName(), this.conversionService);

ResourceUrlProviderExposingInterceptorpreHandler()方法:

request.setAttribute(RESOURCE_URL_PROVIDER_ATTR, this.resourceUrlProvider);

e) 統一呼叫HandlerAdapterhandle()方法處理請求,並返回處理結果ModelAndView物件。

 

f) 解析返回的結果物件ModelAndView物件中的邏輯檢視,沒有則不解析

g) 請求後處理,呼叫HandlerExecutionChain物件的applyPOSTHandle()請求後處理;遍歷攔截該url的攔截器列表,執行postHandle()方法:

h) 呼叫processDispatchResult()方法;處理請求處理結果,並返回相應資料。