分享知識-快樂自己:SpringMVC 底層執行原理解析


底層實現原理圖:

 

觀看底層代碼:

1):打開 web.xml 文件

 2):按住 Ctrl + 鼠標左鍵 進入底層查看源碼

 

  3):按住 Ctrl+o 找到對應的方法doDispatch

  5):找到下面的代碼:

根據我們的請求找到需要執行的HandlerControllerctrl+鼠標左鍵 點進getHandler()  發現這個方法的返回值就是一個處理器執行鏈!

 

  6):進入getHandler之后找到下面的代碼:繼續進入這里的hm.getHandler(request)

 

--

進入之后,發現這個方法是一個接口(HandlerMapping)中的方法,沒有方法實現,所以繼續點擊實現類AbstractHandlerMapping

7):之后發現把獲取到的處理器執行鏈給了我們的核心控制器:回到 DispatcherServlet 類中的 doDispatch 方法中

 

 

點進去getHandlerAdapter();

 

  8): 再點進去supports():

  發現supports()再接口中,但是有5個實現類,springmvc默認會執行3個;

  但是我們寫的HelloController間接的實現了Controller接口,所以我們只需要在SimpleControllerHandlerAdapter中打斷點即可!

 

 

 

 把拿到的HandlerAdapter返回給了核心控制器

 

9):核心控制器中有了處理器適配器,接下來就改執行真正的代碼了:回到 DispatcherServlet 類中的 doDispatch 方法中

找到以下代碼:點進去handle

 

同樣有多個實現類:在上述說到我們現在實現的是 Controller 類型的,所以我們只關注 SimpleControllerHandlerAdapter 就可以了。

 

 

--

 

 

--

 

 

 

--

 

最終總結:

  

 

  1):用戶發起請求到前端控制器(DispatcherServlet),該控制器會過濾出哪些請求可以訪問Servlet、哪些不能訪問。就是url-pattern的作用,並且會加載springmvc.xml配置文件。

  2):前端控制器會找到處理器映射器(HandlerMapping),通過HandlerMapping完成url到controller映射的組件,簡單來說,就是將在springmvc.xml中配置的或者注解的url與對應的處理類找到並進行存儲,

  用map<url,handler>這樣的方式來存儲。

  3):HandlerMapping有了映射關系,並且找到url對應的處理器,HandlerMapping就會將其處理器(Handler)返回,在返回前,會加上很多攔截器。

  4):DispatcherServlet拿到Handler后,找到HandlerAdapter(處理器適配器),通過它來訪問處理器,並執行處理器。

  5):執行處理器

  6):處理器會返回一個ModelAndView對象給HandlerAdapter

  7):通過HandlerAdapter將ModelAndView對象返回給前端控制器(DispatcherServlet)

  8):前端控制器請求視圖解析器(ViewResolver)去進行視圖解析,根據邏輯視圖名解析成真正的視圖(jsp),其實就是將ModelAndView對象中存放視圖的名稱進行查找,找到對應的頁面形成視圖對象

  9):返回視圖對象到前端控制器。

  10):視圖渲染,就是將ModelAndView對象中的數據放到request域中,用來讓頁面加載數據的。

  11):通過第8步,通過名稱找到了對應的頁面,通過第10步,request域中有了所需要的數據,那么就能夠進行視圖渲染了。最后將其返回即可。

 

--------------------------------------------------------------------------------

以上內容若有不足之處:請多多請教

如要轉載請注明小編本站地址:(https://www.cnblogs.com/mlq2017/)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM