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