SpringMVC的执行流程

执行流程图

相关术语介绍

DispatcherServlet

DispatcherServlet 是一个重要的前端控制器(Front Controller),用于接收所有的客户端请求并将其分发给相应的处理器(Handler)。DispatcherServlet 是整个 Spring MVC 框架的核心,负责协调整个请求处理流程。

Handler

Handler 即处理器,它是处理请求的核心组件,通常由 Controller 实现类来充当。处理器可以调用 Service 层、Mapper层等其他组件来获取数据和执行业务逻辑,最终返回一个 ModelAndView 对象。

HandlerMapping

HandlerMapping 用于映射请求 URL 到对应的处理器(Handler)。在 SpringMVC 中,常用的 HandlerMapping 实现包括 BeanNameUrlHandlerMapping、RequestMappingHandlerMapping 等。

HandlerAdapter

HandlerAdapter 用于执行处理器(Handler),它将处理器的执行与前后端的交互分离开来。在 SpringMVC 中,常用的 HandlerAdapter 实现包括 RequestMappingHandlerAdapter、SimpleControllerHandlerAdapter 等。

ModelAndView

ModelAndView 是处理器返回的结果对象,它包含了视图名和需要在视图中渲染的模型数据。

ViewResolver

ViewResolver 用于使用模型数据将视图名解析为对应的视图对象(View)。在 SpringMVC 中,常用的 ViewResolver 实现包括 InternalResourceViewResolver(用于解析 JSP 视图)、FreeMarkerViewResolver(用于解析 FreeMarker 模板)等。

View

View 即视图,它用于渲染模型数据,最终生成响应内容。在 SpringMVC 中,常用的 View 实现包括 JstlView(用于渲染 JSP 视图)、FreeMarkerView(用于渲染 FreeMarker 模板)等。

文字描述

1.当用户通过浏览器发送请求时,这个请求会被Web服务器(如Tomacat)接收,并交给DispatcherServlet处理。

2.DispatcherServlet 会将请求 URL 传递给 HandlerMapping 映射器进行处理,并根据请求 URL 匹配对应的 HandlerExecutionChain 处理器执行链。HandlerExecutionChain 包含了一个或多个 Interceptor 拦截器和一个 Handler 处理器,拦截器可以在请求处理前后进行一些额外的处理,而 Handler 则负责具体的业务处理。

3.将HandlerExecutionChain返回给DispatcherServlet,DispatcherServlet会根据HandlerExecutionChain中拦截器的返回情况来判断是否要进行下一步,如果拦截器返回为false,DispatcherServlet就直接返回相应的错误信息给客户端,如果为true,表示拦截器校验通过,DispatcherServlet进行下一步转发

4.DispatcherServlet请求HandlerAdapter执行Handler,因为在 HandlerMappeing 确定了需要执行的 Handler 之后,HandlerAdapter 就负责根据具体的 Handler 类型,调用相应的方法进行处理。不同的 Handler 处理器类型通常需要不同的处理方式,因此需要不同的 HandlerAdapter 适配器实现来进行适配。

5.在 HandlerAdapter 执行完 Handler 之后,会返回DispatcherServlet一个ModelAndView对象,其中包含了处理结果的数据以及要跳转的视图名称。

6.DispatcherServlet将ModelAndView对象传递给ViewResolver进行解析。

7.ViewResolver将ModelAndView 对象解析为对应的 View 视图对象,返回给DispatcherServlet

8.DispatcherServlet将View对象渲染之后,返回给客户端。

相关推荐
mldong4 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾14 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生5 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
zhanghe6875 小时前
es的密码带有特殊字符,导出
java
平头哥技术团队5 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
pnoker5 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++5 小时前
【洛谷】kmp算法
开发语言·算法
my_realmy5 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
传奇开心果编程5 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_380743876 小时前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php