Spring MVC 是一个典型的基于 MVC 设计模式的框架,它用于开发 Java Web 应用程序。在 Spring MVC 中,每个请求都要经历一系列的步骤,从客户端请求到服务器返回响应。下面的执行流程图很好地描述了 Spring MVC 的执行流程,从请求发起到最后返回数据。接下来,我将全面、深入地讲解 Spring MVC 的执行流程。
Spring MVC 执行流程图:
plaintext
+---------+ +---------------------+ +------------------+ +-------------------+
| Client | ----> | DispatcherServlet | -----> | HandlerMapping | ----> | HandlerAdapter |
+---------+ +---------------------+ +------------------+ +-------------------+
| |
v v
+--------------------+ +-----------------+
| HandlerInterceptor | | Controller |
+--------------------+ +-----------------+
| |
v |
+--------------------+ v
| ViewResolver | <------------------ ModelAndView
+--------------------+
|
v
+-----------+
| View |
+-----------+
这个流程图展示了 Spring MVC 执行过程中的主要组件和步骤,帮助开发者理解每个请求是如何处理的。
1. Spring MVC 执行流程概述
Spring MVC 执行流程可以分为以下几个步骤:
- 发送请求(用户请求进入系统)
- 前端控制器 (
DispatcherServlet
)接收请求并转发 - 处理器映射器 (Handler Mapping)找到对应的处理器(
Controller
) - 拦截器(Handler Interceptor)在调用处理器之前进行拦截
- 处理器适配器 (Handler Adapter)执行具体的
Controller
方法 - Controller 业务代码 完成处理并返回
ModelAndView
- 拦截器 对处理器执行后进行拦截处理
- 视图解析器 将
ModelAndView
转换成具体的View
- 前端控制器 将生成的
View
发送到客户端
2. Spring MVC 流程分解
我们将每个步骤进行更详细的分解:
2.1 前端控制器(DispatcherServlet
)
前端控制器是 Spring MVC 的核心组件,所有的请求都会被 DispatcherServlet
捕获。它是整个流程的入口,负责调度和转发请求到具体的处理器(Controller
)。它的主要职责包括:
- 接收请求
- 根据
HandlerMapping
寻找合适的处理器 - 使用
HandlerAdapter
调用处理器 - 将结果委派给
ViewResolver
渲染视图
2.2 处理器映射器(HandlerMapping
)
HandlerMapping
负责根据请求的 URL 或者其他映射规则(例如注解)找到对应的 Controller
。常见的映射方式包括:
- 基于注解的映射(
@RequestMapping
) - 基于 XML 的映射
2.3 拦截器(HandlerInterceptor
)
在找到具体的处理器之前,Spring MVC 可以配置拦截器对请求进行预处理。拦截器类似于 AOP,可以在请求前后进行操作。拦截器主要有以下三个方法:
preHandle()
:在处理器执行之前进行拦截postHandle()
:在处理器执行之后但在视图渲染之前进行拦截afterCompletion()
:在请求处理完成后(包括视图渲染之后)进行拦截
2.4 处理器适配器(HandlerAdapter
)
处理器适配器是用来执行 Controller
具体方法的组件。Spring MVC 中支持多种类型的处理器(例如普通的 Controller
或 RestController
)。HandlerAdapter
负责调用对应的处理方法,并返回 ModelAndView
。
2.5 Controller 业务代码
Controller
是处理业务逻辑的地方。开发人员可以在 Controller
中定义方法来处理具体的请求,并返回数据。常见的返回类型有:
ModelAndView
:返回视图名和数据模型String
:直接返回视图名ResponseEntity
:返回 HTTP 响应实体(通常用于 RESTful 风格)
2.6 视图解析器(ViewResolver
)
ViewResolver
的职责是根据 ModelAndView
中的视图名找到实际的视图资源。常见的视图技术包括:
- JSP
- Thymeleaf
- FreeMarker
- Velocity
视图解析器会根据配置的前缀和后缀来寻找视图文件,然后渲染最终的页面。
2.7 前端控制器返回响应
当视图被渲染完成后,DispatcherServlet
将视图发送给客户端,完成整个请求处理的流程。
3. 综合案例分析
假设一个用户在浏览器中访问了一个 URL,如 /user/list
,这个请求的处理流程如下:
- 用户在浏览器中发起请求
/user/list
。 DispatcherServlet
捕获请求,并根据配置的HandlerMapping
,找到对应的UserController
。HandlerInterceptor
拦截请求,并调用preHandle()
进行预处理。DispatcherServlet
调用HandlerAdapter
执行UserController.list()
方法。UserController.list()
方法查询数据库,并返回包含用户列表的ModelAndView
。HandlerInterceptor
调用postHandle()
方法对返回的结果进行处理。ViewResolver
根据视图名解析 JSP 页面并渲染用户列表。DispatcherServlet
将生成的 HTML 页面返回给浏览器,用户在页面上看到用户列表。
4. 总结与补充
总结:
- 前端控制器 (
DispatcherServlet
)是整个流程的核心调度者,负责接收请求、转发请求、返回结果。 - 处理器映射器 (
HandlerMapping
)根据 URL 映射规则找到Controller
。 - 拦截器 (
HandlerInterceptor
)提供了请求前后的处理机会。 - 处理器适配器 (
HandlerAdapter
)用于调用Controller
的方法。 - 视图解析器 (
ViewResolver
)负责解析ModelAndView
,将其转换为 HTML 或其他格式。 - Controller 负责业务逻辑的处理,并返回结果。
开发补充:
- 在复杂的系统中,Spring MVC 提供了强大的扩展能力。我们可以通过自定义
HandlerMapping
、HandlerInterceptor
、HandlerAdapter
、ViewResolver
等组件来实现特殊的业务需求。 - 在 RESTful 开发中,
@RestController
注解简化了返回 JSON 数据的流程,结合ResponseEntity
可以更好地处理状态码和响应体。 - Spring 提供了大量内置的拦截器用于跨域、认证、日志等操作,可以根据需求配置这些拦截器来增强系统的功能性和安全性。