文章目錄
- 14、SpringMVC執行流程
- 14.1、SpringMVC常用組件
- 14.2、DispatcherServlet初始化過程
- ①初始化WebApplicationContext
- ②創建WebApplicationContext
- ③DispatcherServlet初始化策略
- 14.3、DispatcherServlet調用組件處理請求
- ①processRequest()
- ②doService()
- ③doDispatch()
- ④processDispatchResult()
- 14.4、SpringMVC的執行流程
- 用戶向服務器發送請求,請求被SpringMVC 前端控制器 DispatcherServlet捕獲。
- DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI),判斷請求URI對應的映射:
- 不存在
- 存在則執行下面的流程
14、SpringMVC執行流程
14.1、SpringMVC常用組件
- DispatcherServlet:前端控制器,不需要工程師開發,由框架提供
作用:統一處理請求和響應,整個流程控制的中心,由它調用其它組件處理用戶的請求
- HandlerMapping:處理器映射器,不需要工程師開發,由框架提供
作用:根據請求的url、method等信息查找Handler,即控制器方法
- Handler:處理器,需要工程師開發
作用:在DispatcherServlet的控制下Handler對具體的用戶請求進行處理
- HandlerAdapter:處理器適配器,不需要工程師開發,由框架提供
作用:通過HandlerAdapter對處理器(控制器方法)進行執行
- ViewResolver:視圖解析器,不需要工程師開發,由框架提供
作用:進行視圖解析,得到相應的視圖,例如:ThymeleafView、InternalResourceView、
RedirectView
- View:視圖
作用:將模型數據通過頁面展示給用戶
14.2、DispatcherServlet初始化過程
DispatcherServlet 本質上是一個 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏觀上是 Servlet生命周期來進行調度。
①初始化WebApplicationContext
②創建WebApplicationContext
所在類:org.springframework.web.servlet.FrameworkServlet
③DispatcherServlet初始化策略
FrameworkServlet創建WebApplicationContext后,刷新容器,調用onRefresh(wac),此方法在DispatcherServlet中進行了重寫,調用了initStrategies(context)方法,初始化策略,即初始化DispatcherServlet的各個組件
所在類:org.springframework.web.servlet.DispatcherServlet
14.3、DispatcherServlet調用組件處理請求
①processRequest()
FrameworkServlet重寫HttpServlet中的service()和doXxx(),這些方法中調用了
processRequest(request, response)
所在類:org.springframework.web.servlet.FrameworkServlet
②doService()
所在類:org.springframework.web.servlet.DispatcherServlet
③doDispatch()
所在類:org.springframework.web.servlet.DispatcherServlet
④processDispatchResult()
14.4、SpringMVC的執行流程
-
用戶向服務器發送請求,請求被SpringMVC 前端控制器 DispatcherServlet捕獲。
-
DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI),判斷請求URI對應的映射:
-
不存在
- 再判斷是否配置了mvc:default-servlet-handler
- 如果沒配置,則控制臺報映射查找不到,客戶端展示404錯誤
- 如果有配置,則訪問目標資源(一般為靜態資源,如:JS,CSS,HTML),找不到客戶端也會展示404錯誤
-
存在則執行下面的流程
- 根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以HandlerExecutionChain執行鏈對象的形式返回。
- DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter
- 如果成功獲得HandlerAdapter,此時將開始執行攔截器的preHandler(…)方法【正向】
- 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)方法,處理請求。在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
- 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
- 數據格式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
- 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
- Handler執行完成后,向DispatcherServlet 返回一個ModelAndView對象。
- 此時將開始執行攔截器的postHandle(…)方法【逆向】。
- 根據返回的ModelAndView(此時會判斷是否存在異常:如果存在異常,則執行 HandlerExceptionResolver進行異常處理)選擇一個適合的ViewResolver進行視圖解析,根據Model 和View,來渲染視圖。
- 渲染視圖完畢執行攔截器的afterCompletion(…)方法【逆向】。
擇一個適合的ViewResolver進行視圖解析,根據Model 和View,來渲染視圖。 - 渲染視圖完畢執行攔截器的afterCompletion(…)方法【逆向】。
- 將渲染結果返回給客戶端。
-