Spring MVC的认识
- Spring web mvc被大家普遍的认为是spring mvc。
- 我们的spring mvc是基于servlet的。
- Spring mvc最开始就包含在了spring framework中。
MVC和SpringMVC的变动
MVC是Model View Controller的缩写
MVC

我们传统的mvc呢就是我们需要自己去写视图,就是说我们视图把根据请求发送给我们的控制器,然后控制器呢去调度处理,选择我们的模型进行一个数据的处理,处理完毕之后呢把结果返回给我们的控制器,然后我们控制器最终呢将响应返回给我们的视图。
SpringMVC

而我们的spring mvc呢,它核心呢就是关注于spring web,也就是说呀,能把我们传统的mvc变得更加的灵活。比如我们会有一种情况,如图所示,我们浏览器呢直接可以去请求控制器,然后控制器去调用我们的模型,然后模型把数据给返回给我们的控制器,最终控制器直接就可以把数据呢响应给我们的浏览器。
另外一种情况是为了兼容我们传统的mvc,也就是我们的浏览器去请求控制器,然后我们的控制器呢它去调用模型处理数据,然后返回处理后的数据给我们的控制器,控制器呢再将我们的结果响应给视图,视图把它渲染成完整页面之后再返回给浏览器。
总结
Spring Web MVC完全继承了传统MVC的分层思想和核心职责 ,核心变动是适配了现代前后端分离的开发趋势 ,通过优化请求入口、让视图层可在服务端/前端灵活归属,让控制层拥有多结果出口,既保留了对传统服务端渲染的兼容,又成为当下前后端分离开发的主流架构,是传统MVC在Web开发领域的现代化演进版本。
SpringBoot和Spring Framework和springMVC关系
Spring boot、 spring framework、 spring mvc 他们三个之间的关系。
我们的spring boot类似于12306,spring framework类似于火车,Spring mvc类似于代售点,三者不存在替代关系,而是互补和依赖;
✅ 核心对应
- Spring Framework(火车) :整个体系的核心载体和基础,没有火车就不存在购票、乘车的一切逻辑,就像没有 Spring Framework 的 IOC/AOP 核心能力,Spring MVC 和 Spring Boot 都无从谈起;火车是实现「运输」核心需求的底层支撑,正如 Spring Framework 是实现 Java 开发「解耦、分层」核心需求的底层支撑。
- Spring MVC(代售点) :基于核心载体的「专属功能模块」 ,代售点是火车运输体系下,专门解决「线下购票」需求的功能节点,不能脱离火车体系单独存在;正如 Spring MVC 是 Spring Framework 体系下,专门解决「Web 开发 / 请求响应」需求的子模块,天然依赖 Spring 的核心能力,且是体系内的标准化功能入口。
- Spring Boot(12306) :基于核心载体 + 功能模块的「高效便捷工具」 ,12306 没有替代火车 / 代售点,而是把「购票、查车次、选座」等代售点的功能,做成了更高效、更便捷的线上工具,省去了线下排队、填单的繁琐;正如 Spring Boot 没有替代 Spring Framework/Spring MVC,而是把 Spring 的核心配置、Spring MVC 的 Web 组件配置等繁琐工作,做成了自动化、极简式的工具,省去了手动配依赖、写 xml 的麻烦,本质还是调用火车(Framework)和代售点(MVC)的核心能力。
✅ 互补依赖
- 无替代,只互补:12306 再方便,也需要火车来完成运输、代售点作为线下补充;Spring Boot 再便捷,也需要 Spring Framework 做核心支撑、Spring MVC 做 Web 核心处理,三者各司其职,覆盖「基础 - 功能 - 便捷」全场景。
- 层层依赖,缺一不可:12306 的购票数据最终对接火车调度系统,代售点也隶属于火车体系;Spring Boot 的自动配置最终还是生成 Spring Framework 的容器 Bean、加载 Spring MVC 的 Web 组件,底层逻辑完全由前两者决定。
- 主流选择但不淘汰传统:现在大家优先用 12306(Spring Boot),但代售点(Spring MVC)依然存在(传统 Spring MVC 开发),火车(Spring Framework)更是根基;正如企业主流用 Spring Boot,但 Spring MVC 的 Controller/RequestMapping 核心用法不变,Spring Framework 的 IOC/AOP 更是深入所有代码。
学习Spring MVC
我们学习spring mvc实际上是对spring web的学习,那么学习spring web就这三个:1.建立连接,2.请求,3.响应,掌握这3点即掌握Spring MVC的核心,用银行存款案例可直观理解:
- 建立连接:将用户(浏览器)与Java程序(Spring程序)关联,即通过访问一个URL,能调用到Spring程序中的对应方法(类比:去银行柜台,建立与银行工作人员的连接)。
- 请求处理:用户发送请求时会携带参数,程序需获取这些参数(类比:去银行存款时,携带银行卡、身份证等参数)。
- 响应处理:执行完业务逻辑后,将程序运行结果返回给用户(类比:银行办理完存款后,返回存折给用户)。
那么接下来我们就对这三个点进行一一的学习,首先呢本期我们来看第一个点建立连接。
1 建立连接:URL路由映射
Spring MVC中通过**@RequestMapping注解**实现URL与程序方法的映射,即浏览器访问指定URL时,会触发对应方法的执行。
说白了建立连接就是通过@RequestMapping注解实现的。
RequestMapping译为请求映射。
1.1.1 基础代码示例
- @RequestMapping可以加在方法上,也可以加载类上。
- 加在类上我们称之为类路径,加在方法上面,我们称之为方法路径,然后的话,我们最终是要访问对应的方法的,所以呢此时我们的资源路径就是类路径+方法路径【具体的路径就是:协议+IP+端口+上下文路径/+类路径+方法路径】。
java
package com.zhongge.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName UserController
* @Description TODO 用户控制器
* @Author 笨忠
* @Date 2026-02-05 16:18
* @Version 1.0
*/
@RestController
@RequestMapping("/user") //加在类上面
public class UserController {
@RequestMapping("/m1")//加载方法上面
public String m1(){
return "m1";
}
}
路径:http://127.0.0.1:8080/`user`/`m1`
结果:

注意:方法名与URL路径名称无需一致,访问上述路径即可看到返回结果。
1.1.2 @RequestMapping注解详解
1.核心作用:注册接口的路由映射,即用户访问指定URL时,对应到程序中某个类的某个方法(这个过程称为"路由映射")。
2.修饰范围:RequestMapping它是一个类路径,也是一个方法路径。就是说它既是一个类柱解,也是一个方法注解。如果我们加在类上,那么我们的访问路径就是累路径+方法路径。如果我们没有加在类上,那么我们的路径就只有方法路径,但是我们建议给类也加上一个路径的映射,目的是:
- 为了防止路径重复,好比是包机制
- 为了提高可读性
3.与@RestController的关系:@RestController是Spring MVC的核心控制器注解,Spring会扫描加了该注解的类,再查看类中是否有@RequestMapping注解。若去掉@RestController,访问URL会报404错误(Spring无法识别该类为控制器)。
其实啊他我们在后面学过spring的Ioc我们知道,我们这个类的实例化不需要我们自己去做,我们把它交给我们的spring容器,然后呢由他去给我们创建这类的一个实例,我们的spring是不知道的帮你创建哪些类的实例的,所以呢你得打上这个controller标签用来告诉他,然而呢如果你的结果返回的是JSON对象的话,你就得写RestController。
4.URL路径注意事项:路径最前面加不加"/"均可,Spring启动时会自动拼接;支持多层路径(如"/user/m1/say/hi"),举个例子:
java
@RestController
@RequestMapping("user") //加在类上面【不用写/】
public class UserController {
@RequestMapping("m1")//加载方法上面【不用写/】
public String m1(){
return "m1";
}
}
结果:

但是为了规范,我们建议将斜杆/加上。
注意事项1:资源路径不可以重复
java
@RestController
@RequestMapping("/user") //加在类上面
public class UserController {
@RequestMapping("/m1")//加载方法上面
public String m1(){
return "m1";
}
@RequestMapping("m1")//加载方法上面
public String m2(){
return "m1";
}
}
直接就报错了

是这样的@RequestMapping它的作用是将我们的资源路径与对应的方法进行映射。那么的话,它底层是一个类似于map集合的形式,将键值对给存起来。我们的资源路径就是key,我们的方法就是value。那么此时啊我们的key是不可以重复的,也就是说我们的资源路径是不可以重复的。
1.1.3 请求方式支持
@RequestMapping默认支持所有请求方式(GET、POST等):
- GET请求:浏览器发送的请求默认是GET,可直接通过URL访问触发。
- POST请求:可通过form表单、Postman等工具构造POST请求【Postman工具的使用我们在后面有提到】,同样能触发方法执行。
- 指定请求方式:通过@RequestMapping的method属性指定(如method=RequestMethod.POST),此时该方法仅支持指定的请求方式。
我们的@RequestMapping默认支持所有请求方式,那么此时我们如果想要让他只支持Get请求的话,怎么做呢?方法=请求方法枚举.请求方式
java
@RestController
@RequestMapping("/user") //加在类上面
public class UserController {
//既可以支持GET又可以支持POST
/*@RequestMapping("/m1")//加载方法上面
public String m1(){
return "m1";
}*/
//只是支持GET
/*
* 注意:如果有多个参数的话,那么此时就要将value属性给写上
* 如果只有一个参数的话,那么此时我们的value属性是可以省略的
* */
@RequestMapping(value = "/m2", method = RequestMethod.GET)//加载方法上面
public String m2(){
return "m2";
}
}
此时我们的GET请求是可以成功的

但是我们的POST请求会报错:会报一个405的错误,我们前面说过,4开头的是客户端出问题了,404是不允许访问,而405则是方法不被允许。

同理我只支持POST请求
java
@RequestMapping(value = "/m3", method = RequestMethod.POST)
public String m3(){
return "m3";
}

那么接下来咱么就讲一下注解:
1)对于任何注解如果我只是一个属性的话,那么我的值默认就是给value属性的
"m1"等价于 vlaue="/m1"
java
@RequestMapping("/m1")
2)对于任何注解如果我有多个属性的话,那么此时就得显示的将value写出来
java
@RequestMapping(value = "/m2", method = RequestMethod.GET)
那么我就有一个疑问了:你如果只是支持一个GET请求就要写那么长:@RequestMapping(value = "/m2", method = RequestMethod.GET)
那么其实我们使用一个比较简单的代替方案的:@GetMapping("/m2")
就是说:@RequestMapping(value = "/m2", method = RequestMethod.GET)等价于@GetMapping("/m2")
java
@GetMapping("/m2")
public String m2(){
return "m2";
}

同理:@RequestMapping(value = "/m3", method = RequestMethod.POST)等价于@PostMapping("/m3")
@RequestMapping注解中的属性
java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective({ControllerMappingReflectiveProcessor.class})
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
| 属性名 | 类型 | 默认值 | 核心用法 |
|---|---|---|---|
| name | String | 空字符串 | 给当前请求映射设置唯一标识,用于文档生成 / 监控排查,无实际路由作用,仅做语义化标记 |
| value | String[] | 空数组 | 【路径映射核心】指定请求的 URL 路径,支持数组(多路径映射同一方法) 、占位符 {xxx} 、通配符(单层)/ *(多层);与path互为别名 |
| path | String[] | 空数组 | 与value完全等价,推荐显式使用 path提升代码可读性(Spring 官方最佳实践),避免 value 的多语义混淆 |
| method | RequestMethod[] | 空数组 | 指定匹配的HTTP 请求方式 ,枚举值包含GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS/TRACE;空数组表示匹配所有请求方式 |
| params | String[] | 空数组 | 匹配请求的URL 参数 ,支持复杂表达式(如!id表示无 id 参数、id=123表示 id 等于 123、id!=123表示 id 不等于 123) |
| headers | String[] | 空数组 | 匹配请求的请求头 ,语法同 params(如Content-Type=application/json、!token),支持通配符(如Accept=*/*) |
| consumes | String[] | 空数组 | 指定方法接收的请求体媒体类型(Content-Type) ,如application/json、application/x-www-form-urlencoded;匹配失败返回 415 Unsupported Media Type |
| produces | String[] | 空数组 | 指定方法返回的响应体媒体类型(Content-Type) ,结合请求头Accept匹配,如application/json;charset=UTF-8;匹配失败返回 406 Not Acceptable |
补充: 工具介绍:Postman(接口测试工具)
后端开发无需编写前端代码测试接口,可使用Postman工具模拟各种请求,高效测试后端接口。
1) 下载与安装
下载链接:postman,安装后无需升级(提示升级时点击Dismiss即可)。
2) Postman的使用
首先你登录之后的界面如下:

然后点击+号创建文件夹,然后自己为文件夹起一个名字

此时点击add a request添加一个请求

然后可以自己起一个名字

选择请求的方式


点击保存,那么到时候我们的数据就会保存下来

3) Postman核心传参方式(Postman常用)
- 普通传参(查询字符串) :通过URL拼接参数(如?name=spring&age=18),对应HTTP请求的查询字符串部分。
Params->Query Params

- headers部分
用来传递请求的元数据,告诉服务器 "我是谁"、"我要什么格式的数据" 等信息
常见场景:
1)身份验证:Authorization: Bearer <token>
2)指定数据格式:Content-Type: application/json
3)模拟浏览器请求:User-Agent: Mozilla/5.0... - Body中的 form-data:用于提交文件、图片等【二进制的信息】,对应Content-Type: multipart/form-data。
- x-www-form-urlencoded:普通表单提交格式,对应Content-Type: application/x-www-form-urlencoded。
- Body中 raw:可上传任意格式文本(如JSON、XML、HTML等),常用于传递JSON数据。
那么到现在的话,我们掌握了Postman工具的使用,以及我们已经学习了Spring Web的第一个知识就是建立连接。
我们说Spring Web主要就是学3个:建立连接、请求、响应,那么下一期我们会学习第二个知识:请求。最后感谢各位老铁,如果觉得可以,希望老铁给个点赞+关注,我们下期再见~~👋