【参考文章】: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 字符串返回。