第三十六讲-MVC处理请求流程
第三十六讲-MVC处理请求流程
本讲我们来看一下Spring MVC相对完整的处理流程。
当浏览器发送一个请求http:/Toca1host:8080/he11o
后,请求到达服务器,其处理流程是:
-
服务器提供了DispatcherServlet,它使用的是标准Servlet技术
- 路径:默认映射路径为'/',即会匹配到所有请求URL,可作为统一请求的入口,因此DispatcherServlet也被称之为前控制器
- 例外:jsp是不会匹配到DispatcherServlet
- 创建:在Boot中,由DispatcherServletAutoConfiguration这个自动配置类提供DispatcherServlet大的bean
- 初始化:DispatcherServlet初始化时会优先到容器里寻找各种组件,作为它的成员变量
- HandlerMapping,初始化时记录映射关系
- HandlerAdapter,初始化时准备参数解析器、返回值处理器、消息转换器
- HandlerExceptionResolver,初始化时准备参数解析器、返回值处理器、消息转换器
- ViewResolver, 初始化视图解析器
- 路径:默认映射路径为'/',即会匹配到所有请求URL,可作为统一请求的入口,因此DispatcherServlet也被称之为前控制器
-
DispatcherServlet会利用RequestMappingHandlerMapping查找控制器方法
- 例如根据hello路径找到@RequestMapping("hello",)对应的控制器方法
- 控制器方法会被封装为HandlerMethod对象,并结合匹配到的拦截器一起返回给DispatcherServlet
- HandlerMethod和拦截器合在一起称为HandlerExecutionChain(调用链)对象
-
DispatcherServlet接下来会:
- 调用拦截器的preHandler方法,返回true放行该请求,执行后续的调用;返回false表示拦截该请求,不会走后续的调用
- 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增强
- 如果返回的ModelAndView为nul,不走第4步视图解析及渲染流程
- 调用拦截器的postHandler方法
- 处理异常或者视图渲染
- 如果1~3出现异常,走ExceptionHandlerExceptionResolver处理异常流程
- @ControllerAdvice增强5:@ExceptionHandler异常处理
- 正常,走视图解析以及渲染流程
- 如果1~3出现异常,走ExceptionHandlerExceptionResolver处理异常流程
- 调用拦截器的afterCompletion方法
分类:
Spring 高级49讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构