首頁 > Java > java教程 > 主體

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

不言
發布: 2018-09-19 14:23:36
原創
4125 人瀏覽過

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

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!