這篇文章帶給大家的內容是關於Spring MVC專案啟動後的執行步驟(附原理圖),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
Spring MVC專案啟動後的執行流程:
1.執行流程:
01.在web專案啟動時,載入web.xml文件,包含核心設定檔
因為web.xml檔案中設定了mvc的核心控制器,所以就會初始化這個控制器
02.例如使用者的請求路徑是 localhost:8080/hello
#這時候會把/hello 當作請求路徑====》核心設定檔中bean的id
#03./hello 會被核心控制器攔截,去找處理器對映器(HandlerMapping)
04.底層先去找到合適的HandlerMapping之後返回一個處理器執行鏈(HandlerExecutionChain)
05.處理器執行力鏈包含一個即將執行的controller和(1-N個攔截器)
06.根據處理器執行鏈的handler找到HandlerAdapter
#07.HandlerAdapter根據我們controller的類型去執行指定的方法
#08.執行方法之後需要回傳一個ModleAndView
Modle ==》Map
View ==》String
09.如果設定了視圖解析器,將會執行,view其實是邏輯視圖名稱
沒設定視圖解析器,會執行,前綴和後綴沒值,view務必是一個物理視圖名稱
原理圖:
2.觀看底層程式碼
01. 點選web.xml檔案中的核心控制器
02. Ctrl o找到對應的方法doDispatch
03. 開始分析程式碼
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) HttpServletRequest processedRequest = request; //请求对象 HandlerExecutionChain mappedHandler = null; //处理器执行链=我们即将执行的Controller+(1+拦截器) boolean multipartRequestParsed = false; //解析一个请求是否是文件上传请求
04.找到下面的程式碼
// Determine handler for the current request. mappedHandler = getHandler(processedRequest);
根據我們的請求找到需要執行的Handler(Controller)
Ctrl 滑鼠左鍵點進getHandler()
發現這個方法的回傳值就是一個處理器執行鏈!
05.進入getHandler之後找到下面的程式碼
HandlerExecutionChain handler = hm.getHandler(request);
06. 繼續進入這裡的hm.getHandler(request)
進入之後,發現這個方法是一個介面( HandlerMapping)中的方法,沒有方法實現,所以繼續點擊實現類別AbstractHandlerMapping
07. 找到下面的程式碼並且打斷點
Object handler = getHandlerInternal(request);
08. 之後發現把獲取到的處理器執行鏈給了我們的核心控制器
// Determine handler adapter for the current request. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
點進去getHandlerAdapter()
09. 找到下面的程式碼打斷點
if (ha.supports(handler)) { return ha; }
10. 再點進去supports()
11. 發現supports()
再介面中,但是有5個實作類,springmvc預設會執行3個
但是我們寫的HelloController間接的實作了Controller接口,所以我們只需要在SimpleControllerHandlerAdapter中打斷點即可!
12. 把拿到的HandlerAdapter回傳給了核心控制器
13. 核心控制器中有了處理器適配器,接下來就改執行真正的程式碼了
// Actually invoke the handler. mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
14. 點進去handle
@Override public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return ((Controller) handler).handleRequest(request, response); }
15. 點進去handleRequest
就進入了AbstractController,我們的HelloController就是繼承了這個類別!
這個父類別執行的是handleRequestInternal(request, response);
16. 點進去handleRequestInternal
就找到了我們的實作類別
@Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("您已经进入了后台的controller/action/servlet"); return new ModelAndView("/WEB-INF/welcome.jsp"); }
以上是Spring MVC專案啟動後的執行步驟(附原理圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!