天天看點

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

上一篇到440行傳回結果result.

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

傳回result之後,使用result去擷取modelandview,執行方法getmodelandview:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

該方法主要通過result傳回值來判斷:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

目前方法是帶responsebody注解的,是以執行到這裡:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

進去方法:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

這裡是根據http類型做出相應的輸出:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

使用者配置的:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

接收的類型:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

寫的方法:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

這裡配置的json格式,是以會進入json方法:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

寫入responsebody後,傳回mav:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

最後傳回之前調用handler的地方,之後會有一些不同種類的攔截器方法:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

攔截器如:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)
Spring MVC 原理 - DispatcherServlet調用完整過程(下)
Spring MVC 原理 - DispatcherServlet調用完整過程(下)

還有一些處理不同異常情況的攔截器。

系統預設都會去執行一個攔截器,這個攔截器基本上都是空方法,是一個private類:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

傳回調用dodispatch的地方:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

傳回到doservice的地方:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

最後回到httpservlet的service方法:

Spring MVC 原理 - DispatcherServlet調用完整過程(下)

到這裡就完成了一次完整的調用過程。

可以發現,整個過程的流程是比較清晰,程式啟動時會根據mvc的配置和spring配置來處理配置資訊和注解的類。

servlet處理請求,通過request(主要是url)來擷取handler,之後最主要的一個部分就是擷取需要注入的參數,最後調用使用者方法,處理傳回結果。

整個過程中麻煩的地方就是在一些細節的處理上,這些細節未必一開始就有的,一開始應該是一個主要的流程,後續發現問題或者為了通用性做的改進。