DispatcherServlet的處理流程


前言

     上一篇介紹了SpringMVC的啟動過程,DispatcherServlet作為一個前端控制器,分發處理http請求

1.DispatcherServlet流程圖

具體流程:

1. 用戶發請求-->DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統一訪問點,進行全局的流程控制。

2.DispatcherServlet-->HandlerMapping,HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器,多個HandlerInterceptor攔截器)。

3.DispatcherServlet-->HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器。

4.HandlerAdapter-->處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理,並返回一個ModelAndView對象(包含模型數據,邏輯視圖名)

5.ModelAndView的邏輯視圖名-->ViewResolver,ViewResoler將把邏輯視圖名解析為具體的View。

6.View-->渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構

7.返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶。

2.HandlerMapping

HandlerMapping處理器映射器,功能是根據請求的url找到合適的處理器。

2.1 HandlerMapping結構圖

   

2.2 BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping處理器映射器,會根據請求的url與spring容器中定義的處理器bean的name屬性值進行匹配,從而在spring容器中找到處理器bean實例.

<!-- 注冊處理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

<!-- 注冊處理器-->
<bean id="/show.do" class="com.example.handlers.HelloWorldController" />

對於處理器的bean的name屬性值必須以"/"開頭


2.3 SimpleUrlHandlerMapping

使用BeanNameUrlHandlerMapping映射器有兩點不足:

1.處理器Bean的id為一個url請求路徑,而不是Bean的名稱,有些不倫不類。

2.處理器Bean的定義與請求url綁定在了一起。若出現多個url請求同一個處理器的情況,就需要在spring容器中配置多個該處理器類的<bean/>。這將導致容器會創建多個該處理器類實例。

SimpleUrlHandlerMapping處理器映射器,會根據請求的url與Spring容器中定義的處理器映射器子標簽的key屬性進行匹配。匹配上后,再將該key的value值與處理器bean的id值進行匹配,從而在Spring容器中找到處理器bean。

<!--注冊處理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.do">myController</prop> <prop key="/world.do">myController</prop> <prop key="/my.do">myController</prop> </props> </property> </bean> <!--注冊處理器-->
<bean id="myController" class="com.examaple.handlers.MyController">


2.4 DefaultAnnotationHandlerMapping

主要是針對注解,這個已廢棄使用,用RequsetMappingHandlerMapping來代替

2.5 RequestMappingHandlerMapping

針對注解@RequestMapping  @Controller的

3.HandlerAdapter

HandlerApdater處理器適配器,作用是根據請求的url找到處理器的調用方法

3.1 HandlerAdapter體系結構圖

    

3.2  RequestMappingHandlerAdapter

      實際就是執行@RequestMapping注解的方法。

3.3  AnnotationMethodHandlerAdapter

        已被廢棄,就不做過多介紹

3.4  SimpleControllerHandlerAdapter

      實際就是執行Controller的handleRequest方法。要求handler必須實現Controller接口

3.5  HttpRequestHandlerAdapter

實際就是執行HttpRequestHandler的handleRequest方法。要求handler必須實現HttpRequestHandler接口

3.6. SimpleServletHandlerAdapter

實際就是執行HttpServlet的service方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM