第一节:SpringMVC 运行流程

一、SpringMVC 流程图

  

  组件说明

  1、HandlerMapping 里存储是所有请求和处理器之间的关系,HandlerExecutionChain 是来找到某一个请求和处理器之间的关系,还有拦截器,即某一个指定的请求和处理器之间的管理。
  2、HandlerAdapter:处理器适配器:来执行 Handler(处理器)中的方法,对处理器执行和调用,还会执行拦截器的方法。
     如果没有执行拦截器,会执行默认拦截器,先执行 preHandler,若返回 false,拦截,至此结束;返回 true,继续向下执行。
  3、HandlerExceptionResolver 异常处理器:如果对该异常能够进行处理,就进行处理;若不能进行处理,按默认的处理
  4、无论成功与否,拦截器的 AfterCompletion 都会执行。

  工作流程描述

  1、所有请求,前端控制器( DispatcherServlet) 收到请求,调用 doDispatch 进行处理;
  2、根据 HandlerMapping 中保存的请求映射信息找到,处理当前请求的,处理器执行链(HandlerExecutorChain)包含拦截器,处理器;
  3、根据当前处理器找到他的 HandlerAdapter(适配器);
  4、拦截器的 preHandler 先执行;
  5、适配器执行目标方法,并返回 ModelAndView 
    (1)ModelAttribute 注解标注的方法提前运行;
    (2)执行目标方法的时候(确定目标方法用的参数)
      [1] 有注解
      [2] 无注解
        a、看是否Model、Map,以及其他的
        b、如果是自定义类型
          ① 从隐含模型中看有没有,如果有就从隐含模型中拿;
          ② 如果没有,再看是否有 SessionAttribute标注的属性,如果是从 session 中拿,如果拿不到会抛出异常;
          ③ 都不是,就利用反射创建对象;
  6、拦截器的 postHandler 执行;
  7、处理结果(页面渲染)
    (1)如果有异常使用异常解析器处理异常,处理完后还会返回 ModelAndView;
    (2)调用 render 进行页面渲染
      ① 视图解析器根据视图名得到视图对象;
      ② 视图对象调用 render 方法;
    (3) 执行拦截器的 afterCompletion

二、SpringMVC 工作流程描述

  SpringMVC运行流程图:

  1、用户由客户端向服务器发送请求,请求被 SpringMVC 前端控制器 DispatcherServlet 捕获。
  2、DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符(URI):
            判断请求 URI 对应的映射:
         (1)不存在:
                  ① 再判断是否配置了默认的 Servlet <mvc:default-servlet-handler>

      a、如果没有配置,则控制台报映射查找不到,客户端展示 404 错误;

      b、如果有配置,查看默认的 Servlet 是否能处理:

        ① 默认 Servlet 能处理:则执行目标资源(一般为静态资源,如:JS、CSS、HTML);

        ② 默认 Servlet 不能处理:匹配不到资源,报 404 错误;

         (2)存在:执行下面的流程:
  3、根据该 URI,调用 HandlerMapping 获取该 Handler 配置的所有相关的对象(包括 Handler对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回;
  4、DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。
  5、如果成功获取 HandlerAdapter后,此时将开始执行拦截器 preHandler(...) 方法【正向执行】
  6、提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller)方法,处理请求。在填充 Handler 的形参过程中,根据你的配置,Spring 将帮你做一些额外的工作:
    (1)HttpMessageConverter:将请求消息(如 Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息;
    (2)数据转换:对请求消息进行数据转换。如String转换成 Integer、Double 等;
    (3)数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等;
    (4)数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BingingResult 或 Error 中;
  7、Handler 执行完毕后,向 DispatcherServlet 返回一个 ModelAndView 对象;
  8、此时将开始执行拦截器的 postHandle(...) 方法【逆向】;
  9、根据返回的 ModelAndView(此时会判断是否存在异常:如果存在异常,则执行 HandlerExceptionResolver 进行异常处理)选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet,根据 Model 和 View,来渲染视图;
  10、在返回给客户端时需要执行拦截器的 AfterCompletion方法【逆向】
  11、将渲染结果返回给客户端
原文地址:https://www.cnblogs.com/niujifei/p/15661512.html