当前位置: 首页 > article >正文

SpringMVC处理请求流程

SpringMVC启动和处理请求流程

请求处理流程

下面是一个常见的SpringMVC处理请求的流程
在这里插入图片描述

这个流程总结如下:

  1. 用户在浏览器或其他客户端发起HTTP请求,该请求被发送到服务器;
  2. 前端控制器DispatcherServlet接收请求:SpringMVC的前端控制器,负责接收所有用户请求,并作为中央处理器进行转发和调度。DispatcherServlet类似于电脑的CPU,在SpringMVC框架中扮演着至关重要的角色;
  3. 查找处理器:根据请求的URL,DispatcherServlet会调用处理器映射器(HandlerMapping)来查找对应的处理器(Controller)。处理器映射器有多种实现方式,如基于XML配置、注解等;
  4. 返回执行链:处理器映射器找到对应的处理器后,会返回一个处理器执行链(HandlerExecutionChain)给DispatcherServlet。执行链中可能包含处理器以及相关的拦截器;
  5. DispatcherServlet通过处理器适配器(HandlerAdapter)来调用处理器。处理器适配器是一种适配器模式的应用,它使得DispatcherServlet能够支持多种类型的处理器;
  6. 处理器适配器调用处理器执行相应的业务逻辑,并返回一个ModelAndView对象。ModelAndView对象包含了模型数据和视图信息;
  7. ViewResolver:DispatcherServlet根据ModelAndView对象中的视图信息,选择合适的视图解析器(ViewResolver)来解析视图。视图解析器将视图名称解析为具体的视图对象;
  8. 视图解析器将视图名称解析为视图对象后,DispatcherServlet会将模型数据传递给视图对象进行渲染;
  9. 视图渲染:视图对象根据模型数据进行渲染,生成最终的HTML页面或其他格式的响应内容;
  10. 响应结果:渲染后的结果由DispatcherServlet返回给用户;

从上面的流程中可以看出核心对象是DispatcherServlet,下面我们根据上面的流程图来分析源码,不过需要先知道一些前置知识。

前置知识

Handler

Handler表示请求处理器,在SpringMVC中有四种Handler:

  1. 实现了Controller接口的Bean对象;
  2. 实现了HttpRequestHandler接口的Bean对象;
  3. 添加了@RequestMapping注解的方法;
  4. 一个HandlerFunction对象;
HandlerMapping

HandlerMapping负责寻找Handler,并保存路径和Handler之间的映射关系。由于存在不同类型的Handler,所以会有对应的HandlerMapping,由对应的HandlerMapping去寻找对应的Handler。

  1. BeanNameUrlHandlerMapping:负责Controller接口和HttpRequestHandler接口;
  2. RequestMappingHandlerMapping:负责@RequestMapping的方法;
  3. RouterFunctionMapping:负责RouterFunction以及其中的HandlerFunction;

源码分析

请求处理流程核

处理请求的核心方法为DispatcherServlet中的doDispatch()方法
在这里插入图片描述
获取Handler
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

找到Handler后,把Handler和HandlerInterceptor组成HandlerExecutionChain返回
在这里插入图片描述
在这里插入图片描述

根据HandlerMapping找到了handler,返回Handler
在这里插入图片描述

使用HandlerAdapter调用对应的Handler在这里插入图片描述
使用HandlerAdapter调用Handler的方法处理请求,这里使用了适配器模式,如果不使用适配器模式,就需要else if判断找到的Handler的类型,然后通过反射调用执行对应的方法。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

返回对应的视图
在这里插入图片描述
在这里插入图片描述

请求参数映射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

通过参数解析器获取请求对应的参数并映射到方法的参数中。
在这里插入图片描述


http://www.kler.cn/a/387045.html

相关文章:

  • Dockerfile的使用
  • StructuredStreaming (一)
  • vue请求数据报错,设置支持跨域请求,以及2种请求方法axios或者async与await
  • Python →爬虫实践
  • unity基础,点乘叉乘。
  • Elasticsearch可视化工具Elasticvue插件用法
  • Nginx实现负载服务之间的负载均衡
  • 基于 JavaWeb 的宠物商城系统(附源码,文档)
  • 鸿蒙开发案例:七巧板
  • 排序算法简介
  • 数据库的使用05:不规范的写法与操作记录
  • VR的左右眼渲染方法
  • 如何使用 Python 语言的正则表达式进行网页数据的爬取?
  • OpenCV进阶
  • .Net Core 6.0 WebApi在Centos中部署
  • bug日常记录responded with a status of 413 (Request Entity Too Large)
  • 【redis】延迟双删策略
  • k8s笔记——核心概念
  • Axure PR 9 多级下拉选择器 设计交互
  • qt QTextFrame详解
  • 高级java每日一道面试题-2024年10月28日-RabbitMQ篇-RabbitMQ的使用场景有哪些?
  • react-copy-to-clipboard: 一个简单的 React 用于复制文本到剪贴板的组件
  • 深度学习基础—了解词嵌入
  • 《Elasticsearch 实战应用》
  • 【数据仓库】Hive 拉链表实践
  • 汽车共享行业:SpringBoot管理系统革命