Spring MVC核心组件与双模式执行流程详解
·
Spring MVC 核心组件与执行流程详解(含前后端分离 & 传统渲染双模式)
关键词:SpringMVC|DispatcherServlet|HandlerMapping|JSP|JSON API|Java后端
适用读者:Java 初学者、校招/社招求职者、需要复习 Web 原理的开发者
一、为什么还要学 Spring MVC?
尽管 Spring Boot 已成主流,但 Spring MVC 仍是 Java Web 开发的基石。还是有必要了解一下的,毕竟面试会问🐕
本文将带你一次性掌握:
- ✅ Spring MVC 五大核心组件作用
- ✅ 两种典型架构下的完整执行流程:
- 🟢 传统模式:服务端渲染(JSP / Thymeleaf)
- 🔵 现代模式:前后端分离(返回 JSON)
- ✅ 面试如何清晰、有条理地讲清楚原理
二、Spring MVC 五大核心组件
| 组件 | 作用 | 关键说明 |
|---|---|---|
DispatcherServlet |
中央调度器,接收所有请求并协调其他组件 | Web.xml 或 Spring Boot 自动配置注册 |
HandlerMapping |
根据 URL 查找对应的 Controller(Handler) |
支持注解(@RequestMapping)或 XML 配置 |
HandlerAdapter |
调用具体的 Controller 方法 | 适配不同类型的 Handler(如注解式、简单控制器) |
Handler(Controller) |
开发者编写的业务逻辑处理器 | 用 @Controller 或 @RestController 标记 |
ViewResolver |
解析视图名称,生成最终视图(如 JSP 页面) | 仅在服务端渲染时使用 |
💡 注意:前后端分离架构中,
ViewResolver不参与流程,取而代之的是HttpMessageConverter。
三、执行流程对比:两种模式有何不同?
🟢 模式一:传统前后端不分离(服务端渲染)
适用于 JSP、Thymeleaf、FreeMarker 等模板引擎。
1. 用户访问 http://xxx/user/list
2. DispatcherServlet 接收请求
3. HandlerMapping 找到 UserController.list()
4. HandlerAdapter 调用该方法,返回 "user/list"(视图名)
5. ViewResolver 将 "user/list" 解析为 /WEB-INF/views/user/list.jsp
6. JSP 渲染 HTML,写入响应
7. 浏览器直接显示完整页面
✅ 特点:
- 后端负责生成完整 HTML
@Controller+ 返回字符串(视图名)
🔵 模式二:前后端分离(现代主流)
前端(Vue/React)通过 AJAX 请求接口,后端只返回 JSON 数据。
1. 前端发起 GET /api/users
2. DispatcherServlet 接收请求
3. HandlerMapping 找到 UserController.getUsers()
4. HandlerAdapter 调用方法,返回 UserList 对象
5. HttpMessageConverter将对象转为 JSON
6. DispatcherServlet 返回 JSON 响应
7. 前端渲染页面
✅ 特点:
- 后端只提供数据接口
- 前端完全控制 UI
- 使用
@RestController或@ResponseBody - 跳过 ViewResolver
四、关键差异总结
| 环节 | 传统模式(JSP) | 前后端分离(JSON) |
|---|---|---|
| Controller 注解 | @Controller |
@RestController |
| 返回值类型 | String(视图名) | Java 对象(自动转 JSON) |
| 视图处理 | ViewResolver 渲染 JSP |
HttpMessageConverter 序列化 |
| 响应内容 | 完整 HTML | 纯 JSON 数据 |
五、面试高频问题 & 回答思路
❓ Q1:Spring MVC 的工作流程是怎样的?
答:先说共性:“所有请求由 DispatcherServlet 接收 → HandlerMapping 找 Controller → HandlerAdapter 调用方法”。
再分场景:“如果是前后端不分离的项目,会通过 ViewResolver 渲染页面;如果是前后端分离的项目,则用 HttpMessageConverter 返回 JSON。”
❓ Q2:@Controller 和 @RestController 有什么区别?
答:
@RestController = @Controller + @ResponseBody。后者会让所有方法默认返回 JSON,不走视图解析。
六、总结
无论哪种,底层都是同一套组件协作完成。理解“变”与“不变”,才能真正掌握框架本质。
更多推荐




所有评论(0)