首頁 >Java >java教程 >Spring MVC專案啟動後的執行步驟(附原理圖)

Spring MVC專案啟動後的執行步驟(附原理圖)

不言
不言原創
2018-09-19 14:23:364295瀏覽

這篇文章帶給大家的內容是關於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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn