跳到主要内容Spring Web MVC 入门:从概念到实践 | 极客日志Javajava
Spring Web MVC 入门:从概念到实践
综述由AI生成Spring Web MVC 是基于 Servlet API 构建的 Web 框架,采用模型 - 视图 - 控制器(MVC)架构模式分离业务逻辑。文章讲解了 Spring MVC 的核心注解如@RestController 用于返回数据,@RequestMapping 用于映射请求路径及 HTTP 方法。通过项目搭建演示了如何建立浏览器与 Java 程序的连接。此外还介绍了 Postman 工具在 API 调试中的应用,涵盖普通传参、表单提交、JSON 传输以及参数接收的各种方式,包括单个参数、多个参数、对象、数组和集合的处理技巧。
鲜活18 浏览 
一、什么是 Spring Web MVC?
1.定义
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架。是 Spring 框架中用于构建 Web 应用程序的模块,基于模型 - 视图 - 控制器(MVC)构架模式。简称 Spring MVC。
- Servlet:Servlet 是 Java 企业级开发中的一项核心技术,主要用于在 Web 服务器上处理客户端请求并生成的动态响应。Servlet 不能独立运行,必须部署在支持 Servlet 规范的容器内。
2.关于 MVC
2.1什么是 MVC?
定义
MVC 是一种软件构架模式,广泛应用于图形用户界面(GUI)和 Web 应用程序的开发中。它通过将应用程序的逻辑分为三个核心部分,实现了关注点分离,提高了代码的可维护性、可扩展性和复用性。
MVC 的核心组成:模型(Model)、视图(View)、控制器(Controller),三者各司其职又相互协作。
步骤:
模型(Model):负责管理应用程序的数据和业务逻辑。是应用程序的'数据中心'。例如学生的家庭、号码、住址等数据。
视图(View):负责展示数据,是用户直接看到和交互的界面。例如我们平常经常看到的网页哪些界面。同一个模型可以对应多个视图。
控制器(Controller):作为模型和视图之间的'桥梁',负责协调两者的交互,处理用户的核心业务逻辑。例如,'订单控制器',用户请求下单,调用商品,那么商品模型的减少库存,调用订单模型创建订单,最后跳转订单成功页面。

- 用户通过视图发起交互(例如在网页点击跳转页面)。
- 控制器接收用户请求。
- 控制器调用模型,进行数据处理(如验证、存储)。
- 模型处理完数据后,并将结果返回给控制器。
- 控制器选择对应的视图,并传递模型数据给视图。
- 视图展示模型数据,用户看到最终结果。
简要概括:用户->视图->控制器->模型->控制器->视图->用户
二、学习 Spring MVC
- 建立连接:将用户(浏览器)和 Java 连接起来,访问一个地址可以调用 Spring 程序
- 请求:用户请求一些参数,想办法获取这些参数。
- 响应:执行了业务逻辑,把程序执行结果返回给用户。
1.项目准备
创建项目
点击 New Project 创建新项目

点击 Spring Initializr,没有的话需要自己去下载,随后点击下一步
- 这里注意一下,只能包含小写字母、数字、连字符(-)、下划线、句号(.),不能包含大写字母。
@RestController
public class hello {
@RequestMapping("/sayhello")
public String say(){
return "hello";
}
}
2.@RestController 注解的介绍
@RestController 注解就像给控制器类贴一个特殊标签,告诉 Spring 框架:这个类里的方法是传给前端的返回数据。让控制器里的方法直接返回的东西当成响应内容发给前端,不用再走'找页面'流程。
如果不控制器加 @RestController 注解会访问页面会怎么样?
@RestController 的核心作用是'让方法返回数据'
如果没有 @RestController,通常会用普通的@Controller 注解,或者干脆不加控制器注解,那么类就不会被识别为控制器。
- 用@Controller,方法返回的是'页面地址'
- 什么控制器注解都不加,那么类只是一个普通类,接口无法访问。
3.@RequestMapping 注解
定义:@RequestMapping 是 Spring 框架中一个非常重要的注解,用于将特定的 Http 请求方法映射到对应的处理方法。@RequestMapping("/hello")中里面的/hello 表示调用路径里面的方法的代码。路径不加/也可以,没有影响,最好可以加一下。
@RequestMapping 注解既可以用在类上,也可以用在方法上:
1.@RequestMapping 只用在类上(相当于'只给文件夹起名,不给文件起名')
@RestController
@RequestMapping("/sayhello")
public class hello {
public String say(){
return "hello";
}
}
相当于系统找到了文件夹,但不知道具体是哪个文件。就像你找一个住址,你只知道是哪个身份,但你并不知道是哪一个县哪一个乡,找不到具体是哪一个位置。
2.@RequestMapping 只用在方法上(相当于'只给文件起名,不给文件夹起名')
@RestController
public class hello {
@RequestMapping("/sayhello")
public String say(){
return "hello";
}
}
相当于系统不知道是哪个文件夹的文件,但是会搜索所有文件夹来查找这个文件,直接通过文件名来定位。
那么如果出现相同的文件名呢?会怎么样,我们来试一下。
@RestController
@RequestMapping("/sayhello")
public class hello {
public String say1(){
return "hello1";
}
public String say2(){
return "hello2";
}
}
系统只知道文件名,但是有两个相同的文件名,会出现路径重复的问题,发生报错现象。
3.@RequestMapping 用在类和方法上(相当于给文件夹和文件都取名)
@RestController
@RequestMapping("/sayhello")
public class hello {
@RequestMapping("/hello1")
public String say1(){
return "hello1";
}
@RequestMapping("/hello2")
public String say2(){
return "hello2";
}
}
相当于给文件夹和文件都取名,可以进行具体的定位,不容易发生报错。
查看 RequestMapping 是否即支持 Post 和 Get
@RestController
@RequestMapping("/number")
public class Rest {
@RequestMapping("/1")
public Integer num1(){
return 1;
}
}
@RequestMapping(value = "6",method = {RequestMethod.GET,RequestMethod.POST})
public Integer num6(){
return 6;
}
- RequestMapping 即支持 Post 和 Get
如果我只要只能用 get 或者 Post 其中一种呢?应该怎么写
@RequestMapping(value="/2",method = RequestMethod.GET)
public Integer num2(){
return 2;
}
@GetMapping("/3")
public Integer num3(){
return 3;
}
@RequestMapping(value="/4",method = RequestMethod.POST)
public Integer num4(){
return 4;
}
@PostMapping("/5")
public Integer num5(){
return 5;
}
三、Postman
1.什么是 Postman?
Postman 是一筐广泛用于 API 开发、测试和调试的工具,被开发者、测试工具等广泛使用,其核心价值体现在高效、便捷的处理 API 相关工作。
Post 是 API 开发调试的高效工具,核心优势:
- 调试简单:图形化界面,填好参数就能发送请求,不用写代码,响应结果直观展示。
- 功能全面:支持各种 HTTP 请求方法和数据格式。
- 协作方便:可将 API 分组管理,共享给团队;多环境一键切换,不用重复配置。
- 能自动化测试:可写脚本验证响应,批量运行测试并生成报告,还能集成开发流程中自动检测问题。
- 实用小工具:保存请求历史、自动生成 API 文档等,提升效率。
2.关于 API
API(Application Programming Interface,应用程序编程接口)是不同软件之间进行交互的一套规则、协议和工具的集合,它规定了一方如何向另一方请求服务或数据,以及另一方如何响应。API 就像两个软件之间的'桥梁'或'服务员',让他们能按照统一的方式沟通,而无需了解对方的内部工作原理。
就像我们去网购的时候,我们直接对自己想要的东西直接下单购买即可,不用了解其内部具体流程是怎么样执行的,最后他都会把你要的东西给到你。这里'下单的流程'就是 API 规则。
3.传参介绍
1.普通传参:通过查询字符串来传参
2.form-data(完整表示为:multipart/form-data)
表单提交数据,在 form 标签中加上 enctyped="multipart/form-data",通常用于提交图片/文件。对应 Content-type:multipart/form-data
3.x-www-form-urlencoded
form 表单:对应 Content-type:application/x-www-form-urlencoded
4.raw:可以上传任意格式的文本,比如:text、JavaScript、json、html、xml
4.传递参数
1.传递单个参数
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/1")
public String method(String string){
return "接收单个参数:"+string;
}
}
@RequestMapping("/2")
public String method2(Integer i){
return "接收单个参数:"+i;
}
@RequestMapping("/3")
public String method3(int j){
return "接收单个参数:"+j;
}
- 引用类型:传参时,若不传值,会赋值为 null,不会发生报错现象
- 基本类型:传参时,若不传值,不会发生报错现象
2.传递多个参数
@RequestMapping("/4")
public String method3(String name,Integer age){
return "接收多个参数: "+"姓名:"+name+" 年龄:"+age;
}
3.传递对象
@RequestMapping("/5")
public String method3(User user){
return "接收对象参数:"+user.toString();
}
@RestController
@RequestMapping("/User")
public class User {
private String name;
private int password;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", password=" + password + ", age=" + age + '}';
}
}
如果前后端参数命名不一致,可能会出接收不到的情况,这时候我们可以使用@RequestParam 来重命名前后端参数。
@RequestMapping("/6")
public String method6(@RequestParam("str")String s){
return "接收参数:"+s;
}
- 使用@RequestParam 重命名时参数就成了必传参数,否则将会报错
- 使用@RequestParam 时,就不能再使用原来的前后端的参数名
如果真的不想要传参数怎么办?
看一下 @RequestParam 的源码
其默认参数为 true,所以一定要传参数,我们将其改为 false 就好了
@RequestMapping("/7")
public String method7(@RequestParam(value = "str",required = false)String s){
return "接收参数:"+s;
}
4.传递数组
@RequestMapping("/8")
public String method8(String[] s){
return Arrays.toString(s);
}
5.传递集合
传递集合需要使用@RequestParam 用于接收单个请求参数。如果要接收 List 类型,需要显示开启'允许多值'模式,否则 Spring 无法解析
@RequestMapping("/9")
public List<Integer> method8(@RequestParam List<Integer> num){
return num;
}
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online