DispatchServlet請求處理原始碼分析
1、Spring MVC框架核心控制器DispatchServlet攔截到請求後,呼叫doService進行請求處理:
a) 設定spring mvc框架中的相關物件到Request作用域中:
b) 呼叫doDispath()方法進行請求處理:
2、DispatchServlet物件doDispatch()進行請求處理:
a) 檢查請求資訊,如是否是檔案上傳請求等;
b) 調動getHandle()方法,遍歷Spring Dispatch上下中註冊的HandlerMapping物件,使用HandlerMapping處理器對映器根據url找到處理請求的Controller和處理方法。找到後就停止遍歷,最終會返回一個
注意:
預設新增的攔截器有:
ConversionServiceExposingInterceptor:每次請求處理前新增Conversion Service物件到Request作用域裡面。
ResourceUrlProviderExposingInterceptor:每次請求處理前新增Resource UrlProvider物件到Request作用域裡面。
啟用spring mvc功能,如<mvc:annotaion-drivern/>
BeanNameUrlHandlerMapping:根據url和Bean的name進行對映找到處理器物件Controller,Bean的name屬性定義是已“/"開頭,
RequestMappingHandlerMapping:spring3.1後使用,也是根據註解@Controller和@RequestMapping和url進行對映匹配物件的處理器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內建的攔截器。如:
ConversionServiceExposingInterceptor的preHandler()方法:
request.setAttribute(ConversionService.class.getName(), this.conversionService);
ResourceUrlProviderExposingInterceptor的preHandler()方法:
request.setAttribute(RESOURCE_URL_PROVIDER_ATTR, this.resourceUrlProvider);
e) 統一呼叫HandlerAdapter的handle()方法處理請求,並返回處理結果ModelAndView物件。
f) 解析返回的結果物件ModelAndView物件中的邏輯檢視,沒有則不解析
g) 請求後處理,呼叫HandlerExecutionChain物件的applyPOSTHandle()請求後處理;遍歷攔截該url的攔截器列表,執行postHandle()方法:
h) 呼叫processDispatchResult()方法;處理請求處理結果,並返回相應資料。