1. 程式人生 > >springmvc執行流程簡單解釋(原始碼解析,文末附自己畫的流程圖)

springmvc執行流程簡單解釋(原始碼解析,文末附自己畫的流程圖)

首先看一下DispatcherServlet結構:

觀察HandlerExecutionChain物件的建立與賦值,這個方法用來表示執行這個方法的整條鏈。

進入getHandler方法:

此時的變數handlerMappings為:

剛好對應我們的三個方法,說明了我們的方法對映全部存放在handlerMappings中,通過遍歷handlerMapping來進行操作。
通過HandlerMapping來對HandlerExecutionChain賦值。

執行完這一句引數有,說明獲取了一條完整的鏈,可以來進行執行了,注意此時獲取到的是所有攔截器,因為必須要走過所有攔截器。

通過HandlerExecutionChain物件來獲取HandlerAdapter物件,通過這個物件進行控制器方法的呼叫,並返回ModelAndView物件,再通過ModelAndView物件呼叫解析器建立檢視物件,再通過檢視物件的渲染方法來進行最終的使用者的需求結果處理。

完成這一步後使用ha呼叫攔截器的preHandle方法,如果放行,則執行handle方法,不放行,則返回:

進入此方法中:

下一步就是執行handler處理方法,執行完方法返回一個ModelAndView物件,使用此物件呼叫檢視解析器建立檢視物件,再根據檢視物件呼叫其渲染方法將模型中的資料以特定的格式傳輸給使用者。

繼續執行:

執行到這裡以及執行完核心業務了,需要執行postHandler方法,注意這個註釋,無論是不是有異常,最終都是到這個方法中,並且有相應的異常的話還是會返回一個ModalAndView物件,讓錯誤的結果還是能正常返回,並給出相對友好的提示資訊。
/**

  • Handle the result of handler selection and handler invocation, which is
  • either a ModelAndView or an Exception to be resolved to a ModelAndView.
    */
    處理完postHandler方法之後,再執行processDispatcherResult方法。

有異常的處理:

執行渲染方法:

進入方法,根據檢視解析器獲取檢視,獲得檢視物件就返回:

解析完成,呼叫view的 render方法(注意不是DispatcherServlet的render方法):

view的render方法:

執行完渲染,跳轉時執行攔截器的afterCompletion方法。

進入方法:

弄完這些,還要通過過濾器鏈等等,最終才完成一整個springmvc的執行流程。

按照我自己的理解,畫出了這麼一幅流程圖,希望對大家有幫助:

我是福爾斯甘,如果對本篇有疑問,或者發現有什麼錯誤之處,歡迎提出指出,覺得評論不方便的話,本人郵箱是[email protected],qq同號,歡迎共同學習討論問題。
覺得不錯的話可以點個推薦分享一下哦,謝謝大家的支