Spring MVC:HTTP请求的处理流程

【参考文章】:Servlet执行流程及原理解析

【参考文章】:你真的了解Spring MVC处理请求流程吗?

【参考文章】:芋道源码

1. Web请求的处理流程

  -->客户端浏览器将发出的请求被封装成为一个HttpServletRequest对象转交请求给Web服务器

  -->Web服务器收到请求转交请求给Web容器(如 Tomcat)

  -->Web容器调用 Servlet 处理请求

  -->Servlet 处理请求并返回处理结果

  -->Web容器收到 Servlet  处理的结果

  -->Web容器将页面返回给Web服务器

  -->客户端浏览器解析响应HttpServletResponse,然后将结果呈现给用户

2. Spring MVC的工作流程

  Spring  MVC的工作流程就是上述 Servlet 处理请求并返回处理结果 这一步骤;

  调用关系如下图所示:

  

   调用方法的流程如下图所示:

 2.1 发送请求

  用户向服务器发送 HTTP 请求,请求被 Spring MVC 的调度控制器 DispatcherServlet 捕获;

2.2 映射处理器

  DispatcherServlet 根据请求 URL ,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。

2.3 处理器适配

  DispatcherServlet 根据获得的 Handler,选择一个合适的HandlerAdapter 。

  提取请求 Request 中的模型数据,填充 Handler 入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:

  • HttpMessageConverter :会将请求消息(如 JSON、XML 等数据)转换成一个对象。
  • 数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double 等。
  • 数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
  • 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。

2.4 处理请求

  根据 controller的逻辑处理请求,执行完成后,handler向 DispatcherServlet 返回一个 ModelAndView 对象

2.5 视图解析

  根据返回的 ModelAndView ,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver),解析出 View 对象,然后返回给 DispatcherServlet。

2.6 渲染视图 + 响应请求

  ViewResolver 结合 Model 和 View,来渲染视图,并写回给用户( 浏览器 )。

  对于目前主流的架构,前后端已经进行分离了,所以 Spring MVC 只负责 Model 和 Controller 两块,而将 View 移交给了前端。如果 Handler(Controller) 执行完后,如果判断方法有@ResponseBody 注解,则直接将结果写回给用户( 浏览器 )。

  但是 HTTP 是不支持返回 Java POJO 对象的,所以需要将结果使用 HttpMessageConverter 进行转换后才能返回。FastJsonHttpMessageConverter 功能就是将 POJO 转换成 JSON 字符串返回。

  

原文地址:https://www.cnblogs.com/virgosnail/p/10182116.html