底層實現原理圖:
觀看底層代碼:
1):打開 web.xml 文件
2):按住 Ctrl + 鼠標左鍵 進入底層查看源碼
3):按住 Ctrl+o 找到對應的方法doDispatch
5):找到下面的代碼:
根據我們的請求找到需要執行的Handler(Controller)ctrl+鼠標左鍵 點進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/)