news 2026/3/26 9:48:24

什么是 Spring MVC?从零讲透 Web 开发核心(附完整代码 + 避坑指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
什么是 Spring MVC?从零讲透 Web 开发核心(附完整代码 + 避坑指南)

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!


一、真实场景:你写的接口,Spring 到底做了什么?

你写了一个简单的接口:

@RestController public class UserController { @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { return new User(id, "张三"); } }

启动项目,浏览器访问http://localhost:8080/user/123,立刻返回 JSON:

{"id":123,"name":"张三"}

但你有没有想过:

  • 路径/user/123是怎么匹配到getUser方法的?
  • {id}是怎么自动转成Long id的?
  • 返回的User对象是怎么变成 JSON 的?
  • 整个流程是谁在协调?

👉答案就是:Spring MVC!


二、Spring MVC 是什么?(通俗版)

Spring MVC 是 Spring 框架中专门用于构建 Web 应用的模块,它基于经典的“MVC 设计模式”,帮你自动处理 HTTP 请求、参数绑定、视图渲染等繁琐工作。

✅ 核心目标:

  • 让你只关注业务逻辑(Controller 方法)
  • 自动完成请求 → 方法调用 → 响应的全流程

三、MVC 是啥?为什么重要?

MVC =Model(模型) + View(视图) + Controller(控制器)

组件职责在 Spring Boot 中的表现
Model数据载体Java Bean(如UserOrder
View展示层Thymeleaf 模板 / 或直接返回 JSON(无 View)
Controller控制器@RestController@Controller

💡 在前后端分离时代,View 常被省略,Controller 直接返回 JSON(即 RESTful API),但底层仍是 Spring MVC 在驱动!


四、Spring MVC 的核心组件(架构图解)

浏览器 → DispatcherServlet → HandlerMapping → Controller → Service → DB ↑ ↓ HandlerAdapter ViewResolver(可选)

关键角色说明:

组件作用
DispatcherServlet前端控制器,所有请求的统一入口(本质是一个 Servlet!)
HandlerMapping根据 URL 找到对应的 Controller 方法
HandlerAdapter调用 Controller 方法,并处理参数/返回值
ViewResolver(可选)将逻辑视图名转为实际页面(如index.html
HttpMessageConverter将对象 ↔ JSON/XML(如@ResponseBody依赖它)

🔥重点:DispatcherServlet 是 Spring MVC 的心脏!


五、动手实战:手写一个 Spring MVC 流程(Spring Boot 版)

1️⃣ 引入依赖(自动包含 Spring MVC)

<!-- pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

spring-boot-starter-web内部已包含spring-webmvc


2️⃣ 编写 Model

// User.java public class User { private Long id; private String name; // 构造函数、getter/setter 省略(可用 Lombok) public User(Long id, String name) { this.id = id; this.name = name; } // getter... }

3️⃣ 编写 Controller(核心!)

// UserController.java @RestController @RequestMapping("/api") public class UserController { // GET /api/user/123 @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { System.out.println("收到请求,ID=" + id); return new User(id, "张三"); } // POST /api/user @PostMapping("/user") public String createUser(@RequestBody User user) { // 实际应调用 service 保存到 DB return "用户 " + user.getName() + " 创建成功!"; } }

4️⃣ 启动 & 测试

# 启动 mvn spring-boot:run # 测试 GET curl http://localhost:8080/api/user/123 # 测试 POST curl -X POST http://localhost:8080/api/user \ -H "Content-Type: application/json" \ -d '{"id":456,"name":"李四"}'

✅ 输出:

{"id":123,"name":"张三"}
用户 李四 创建成功!

🎯 这背后全是 Spring MVC 在默默工作!


六、反例警告 ❌ —— 新手常踩的坑

❌ 反例1:忘记加@RequestBody导致参数绑定失败

// 错误写法! @PostMapping("/user") public String createUser(User user) { // 缺少 @RequestBody return "OK"; }

💥 结果:user对象所有字段为 null!
✅ 正确:JSON 请求体必须用@RequestBody标注


❌ 反例2:混淆@Controller@RestController

// 错误用法 @Controller public class BadController { @GetMapping("/test") public String test() { return "hello"; // 会被当作视图名! } }

💥 结果:Spring 会去找templates/hello.html,找不到就 404!
✅ 正确:

  • 返回 JSON → 用@RestController
  • 返回页面 → 用@Controller+@ResponseBody(或配合 Thymeleaf)

❌ 反例3:路径重复导致映射冲突

@RestController public class AController { @GetMapping("/data") public String a() { return "A"; } } @RestController public class BController { @GetMapping("/data") public String b() { return "B"; } // 冲突! }

💥 启动报错:Ambiguous mapping(映射不明确)
✅ 解决:确保每个 URL 唯一,或使用不同前缀(如/api/v1,/api/v2


七、Spring MVC vs 原生 Servlet?优势在哪?

对比项原生 ServletSpring MVC
参数获取request.getParameter("id")@PathVariable Long id
JSON 转换手动用 Jackson自动@ResponseBody
路由管理手写 if-else 或 web.xml注解@GetMapping
异常处理try-catch@ControllerAdvice全局处理
扩展性拦截器、AOP、自定义转换器等

✅ Spring MVC极大简化 Web 开发,避免重复造轮子!


八、注意事项总结 ⚠️

  1. @RestController = @Controller + @ResponseBody,返回值直接序列化。
  2. 路径变量用@PathVariable,请求参数用@RequestParam,JSON 体用@RequestBody
  3. Spring MVC 默认使用 Jackson 做 JSON 转换,确保类有 getter/setter。
  4. 不要手动创建 DispatcherServlet!Spring Boot 已自动配置。
  5. 静态资源(如 JS/CSS)放在resources/static/下,Spring MVC 会自动放行

九、结语

Spring MVC 不是“另一个框架”,而是Spring 生态中处理 Web 请求的标准方案。无论你是做传统页面渲染,还是现代 RESTful API,都离不开它。

理解它,你就掌握了 Java Web 开发的“任督二脉”!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 12:56:40

UDS协议基础概念图解说明:小白也能看懂的教程

UDS协议入门图解&#xff1a;从零理解汽车诊断通信你有没有想过&#xff0c;当你的爱车仪表盘亮起“发动机故障灯”&#xff0c;4S店的技师是如何在几分钟内精准定位问题的&#xff1f;背后支撑这套高效诊断系统的&#xff0c;正是我们今天要讲的主角——UDS协议。别被名字吓到…

作者头像 李华
网站建设 2026/3/24 6:43:25

Nodejs和vue的艺术作品展示平台 艺术家在线交流系统 关注

文章目录艺术作品展示与交流平台摘要--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;艺术作品展示与交流平台摘要 Node.js与Vue构建的艺术作品展示平台为艺术家和艺术爱好者提供在线展示、交流与合作的数字化空间。…

作者头像 李华
网站建设 2026/3/22 21:04:09

AI手势识别未来趋势:无接触交互将成为主流?入门必看

AI手势识别未来趋势&#xff1a;无接触交互将成为主流&#xff1f;入门必看 随着人机交互方式的不断演进&#xff0c;AI手势识别技术正从科幻走向现实。从智能汽车的空中操控&#xff0c;到AR/VR中的自然交互&#xff0c;再到智能家居的“隔空点控”&#xff0c;无接触式交互正…

作者头像 李华
网站建设 2026/3/23 3:56:53

智能打码系统性能分析:AI隐私卫士基准

智能打码系统性能分析&#xff1a;AI隐私卫士基准 1. 引言&#xff1a;AI驱动的隐私保护新范式 随着社交媒体和数字影像的普及&#xff0c;个人隐私泄露风险日益加剧。尤其是在多人合照、公共监控或远距离抓拍等场景中&#xff0c;未经处理的人脸信息极易被滥用。传统的手动打…

作者头像 李华
网站建设 2026/3/23 11:19:20

2017:我为AI点亮火种-第9集:手搓!Transformer核心

笔言: 姊妹篇已一路高歌冲至《2005&#xff1a;我在硅谷种AI》第6集——手写数字的5层尊严&#xff08;神经网络初登场&#xff09; 故事大纲&#xff08;30集微故事版&#xff09; 核心设定&#xff1a; 主角陈默&#xff0c;2025年顶尖AI科学家&#xff0c;在突破AGI实验时因…

作者头像 李华
网站建设 2026/3/23 18:30:36

2005:我在硅谷种AI-第7集:过拟合的幽灵

笔言: 推荐AI相关我正在写故事: 我在蒸汽纪元证真理 【AI数学基础】和重生1995&#xff1a;我的数学模型能暴击【数学模型】 故事大纲&#xff08;25集结构版&#xff09; 核心设定&#xff1a; 主角陆眠&#xff0c;2025年谷歌Brain部门“反内卷”科学家&#xff0c;在演示极简…

作者头像 李华