第三十六讲-MVC处理请求流程

第三十六讲-MVC处理请求流程

本讲我们来看一下Spring MVC相对完整的处理流程。

当浏览器发送一个请求http:/Toca1host:8080/he11o后,请求到达服务器,其处理流程是:

  1. 服务器提供了DispatcherServlet,它使用的是标准Servlet技术

    • 路径:默认映射路径为'/',即会匹配到所有请求URL,可作为统一请求的入口,因此DispatcherServlet也被称之为前控制器
      • 例外:jsp是不会匹配到DispatcherServlet
    • 创建:在Boot中,由DispatcherServletAutoConfiguration这个自动配置类提供DispatcherServlet大的bean
    • 初始化:DispatcherServlet初始化时会优先到容器里寻找各种组件,作为它的成员变量
      • HandlerMapping,初始化时记录映射关系
      • HandlerAdapter,初始化时准备参数解析器、返回值处理器、消息转换器
      • HandlerExceptionResolver,初始化时准备参数解析器、返回值处理器、消息转换器
      • ViewResolver, 初始化视图解析器
  2. DispatcherServlet会利用RequestMappingHandlerMapping查找控制器方法

    • 例如根据hello路径找到@RequestMapping("hello",)对应的控制器方法
    • 控制器方法会被封装为HandlerMethod对象,并结合匹配到的拦截器一起返回给DispatcherServlet
    • HandlerMethod和拦截器合在一起称为HandlerExecutionChain(调用链)对象
  3. DispatcherServlet接下来会:

    1. 调用拦截器的preHandler方法,返回true放行该请求,执行后续的调用;返回false表示拦截该请求,不会走后续的调用
    2. RequestMappingHandlerAdapter调用handler方法,准备数据绑定工厂、模型工厂、将HandlerMethod完善为更多信息的ServletInvocableHandlerMethod
      • @ControllerAdvice增强1:补充模型数据
      • @ControllerAdvice增强2:补充自定义类型转换器
      • 使用HandlerMethodArgumentResolver准备参数
      • @ControllerAdvice增强3:RequestBody增强
      • 调用ServletInvocableHandlerMethod
      • 使用HandlerMethodReturnValueHandler处理返回值
        • 如果返回的ModelAndView为nul,不走第4步视图解析及渲染流程
          • 例如,标注了@ResponseBody的控制器方法,调用HttpMessageConverter来将结果转换为JSON,这时返回的ModelAndView就为null
        • 如果返回的ModelAndView不为null,会在第4步走视图解析及渲染流程
        • @ControllerAdvice增强4:ResponseBody增强
    3. 调用拦截器的postHandler方法
    4. 处理异常或者视图渲染
      • 如果1~3出现异常,走ExceptionHandlerExceptionResolver处理异常流程
        • @ControllerAdvice增强5:@ExceptionHandler异常处理
      • 正常,走视图解析以及渲染流程
    5. 调用拦截器的afterCompletion方法
posted @   LilyFlower  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示