Spring MVC 请求流程


  • Spring MVC 框架是基于 Servlet 技术的。以请求为驱动,围绕 Servlet 设计的。Spring MVC 处理用户请求与访问一个 Servlet 是类似的,请求发送给 Servlet,执行 doService 方法,最后响应结果给浏览器完成一次请求处理。

一、DispatcherServlet 是一个 Servlet

  • DispatcherServlet 是核心对象,称为中央调度器(前端控制器 Front Controller)。负责接收所有对 Controller 的请求,调用开发者的 Controller 处理业务逻辑,将 Controller 方法的返回值经过视图处理后响应给浏览器。
  • DispacherServlet 作为 Spring MVC 中的 Controller 的职责:
    • ① 是一个门面,接收请求,控制请求的处理过程。所有请求都必须由 DispatcherServlet 控制。Spring MVC 对外的入口。可以看作门面设计模式。
    • ② 访问其他的控制器。这些控制器处理业务逻辑。
    • ③ 创建合适的视图,将 ② 中得到的业务结果放到视图,响应给用户。
    • ④ 解耦了其他组件,所有组件只与 DispatcherServlet 交互。彼此之间没有关系。
    • ⑤ 实现 ApplicationContextAware,每个 DispatcherServlet 都拥有自己的 WebApplicationContext,它继承了 ApplicationContext。WebApplicationContext 包含了 Web 相关的 Bean 对象,比如开发人员用注释 @Controller 的类,视图解析器,视图对象等等。DispatcherServlet 访问容器中的 Bean 对象。
    • ⑥ Servlet + Spring IOC 组合。
  • DispatcherServlet 的继承关系图:
    在这里插入图片描述

二、Spring MVC 的完整请求流程

在这里插入图片描述

  • ① 红色 DispatcherServlet 是框架创建的核心对象(可配置它的属性 contextPath)。
  • ② 蓝色的部分框架已经提供多个对象。开发人员可自定义,替换默认的对象。
  • ③ 绿色的部分是开发人员自己创建的对象,控制器 Controller 和视图对象。
  • 流程说明:
    • (1)DispatcherServlet 接收从客户端发送的请求。判断是普通请求还是上传文件的请求。
    • (2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
    • (3 HandlerMapping 根据请求 URI 找到对应的控制器以及拦截器,组装成 HandlerExecutionChain 对象。将此对象返回给 DispatcherServlet 做下一步处理。
    • (4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。这里是适配器设计模式,进行接口转换,将对一个接口调用转换为其他的方法。
    • (5)HandlerAdapter 根据执行控制器方法,也就是开发人员写的 Controller 类中的方法,并返回一个 ModelAndView 对象。
    • (6)HandlerAdapter 返回 ModelAndView 给DispatcherServlet。
    • (7)DispatcherServlet 调用 HandlerExceptionResolver 处理异常,有异常返回包含异常的 ModelAndView。
    • (8)DispatcherServlet 调用 ViewResolver 视图解析器来解析 ModelAndView。
    • (9)ViewResolver 解析 ModelAndView 并返回真正的 View 给 DispatcherServlet。
    • (10)DispatcherServlet 将得到的视图进行渲染,将 Model 中的数据填充到 request 域。
    • (11)返回给客户端响应结果。

相关推荐

  1. 简单分析SpringMVC的处理请求流程

    2024-01-28 06:36:03       42 阅读
  2. SpringMVC启动与请求处理流程解析

    2024-01-28 06:36:03       44 阅读
  3. SpringMVC-请求

    2024-01-28 06:36:03       54 阅读
  4. SpringMVC映射请求数据

    2024-01-28 06:36:03       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-28 06:36:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-28 06:36:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-28 06:36:03       82 阅读
  4. Python语言-面向对象

    2024-01-28 06:36:03       91 阅读

热门阅读

  1. 【HDFS】一天一个RPC系列--updateBlockForPipeline

    2024-01-28 06:36:03       56 阅读
  2. ClickHouse(22)ClickHouse集成HDFS表引擎详细解析

    2024-01-28 06:36:03       42 阅读
  3. golang实现一个简单的HTTP server

    2024-01-28 06:36:03       57 阅读
  4. 单元测试——题目十三

    2024-01-28 06:36:03       58 阅读
  5. 系统架构17 - 软件工程(5)

    2024-01-28 06:36:03       46 阅读
  6. vue项目中路由懒加载的三种方式

    2024-01-28 06:36:03       54 阅读