DispatcherServlet执行原理分析

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-02-23 07:22 被阅读0次

    上一篇 <<<SpringMVC运行流程
    下一篇 >>>过滤器与拦截器的区别


    SpringMVC核心的就是DispatcherServlet,所有的请求都会转发到DispatcherServlet,然后在通过DispatcherServlet执行具体的控制层(Handler) 返回modelAndView给客户端视图展示。

    1.容器初始化

    1、初始化:HttpServletBean:init()

    2、层层调用:FrameworkServlet:initServletBean()→initWebApplicationContext()→configureAndRefreshWebApplicationContext(cwac)→wac.refresh();
    AbstractApplicationContext:refresh()→finishRefresh();

    3、最后调用到具体类:DispatcherServlet:onRefresh(ApplicationContext context)→initStrategies(context){
    initMultipartResolver(context); //初始化上传文件解析器(或者是多部分请求解析器)
    initLocaleResolver(context);//初始化本地化解析器
    initThemeResolver(context);//初始化主题解析器
    initHandlerMappings(context);//初始化处理器映射器





    initHandlerAdapters(context);//初始化处理器适配器



    initHandlerExceptionResolvers(context);//初始化处理器异常解析器
    initRequestToViewNameTranslator(context);//初始化请求到视图名翻译器
    initViewResolvers(context);//初始化视图解析器

    initFlashMapManager(context);//初始化重定向数据管理器

    2.http请求过程:doDispatch(request, response);

    try {
    //1.根据request里的url从handlerMappings里获得请求目标的方法,也就是控制层具体的方法
    mappedHandler = getHandler(processedRequest);



    //2.从handlerAdapters中获取控制层适配器RequestMappingHandlerAdapter
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());



    //3.执行拦截器的前置方法
    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
    //3.1 直接拦截器的具体preHandle方法
    if (!interceptor.preHandle(request, response, this.handler)) {

    //3.2 如果拦截器的preHandle方法返回false,则执行拦截器的afterCompletion方法
    triggerAfterCompletion(request, response, null);
    return false;
    }
    return;
    }
    //4.利用反射机制,执行实际请求目标方法返回modeAndView对象
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    //5.执行拦截器PostHandle()方法
    mappedHandler.applyPostHandle(processedRequest, response, mv);
    //6.设置渲染视图层内容
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    {
    //6.1如果有抛异常,则执行异常处理的相关操作
    mv = processHandlerException(request, response, handler, exception);
    //6.2 视图层渲染具体操作
    render(mv, request, response);
    //6.3 执行拦截器afterCompletion方法
    mappedHandler.triggerAfterCompletion(request, response, null);
    }
    }
    catch (Exception ex) {
    //执行拦截器afterCompletion方法
    triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    }
    catch (Throwable err) {
    //执行拦截器afterCompletion方法
    triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", err));
    }


    推荐阅读:
    <<<Spring Servlet相关知识
    <<<Spring原理汇总及零碎知识点
    <<<Web项目的启动方式汇总
    <<<SpringMVC底层无web.xml启动原理分析
    <<<SpringMVC运行流程
    <<<过滤器与拦截器的区别
    <<<SpringMVC拦截器的用法
    <<<SpringMVC异步实现方式
    <<<@Async注解的失效之谜
    <<<SpringMVC适配器类型汇总

    相关文章

      网友评论

        本文标题:DispatcherServlet执行原理分析

        本文链接:https://www.haomeiwen.com/subject/tcsuxltx.html