SpringMVC执行流程
SpringMVC的执行流程是一个基于前端控制器模式的请求处理机制,核心围绕DispatcherServlet展开,以下是详细步骤和关键组件的说明:
1. 用户发起请求
- 用户通过浏览器或其他客户端发送HTTP请求到服务器(例如:
GET /user/list
)。 - 请求首先被Servlet容器(如Tomcat)接收,并转发给DispatcherServlet(前端控制器)。
2. DispatcherServlet接收请求
- DispatcherServlet是SpringMVC的核心组件,所有请求首先到达这里。
- 它不直接处理业务逻辑,而是作为协调者,调用其他组件完成请求处理。
3. 请求映射(HandlerMapping)
- HandlerMapping(处理器映射器)根据请求的URL、HTTP方法等信息,找到匹配的处理器(Handler)。
- Handler通常是Controller类中的方法(通过
@RequestMapping
或@GetMapping
等注解定义)。 - 示例:
/user/list
可能映射到UserController
的listUsers()
方法。
- Handler通常是Controller类中的方法(通过
- HandlerMapping返回一个
HandlerExecutionChain
对象,包含:- 目标处理器(Handler):具体的Controller方法。
- 拦截器(Interceptor):配置的拦截器链(如登录校验、日志记录)。
4. 拦截器预处理(Interceptor preHandle)
- 执行
HandlerExecutionChain
中所有拦截器的preHandle()
方法。- 如果某个拦截器返回
false
,流程终止并直接返回响应(如未登录用户被拦截)。 - 如果全部拦截器返回
true
,继续后续处理。
- 如果某个拦截器返回
5. 处理器适配与执行(HandlerAdapter)
- HandlerAdapter(处理器适配器)负责调用目标处理器(Controller方法),具体任务包括:
- 参数绑定:将HTTP请求参数转换为方法参数(如
@RequestParam
、@RequestBody
、@PathVariable
)。 - 数据转换/格式化:例如字符串转日期、数字类型。
- 数据验证:通过
@Valid
触发校验(如Hibernate Validator)。 - 执行处理器:调用Controller方法,执行业务逻辑(如查询数据库)。
- 参数绑定:将HTTP请求参数转换为方法参数(如
6. 处理器返回结果
- 传统MVC场景:
- Controller方法返回
ModelAndView
对象,包含:- Model:模型数据(如用户列表)。
- View:视图名称(如
userList
)。
- Controller方法返回
- 前后端分离场景:
- Controller方法直接返回数据对象(如Java对象),配合
@ResponseBody
或@RestController
。 - HttpMessageConverter(如
MappingJackson2HttpMessageConverter
)将对象序列化为JSON/XML,直接写入响应。
- Controller方法直接返回数据对象(如Java对象),配合
7. 视图解析(ViewResolver)
- 传统MVC场景:
- ViewResolver(视图解析器)根据
ModelAndView
中的视图名称(如userList
),解析出具体的View
对象(如JSP、Thymeleaf模板)。 - 视图渲染:
View
对象将模型数据填充到模板中,生成HTML响应内容。
- ViewResolver(视图解析器)根据
- 前后端分离场景:
- 跳过视图解析步骤,直接返回JSON/XML数据。
8. 拦截器后处理(Interceptor postHandle)
- 执行拦截器的
postHandle()
方法(仅对传统MVC有效)。- 可以修改
ModelAndView
对象(如添加公共数据)。 - 不影响前后端分离场景。
- 可以修改
9. 最终响应与资源清理
- 响应返回:
- 渲染后的HTML内容或JSON/XML数据通过
DispatcherServlet
返回给客户端。
- 渲染后的HTML内容或JSON/XML数据通过
- 拦截器收尾:
- 无论请求成功或异常,执行拦截器的
afterCompletion()
方法,进行资源清理(如关闭数据库连接)。
- 无论请求成功或异常,执行拦截器的
10. 异常处理
- 异常解析器(HandlerExceptionResolver):
- 如果在流程中发生异常,
HandlerExceptionResolver
会捕获并处理异常。 - 根据异常类型返回相应的错误页面或JSON响应(如
@ExceptionHandler
或@ControllerAdvice
)。
- 如果在流程中发生异常,
关键组件总结
组件 | 作用 |
---|---|
DispatcherServlet | 前端控制器,协调整个流程。 |
HandlerMapping | 根据URL映射到对应的Controller方法。 |
HandlerAdapter | 适配不同类型的Handler,执行Controller方法并处理参数/返回值。 |
ModelAndView | 传统MVC中包含模型数据和视图名称的对象。 |
ViewResolver | 解析视图名称,找到具体的视图实现(如JSP、Thymeleaf)。 |
Interceptor | 拦截请求,执行预处理、后处理和资源清理(如登录校验、日志记录)。 |
HttpMessageConverter | 前后端分离场景中,将Java对象序列化为JSON/XML并写入响应。 |
示例流程(传统MVC)
假设用户访问/user/list
:
- DispatcherServlet接收请求。
- HandlerMapping找到
UserController
的listUsers()
方法。 - HandlerAdapter调用
listUsers()
,执行业务逻辑,返回包含用户列表和视图名userList
的ModelAndView
。 - ViewResolver解析
userList
,找到对应的JSP页面。 - 视图渲染:将用户列表填充到JSP中,生成HTML响应。
- 响应返回:浏览器显示用户列表。
前后端分离差异
- 直接返回JSON:Controller方法返回数据对象,
HttpMessageConverter
序列化为JSON。 - 跳过视图解析:无需
ViewResolver
和视图渲染步骤。 - 典型注解:
@RestController
或@ResponseBody
。
总结
SpringMVC的执行流程通过分层设计和组件解耦实现了高度灵活性和可扩展性:
- 前端控制器模式统一管理请求分发。
- 拦截器支持通用逻辑的复用(如权限校验)。
- 适配器模式兼容不同类型的Controller。
- 前后端分离与传统MVC无缝切换,适应现代开发需求。