Spring MVC 的请求处理流程

根据 Spring MVC 源码, spring-webmvc:5.3.2

  1. 客户端发送请求
  2. 经过 Servlet API 的 filter
  3. 请求到达 DispatcherServlet.DispatcherServlet 控制器按顺序调用每个 HandlerMapping , 直到找到第一个handler。
  4. HandlerMapping 根据请求调用对应的 Controller 组件处理。获得 HandlerExecutionChain 记为 mappedHandler
    • HandlerMapping 负责维护请求和 Controller 组件对应关系。
    • HandlerExecutionChain 中包含 handler (HandlerMethod) 和拦截器列表
    • RequestMappingHandlerMapping 中的 handler 类型是 HandlerMethod
  5. 依次调用 handlerAdapters 直到找到一个支持 handler 的 handlerAdapter
    • 未找到会报 ServletException
    • HandlerAdapter 用于支持不用的 handler, 并对dispatcherServlet 提供统一的执行接口 handler() 方法
    • HandlerMethod 对应的HandlerAdapter是 RequestMappingHandlerAdapter
  6. HandlerExecutionChain 按顺序执行拦截器的 preHandle 方法
    • 如果一个拦截器的 preHandle 方法返回了false ,
      1. 将马上调用所有拦截器的afterCompletion 方法
      2. 结束请求的处理
  7. 调用 handlerAdapter 的 handle 方法, 执行handler, 并返回ModelAndView
    • RequestMappingHandlerAdapter的执行过程
      1. 绑定用于绑定参数的 WebDataBinderFactory
      2. 获取model工厂
      3. 解析方法参数
      4. 执行方法
      5. 生成ModelAndView
  8. HandlerExecutionChain 按顺序执行拦截器的 postHandle 方法
  9. 处理调度结果, 尝试处理异常, 渲染试图
    1. 异常处理, 如果有异常, 调用 HandlerExceptionResolver 处理异常 生成ModelAndView
    • 如果没找到对应的 HandlerExceptionResolver, 将异常再次抛出
    • 之后拦截器将会在 afterCompletion 方法中接收到异常参数
      1. 渲染handler 返回的视图
    1. 本地化
    2. 依次调用 viewResolvers 解析视图
    3. 如果没有viewName, 直接返回ModelAndView中的view
    4. view 将视图渲染并写入HttpServletResponse
      1. handlerExecutionChain 按顺序执行拦截器的 afterCompletion 方法, 无异常
  10. 请求处理完成

发表评论