c通過上篇我們知道了Spring mvc是需要配置一個DispatcherServlet
,那么一個springmvc是怎么做到把一個請求通過一個Servlet來轉發到不同的Controller上呢?
我們就需要了解下DispatcherServlet這個類,看看它到底做了什么。
DispatcherServlet的繼承關系:
各個Servlet的作用:
- HttpServletBean
主要做一些初始化的工作,將web.xml中配置的參數設置到Servlet中。比如servlet標簽的子標簽init-param標簽中配置的參數。
- FrameworkServlet
將Servlet與Spring容器上下文關聯。其實也就是初始化FrameworkServlet的屬性webApplicationContext,這個屬性代表SpringMVC上下文,它有個父類上下文,既web.xml中配置的ContextLoaderListener監聽器初始化的容器上下文。
- DispatcherServlet
初始化各個功能的實現類。比如異常處理、視圖處理、請求映射處理等。
在分析DispatcherServlet處理請求過程之前,我們回顧一下Servlet對于請求的處理。
HttpServlet提供了service方法用于處理請求,service使用了模板設計模式,在內部對于http get方法會調用doGet方法,http post方法調用doPost方法...........
進入processRequest方法看下:
其中注冊的監聽器類型為ApplicationListener接口類型。
doDispatch方法功能簡單描述一下:
首先根據請求的路徑找到HandlerMethod(帶有Method反射屬性,也就是對應Controller中的方法),然后匹配路徑對應的攔截器,有了HandlerMethod和攔截器構造個HandlerExecutionChain對象。HandlerExecutionChain對象的獲取是通過HandlerMapping接口提供的方法中得到。有了HandlerExecutionChain之后,通過HandlerAdapter對象進行處理得到ModelAndView對象,HandlerMethod內部handle的時候,使用各種HandlerMethodArgumentResolver實現類處理HandlerMethod的參數,使用各種HandlerMethodReturnValueHandler實現類處理返回值。 最終返回值被處理成ModelAndView對象,這期間發生的異常會被HandlerExceptionResolver接口實現類進行處理。