首先看一下DispatcherServlet結構:
spring
觀察HandlerExecutionChain對象的建立與賦值,這個方法用來表示執行這個方法的整條鏈。
mvc
進入getHandler方法:
app
此時的變量handlerMappings爲:
post
恰好對應咱們的三個方法,說明了咱們的方法映射所有存放在handlerMappings中,經過遍歷handlerMapping來進行操做。
經過HandlerMapping來對HandlerExecutionChain賦值。
學習
執行完這一句參數有,說明獲取了一條完整的鏈,能夠來進行執行了,注意此時獲取到的是全部攔截器,由於必需要走過全部攔截器。spa
經過HandlerExecutionChain對象來獲取HandlerAdapter對象,經過這個對象進行控制器方法的調用,並返回ModelAndView對象,再經過ModelAndView對象調用解析器建立視圖對象,再經過視圖對象的渲染方法來進行最終的用戶的需求結果處理。
3d
完成這一步後使用ha調用攔截器的preHandle方法,若是放行,則執行handle方法,不放行,則返回:
對象
進入此方法中:
blog
下一步就是執行handler處理方法,執行完方法返回一個ModelAndView對象,使用此對象調用視圖解析器建立視圖對象,再根據視圖對象調用其渲染方法將模型中的數據以特定的格式傳輸給用戶。
get
繼續執行:
執行到這裏以及執行完核心業務了,須要執行postHandler方法,注意這個註釋,不管是否是有異常,最終都是到這個方法中,而且有相應的異常的話仍是會返回一個ModalAndView對象,讓錯誤的結果仍是能正常返回,並給出相對友好的提示信息。
/**
有異常的處理:
執行渲染方法:
進入方法,根據視圖解析器獲取視圖,得到視圖對象就返回:
解析完成,調用view的 render方法(注意不是DispatcherServlet的render方法):
view的render方法:
執行完渲染,跳轉時執行攔截器的afterCompletion方法。
進入方法:
弄完這些,還要經過過濾器鏈等等,最終才完成一整個springmvc的執行流程。
按照我本身的理解,畫出了這麼一幅流程圖,但願對你們有幫助:
我是福爾斯甘,若是對本篇有疑問,或者發現有什麼錯誤之處,歡迎提出指出,以爲評論不方便的話,本人郵箱是96532354@qq.com,qq同號,歡迎共同窗習討論問題。 以爲不錯的話能夠點個推薦分享一下哦,謝謝你們的支持~~