Spring MVC 是一个典型的基于 MVC 设计模式的框架,它用于开发 Java Web 应用程序。在 Spring MVC 中,每个请求都要经历一系列的步骤,从客户端请求到服务器返回响应。下面的执行流程图很好地描述了 Spring MVC 的执行流程,从请求发起到最后返回数据。接下来,我将全面、深入地讲解 Spring MVC 的执行流程。
Spring MVC 执行流程图:
+---------+ +---------------------+ +------------------+ +-------------------+
| 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 提供了大量内置的拦截器用于跨域、认证、日志等操作,可以根据需求配置这些拦截器来增强系统的功能性和安全性。
