• SpringMVC 执行流程


    SpringMVC框架的请求流程

    1. 用户发起 request,进入前端控制器DispatcherServlet
    2. DispatcherServlet请求处理映射器HandlerMapping查找 Handler;
    3. HandlerMapping根据用户请求的 url ,查找与之匹配的 Handler(也就是 Controller 中配置了相应路径的一个方法),返回一个执行链;
    4. DispatcherServlet再请求处理适配器HandlerAdapter执行 Handler;
    5. Handler 被执行;
    6. 返回ModelAndView对象;
    7. HandlerAdapter又将ModelAndView返回给DispatcherServlet
    8. DispatcherServlet请求视图解析器对视图进行解析;
    9. 视图解析器匹配相应的视图结果并返回;
    10. DispatcherServlet收到View后,对视图进行渲染,将Model中的数据填充到视图中的 request 区域,生成最终的视图;
    11. 返回 response 。

    不难看出,DispatcherServlet 是整个流程控制的核心,由它调用其他组件处理请求、返回响应,相当于一个转发器或中央处理器,降低了其他组件之间的耦合度。如果不使用 SpringMVC,我们可能需要在web.xml中为每一个请求都配置一个 Servlet,但是现在就只需要配置一个前端控制器:

    <!-- web.xml -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- springMVC 配置文件 -->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-*.xml</param-value>
        </init-param>
        <!-- 容器在应用启动时就加载并初始化这个servlet,值越小,优先级越高 -->
        <load-on-startup>1</load-on-startup>
        <!-- 支持异步处理 -->
        <async-supported>true</async-supported>
    </servlet>
    

    关于异步处理,详见:Servlet 3.0 新特性详解,张建平,IBM

    其他工作

    在处理适配器 HandlerAdapter 执行处理器的过程中,Spring 还做了这些额外工作:

    1. 消息转换

    HTTP 请求和响应报文本质上都是一串字符串,当请求报文来到 Java 世界,它会被封装成为一个 ServletInputStream 的输入流,供我们读取报文。响应报文则是通过一个 ServletOutputStream 的输出流,来输出响应报文。我们从流中只能读取到原始的字符串报文,同样,我们往输出流中也只能写原始的字符;而处理业务逻辑,都是以一个个有业务意义的对象为处理维度的,所以在报文到达 SpringMVC 和从 SpringMVC 出去,都存在一个字符串与 Java 对象的转换问题,处理这部分工作的就是HttpMessageConverter消息转换机制。


    (图片来自网络)

    在 SpringMVC 的设计者眼中,一次请求报文和一次响应报文,分别被抽象为一个请求消息 HttpInputMessage 和一个响应消息 HttpOutputMessage。针对不同的消息形式(Json、XML 等等),有不同的HttpMessageConverter实现类来处理,只要这些消息所蕴含的“有效信息”是一致的,就会生成同样的转换结果。

    2.数据转换

    这部分工作是对请求信息的参数进行类型转换,比如 String 转换成 Integer、Double 等。

    3. 数据格式化

    对请求信息进行格式化,比如字符串转换为格式化数据或者格式化日期。

    4. 数据验证

    验证请求数据的有效性,并将验证结果存储到BindingResultError中。

    整理自:SpringMVC+Mybatis快速开发与项目实战,黄文毅,清华大学出版社
    其他参考:HttpMessageConverter(消息转换器 )和@responsebody使用,21989939,CSDN

  • 相关阅读:
    JVM heap中各generation的大小(Sizing the Generations)
    MySQL中分组取第一条, 以及删除多余的重复记录
    八芯网线水晶头做法(线序)
    Win7命令行下查看无线网络信息
    OpenWrt的开机启动服务(init scripts)
    犀牛书的实例代码:给对象添加freeze, hide, 查询descriptors
    ES6新特性:Javascript中Generator(生成器)
    ES6新特性:Function函数扩展, 扩展到看不懂
    ES6新特性:Javascript中的Map和WeakMap对象
    ES6新特性:Javascript中Set和WeakSet类型的数据结构
  • 原文地址:https://www.cnblogs.com/zzzt20/p/12442573.html
Copyright © 2020-2023  润新知