zoukankan      html  css  js  c++  java
  • 第一节: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、将渲染结果返回给客户端
  • 相关阅读:
    mysql
    jQuery选择器
    使用JavaScript操作DOM节点元素的常用方法(创建/删除/替换/复制等)
    MVC2.0==>MVC3.0
    sql 邮件发送测试情况
    C#调用存储过程
    设计模式
    sql 分页
    SQL Server 存储过程(转载)
    sqlitehelper封装
  • 原文地址:https://www.cnblogs.com/niujifei/p/15661512.html
Copyright © 2011-2022 走看看