Spring MVC 请求处理流程的大致可分为以下几个步骤:
1. 请求到达 DispatcherServlet:
- 所有请求首先到达
DispatcherServlet
(前端控制器)。DispatcherServlet
是 Spring MVC 的核心,它负责接收请求,并将请求委派给其他组件进行处理。 DispatcherServlet
通常在web.xml
中配置(或使用 Servlet 3.0+ 的 Java 配置),并映射到特定的 URL 模式(例如/
或*.do
)。
2. 查找 HandlerMapping:
DispatcherServlet
使用HandlerMapping
来确定哪个控制器(Controller)应该处理当前请求。HandlerMapping
根据请求的 URL、HTTP 方法、请求头等信息,查找匹配的HandlerExecutionChain
。HandlerExecutionChain
包含了一个处理器(Handler,通常是一个 Controller 方法)和一组拦截器(HandlerInterceptor)。
- Spring MVC 提供了多种
HandlerMapping
实现:BeanNameUrlHandlerMapping
:根据 Bean 的名称与 URL 进行映射。RequestMappingHandlerMapping
:根据@RequestMapping
注解进行映射(最常用)。SimpleUrlHandlerMapping
:通过配置文件进行 URL 映射。
3. 执行 HandlerAdapter:
- 找到
HandlerExecutionChain
后,DispatcherServlet
使用HandlerAdapter
来执行处理器(Handler)。 HandlerAdapter
负责调用 Controller 方法,并处理方法参数、返回值等。- Spring MVC 提供了多种
HandlerAdapter
实现:HttpRequestHandlerAdapter
:处理HttpRequestHandler
类型的处理器。SimpleControllerHandlerAdapter
:处理Controller
接口类型的处理器。RequestMappingHandlerAdapter
:处理带有@RequestMapping
注解的方法(最常用)。
HandlerAdapter
的执行过程包括:- 执行拦截器的
preHandle()
方法: 在调用 Controller 方法之前,执行所有拦截器的preHandle()
方法。如果任何一个preHandle()
方法返回false
,则请求处理流程终止。 - 解析方法参数: 根据方法参数上的注解(如
@RequestParam
、@PathVariable
、@RequestBody
等),从请求中获取参数值,并进行类型转换。 - 调用 Controller 方法: 使用反射调用 Controller 方法,并将解析后的参数值传入。
- 处理返回值: 根据方法返回值的类型和注解(如
@ResponseBody
、@ModelAndView
等),将返回值转换为合适的响应格式(如 JSON、HTML、XML 等)。 - 执行拦截器的
postHandle()
方法: 在 Controller 方法执行完成后,但在视图渲染之前,执行所有拦截器的postHandle()
方法。 - **执行拦截器的
afterCompletion()
方法: ** 在整个请求完成后 (视图渲染后) 执行.
- 执行拦截器的
4. 返回 ModelAndView 或直接响应:
- Controller 方法可以返回一个
ModelAndView
对象,其中包含了模型数据(Model)和视图名称(View Name)。 - Controller 方法也可以直接通过
@ResponseBody
注解返回数据(如 JSON),或者通过HttpServletResponse
对象直接写入响应内容。
5. 视图解析 (View Resolution):
- 如果 Controller 方法返回的是
ModelAndView
,DispatcherServlet
会使用ViewResolver
将视图名称解析成一个View
对象。 ViewResolver
根据视图名称和配置的视图解析规则,查找对应的视图模板文件(如 JSP、Thymeleaf、FreeMarker 等)。- Spring MVC 提供了多种
ViewResolver
实现:InternalResourceViewResolver
:用于解析 JSP 视图。FreeMarkerViewResolver
:用于解析 FreeMarker 视图。ThymeleafViewResolver
:用于解析 Thymeleaf 视图。
6. 视图渲染 (View Rendering):
DispatcherServlet
调用View
对象的render()
方法,将模型数据渲染到视图模板中,生成最终的 HTML 响应。View
对象会使用相应的模板引擎(如 JSP 引擎、Thymeleaf 引擎等)来渲染视图。
7. 返回响应:
DispatcherServlet
将生成的 HTML 响应返回给客户端。
核心组件总结:
DispatcherServlet
: 前端控制器,负责接收请求,并将请求委派给其他组件。HandlerMapping
: 处理器映射器,负责根据请求查找对应的处理器(Handler)。HandlerAdapter
: 处理器适配器,负责执行处理器(Handler),并处理方法参数、返回值等。HandlerInterceptor
: 拦截器,可以在请求处理前后执行自定义逻辑。Controller
: 控制器,负责处理请求,并返回模型数据和视图名称。ModelAndView
: 模型和视图对象,包含了模型数据和视图名称。ViewResolver
: 视图解析器,负责将视图名称解析成View
对象。View
: 视图对象,负责将模型数据渲染到视图模板中。
流程图示:
Client --(Request)--> DispatcherServlet --(HandlerMapping)--> HandlerExecutionChain
|
--(HandlerAdapter)--> Controller --(ModelAndView)--> ViewResolver --(View)--> DispatcherServlet --(Response)--> Client
| ^
|-----------------------------------------------------------------------|
HandlerInterceptor
总结:
Spring MVC 的请求处理流程是一个高度可定制和可扩展的流程。理解这个流程的各个步骤和核心组件,有助于我们更好地使用 Spring MVC 开发 Web 应用程序,并解决可能出现的问题。