Spring MVC 01 - DispatcherServlet

Screen Shot 2018-08-09 at 8.07.24 PM.png

初始化

初始化过程从 Web容器调用 DispatcherServlet Servlet.init() 方法开始。
实际调用到 HttpServletBean.init()

HttpServletBean

HttpServletBean负责设置init-params属性及作为整个Spring Servlet的入口。
HttpServletBean.init()

  1. 对比 ServletConfig 的 init-params 和 requiredProperties。确认无遗漏。

  2. BeanWrapper.setPropertyValues(PropertyValues,boolean) 设置属性到自己(及子类)的属性上。

  3. 调用模版方法initServletBean()

FrameworkServlet

负责集成Spring application Context

FrameworkServlet.initServletBean()

  1. 调用FrameworkServlet.initWebApplicationContext() 创建初始化WebApplicationContext

FrameworkServlet.initWebApplicationContext()

  1. createWebApplicationContext() 创建 tWebApplicationContext

  2. configureAndRefreshWebApplicationContext() 设置Servlet 相关属性到 context。调用 WebApplicationContext.refresh()

  3. 调用模板方法 onRefresh(),令子类可以再 WebApplicationContext.refersh() 后进行初始化。

DispatcherServlet

  1. onRefresh() 方法调用 initStrategies() 初始化各个组件
    initMultipartResolver(context);
        initLocaleResolver(context);
        initThemeResolver(context);
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initHandlerExceptionResolvers(context);
        initRequestToViewNameTranslator(context);
        initViewResolvers(context);
        initFlashMapManager(context);

组件init 的时候会先

  1. 尝试从当前容器中取出所有满足类型的bean。

  2. 如果什么都没找到的话,则用getDefaultStrategies(context, targetClass) 从 DispatcherServlet.properties 中获取默认配置

处理请求

FrameworkServlet

override了service(), doGet(), doPost() 等方法,同一把请求交给 FrameworkServlet.processResult(HttpServletRequest, HttpServletResponse)处理
FrameworkServlet.processResult

  1. 保存之前的localeContxt 和 requestAttributes。生成并设置新的localContext 和requestAttributes。(localeContxt 和 requestAttributes均为thread local 的属性)

  2. 调用模版方法doService(request, response) 将实际的处理请求留给子类实现

  3. 恢复localeContext 和requestAttributes。发布ServletRequestHandledEvent 事件

DispatchServlet

doService() 调用 doDispatch() 具体处理
doDispatch 分为两部分
第一部分先调用 handler 处理请求

  1. checkMultipart(request) 处理文件上传

  2. mappedHandler = getHandler() 获取 handler execution chain

  3. ha = getHandlerAdapter() 获取handler adapter

  4. mappedHandler.applyPreHandle() 执行intercepters 的preHandle 方法

  5. mv = ha.handle(request, response, mappedHandler.getHandler()) 实际调用handler

  6. mappedHandler.applyPostHandle() 执行intercepters 的postHandle 方法

第二部分渲染view

  1. 过程中所有的Exception 都被catch 到 dispatchException 中。然后调用processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)。

  2. 先检查有没有dispatchException,有的话先调用processHandlerException获取新的error 的 modelAndView。processHandlerException 使用handlerExceptionResolvers 处理exception,返回新的 modelAndView, 然后将 exception 中的属性设置到request attrs 中供之后渲染使用。

  3. processDispatchResult 调用 render(mv, request, response) 实际渲染 view。

  4. 渲染结束之后调用结束之后调用 mappedHandler.triggerAfterCompletion(request, response, exception) 执行 intercepters.afterCompletion 方法,这里的exception 为渲染过程中出现的exception

你可能感兴趣的:(Spring MVC 01 - DispatcherServlet)