前言
上一篇介紹了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方法