Spring MVC 中 DispatcherServlet
处理请求的完整流程
DispatcherServlet
是 Spring MVC 的核心调度器,负责接收 HTTP 请求并协调其他组件完成请求处理。以下是其完整处理流程:
1. 请求到达 DispatcherServlet
- 用户发起 HTTP 请求(如浏览器访问 URL)。
- 请求首先由 Servlet 容器(如 Tomcat)接收,然后交给
DispatcherServlet
处理(因为DispatcherServlet
是前端控制器,配置在web.xml
或通过注解注册)。
2. 初始化阶段(首次请求时)
- 加载配置:
DispatcherServlet
初始化时,会加载 Spring MVC 的配置(如DispatcherServlet.properties
或自定义配置类),并初始化以下关键组件:HandlerMapping
:用于映射请求 URL 到处理器(Controller)。HandlerAdapter
:适配不同类型的处理器(如@Controller
方法)。ViewResolver
:解析视图名称为具体视图对象(如 JSP、Thymeleaf 模板)。- 其他组件(如
HandlerExceptionResolver
、LocaleResolver
等)。
3. 请求处理阶段
(1) 获取 Handler
(处理器)
DispatcherServlet
调用HandlerMapping
根据请求 URL 查找对应的处理器(通常是@Controller
类中的方法)。- 如果找不到处理器,抛出
404
错误。
(2) 选择 HandlerAdapter
- 根据处理器类型(如
@Controller
方法、HttpRequestHandler
等),从HandlerAdapter
列表中选择合适的适配器。 - 适配器的作用是统一调用处理器的逻辑(隐藏不同处理器类型的差异)。
(3) 执行处理器(Controller 方法)
HandlerAdapter
调用目标处理器方法(如@RequestMapping
注解的方法),并返回一个ModelAndView
对象(包含模型数据和视图名称)。- 处理过程中可能涉及:
- 参数绑定(如
@RequestParam
、@RequestBody
)。 - 数据校验(
@Valid
)。 - 事务管理(
@Transactional
)。
- 参数绑定(如
(4) 处理异常(如果有)
- 如果处理器抛出异常,
DispatcherServlet
会调用HandlerExceptionResolver
进行异常处理(如返回错误页面或 JSON 响应)。
4. 视图渲染阶段
(1) 解析视图
DispatcherServlet
调用ViewResolver
根据ModelAndView
中的视图名称解析出具体的视图对象(如InternalResourceView
对应 JSP)。
(2) 渲染视图
- 视图对象调用
render()
方法,将模型数据填充到视图模板中(如 JSP 渲染为 HTML)。 - 最终生成 HTTP 响应内容(如 HTML 页面、JSON 数据等)。
5. 返回响应
DispatcherServlet
将渲染后的响应返回给 Servlet 容器。- Servlet 容器将响应发送回客户端(浏览器或其他 HTTP 客户端)。
完整流程图示
关键组件说明
组件 | 作用 |
---|---|
HandlerMapping | 将请求 URL 映射到处理器(如 RequestMappingHandlerMapping )。 |
HandlerAdapter | 适配不同类型的处理器(如 RequestMappingHandlerAdapter )。 |
ViewResolver | 将视图名称解析为具体视图对象(如 InternalResourceViewResolver )。 |
ModelAndView | 封装模型数据和视图名称,供视图渲染使用。 |
HandlerExceptionResolver | 处理处理器抛出的异常(如返回错误页面)。 |
总结
DispatcherServlet
的核心流程是:
接收请求 → 查找处理器 → 执行处理器 → 渲染视图 → 返回响应。
其设计遵循 前端控制器模式,通过解耦请求处理、视图渲染等逻辑,实现灵活的 Web 开发。