SpringMVC運行流程分析

雖然網上有許多的springmvc流程分析,但別人的總是別人的,自己不來走一遍,總感覺空空的
1.首先,用戶發送請求request到SpringMVC的前端控制器-DispatcherServlet,

2.收到request請求之後的前端控制器調用getHandler()方法,獲取Handler執行鏈HandlerExecutionChain

3.然後前端控制器調用getHandlerAdapter(Handler)方法獲得HandlerAdapter方法,並由其去掉用相應的處理方法去返回ModelAndView>>具體流程如下:
①、首先遍歷HandlerExecutionChain處理器執行鏈中攔截器intercepter的preHandle()方法–

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
        if (getInterceptors() != null) {
            for (int i = 0; i < getInterceptors().length; i++) {
                HandlerInterceptor interceptor = getInterceptors()[i];
                if (!interceptor.preHandle(request, response, this.handler)) {
                    triggerAfterCompletion(request, response, null);
                    return false;
                }
                this.interceptorIndex = i;
            }
        }
        return true;
    }

②、然後調用目標處理方法來返回ModelAndView對象
③、在渲染視圖view之前遍歷執行攔截器的postHandle()方法–

for (int i = getInterceptors().length - 1; i >= 0; i--) {
            HandlerInterceptor interceptor = getInterceptors()[i];
            interceptor.postHandle(request, response, this.handler, mv);
        }

④、:調用render方法進行視圖view的渲染:
——第一步:由我們在springmvc的配置文件中的視圖解析器,獲得view對象即對應的物理路徑。
——第二步:調用view.render()方法,進行model模型數據的裝配對應的方法renderMergedOutputModel(mergedModel, request, response);有java的官方文檔可以知道,the steb will be the actual rendering of the view.
⑤、:遍歷HandlerExecutionChain處理器執行鏈中攔截器intercepter的方法afterCompletion()方法,

for (int i = this.interceptorIndex; i >= 0; i--) {
            HandlerInterceptor interceptor = getInterceptors()[i];
            try {
                interceptor.afterCompletion(request, response, this.handler, ex);
            }
            catch (Throwable ex2) {
                logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
            }
        }

–由源碼可以看到,先配置的intercepter後執行其aftercompletion()方法

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章