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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章