✅ 一、SpringMVC 请求到响应完整流程概览
📌 问题总述:
SpringMVC 的处理流程是怎样的?一个 HTTP 请求进来后,SpringMVC 是如何一步步处理的?
🧭 二、整体流程图(文字版)
-
浏览器发送请求给服务器(DispatcherServlet)
-
DispatcherServlet 接收到请求
-
根据请求路径,调用
HandlerMapping
匹配对应的Handler
(控制器方法) -
通过
HandlerAdapter
调用对应的控制器方法(Controller) -
Controller 处理完返回
ModelAndView
或ResponseBody
-
返回值交由
ViewResolver
视图解析器处理(页面渲染 or JSON 转换) -
最终由 DispatcherServlet 返回响应给客户端
🔬 三、详细流程+源码细节(标准面试答题顺序)
步骤 | 模块 | 说明 | 源码位置 |
---|---|---|---|
1 | DispatcherServlet | 核心前端控制器,是整个流程的入口 | doDispatch() 方法 |
2 | HandlerMapping | 找到匹配请求路径的 Handler(Controller 方法) | 实现类如 RequestMappingHandlerMapping |
3 | HandlerAdapter | 执行目标 Handler(控制器)的方法 | 如 RequestMappingHandlerAdapter |
4 | Controller | 用户自定义的控制器 | 带 @Controller 注解 |
5 | ModelAndView | Controller 返回值类型之一 | 包含数据 + 视图名称 |
6 | ViewResolver | 把视图名称解析为真正的视图对象 | 如 InternalResourceViewResolver |
7 | 视图渲染 | JSP 或 Thymeleaf 渲染,或返回 JSON 数据 | render() |
8 | DispatcherServlet | 返回响应给客户端 | — |
🧪 四、带注解示例代码辅助记忆
@Controller
public class UserController {
@GetMapping("/user")
@ResponseBody
public User getUser() {
return new User("Tom", 20);
}
}
-
@Controller
:注册为 Spring 管理的处理器 Bean -
@GetMapping("/user")
:绑定路径与方法 -
@ResponseBody
:说明返回的不是视图,而是 JSON 数据,最终由HttpMessageConverter
转换
📋 五、面试答题模板(口语化结构)
SpringMVC 中所有请求的入口是
DispatcherServlet
,它是一个前端控制器。它会根据请求 URL 通过HandlerMapping
找到对应的 Controller 方法,然后通过HandlerAdapter
调用该方法,方法返回的结果会被ViewResolver
解析为页面或 JSON,最终返回给客户端。整个流程高度解耦,扩展性强,核心就在于一套 DispatcherServlet 驱动的责任链调用机制。
🔍 六、常见延伸面试点
面试题 | 解法或建议 |
---|---|
DispatcherServlet 是如何注册的? | Spring Boot 自动注册,配置在 web.xml 或由 @SpringBootApplication 自动加载 |
JSON 是怎么返回的? | @ResponseBody + HttpMessageConverter |
自定义参数解析器? | 实现 HandlerMethodArgumentResolver |
异常是如何处理的? | @ControllerAdvice + @ExceptionHandler |
拦截器执行顺序? | preHandle → controller → postHandle → afterCompletion |
🧩 七、拓展:哪些是常见组件?
类型 | 示例类 |
---|---|
HandlerMapping | RequestMappingHandlerMapping |
HandlerAdapter | RequestMappingHandlerAdapter |
ViewResolver | InternalResourceViewResolver , ThymeleafViewResolver |
MessageConverter | MappingJackson2HttpMessageConverter |
异常处理器 | ExceptionHandlerExceptionResolver |
拦截器链 | HandlerInterceptor 实现类 |
🎯 八、总结记忆口诀(便于背诵)
前端控制找控制器,
映射适配找执行器;
返回视图或数据包,
消息转换再返回。