Spring Web MVC 入门:概念与实战基础
介绍 Spring Web MVC 基础概念及 MVC 架构模式,讲解 Spring Boot 项目搭建流程。重点阐述@RestController 和@RequestMapping 注解的用法,包括类级别与方法级别的映射规则。最后通过 Postman 工具演示 API 测试,涵盖查询字符串、表单数据及对象参数传递方式,帮助开发者快速掌握后端接口开发核心技能。

介绍 Spring Web MVC 基础概念及 MVC 架构模式,讲解 Spring Boot 项目搭建流程。重点阐述@RestController 和@RequestMapping 注解的用法,包括类级别与方法级别的映射规则。最后通过 Postman 工具演示 API 测试,涵盖查询字符串、表单数据及对象参数传递方式,帮助开发者快速掌握后端接口开发核心技能。


Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,是 Spring 框架中用于构建 Web 应用程序的模块,基于模型 - 视图 - 控制器(MVC)架构模式。简称 Spring MVC。
MVC 是一种软件架构模式,广泛应用于图形用户界面(GUI)和 Web 应用程序的开发中。它通过将应用程序的逻辑分为三个核心部分,实现了关注点分离,提高了代码的可维护性、可扩展性和复用性。
MVC 的核心组成:模型(Model)、视图(View)、控制器(Controller),三者各司其职又相互协作。
步骤:
模型(Model):负责管理应用程序的数据和业务逻辑。是应用程序的'数据中心'。例如学生的姓名、号码、住址等数据。 视图(View):负责展示数据,是用户直接看到和交互的界面。例如网页界面。同一个模型可以对应多个视图。 控制器(Controller):作为模型和视图之间的'桥梁',负责协调两者的交互,处理用户的核心业务逻辑。例如,'订单控制器'处理下单请求,调用商品模型减少库存,调用订单模型创建订单,最后跳转订单成功页面。
简要概括:用户 -> 视图 -> 控制器 -> 模型 -> 控制器 -> 视图 -> 用户
创建项目
点击 New Project 创建新项目,选择 Spring Initializr。

注意项目名称只能包含小写字母、数字、连字符(-)、下划线、句号(.),不能包含大写字母。

配置完成后启动项目。

建立连接
创建一个类,实现用户与浏览器的交互。
@RestController
public class Hello {
@RequestMapping("/sayhello")
public String say() {
return "hello";
}
}
在浏览器输入网址 http://127.0.0.1:8080/sayhello 查看结果。
@RestController 注解就像给控制器类贴一个特殊标签,告诉 Spring 框架:这个类里的方法是传给前端的返回数据。让控制器里的方法直接返回的东西当成响应内容发给前端,不用再走'找页面'流程。
如果不加 @RestController 注解会访问页面会怎么样?
结果如下:

@RestController 的核心作用是'让方法返回数据'。如果没有 @RestController,通常会用普通的 @Controller 注解,或者干脆不加控制器注解,那么类就不会被识别为控制器。

定义:@RequestMapping 是 Spring 框架中一个非常重要的注解,用于将特定的 Http 请求方法映射到对应的处理方法。@RequestMapping("/hello") 中里面的 /hello 表示调用路径里面方法的代码。路径不加/也可以,没有影响,最好可以加一下。
@RequestMapping 注解既可以用在类上,也可以用在方法上:
@RestController
@RequestMapping("/sayhello")
public class Hello {
public String say() {
return "hello";
}
}

相当于系统找到了文件夹,但不知道具体是哪个文件。就像你找一个住址,你只知道是哪个身份,但你并不知道是哪一个县哪一个乡,找不到具体是哪一个位置。
@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";
}
}

系统只知道文件名,但是有两个相同的文件名,会出现路径重复的问题,发生报错现象。
@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 {
// 即支持 post,又支持 get
@RequestMapping("/1")
public Integer num1() {
return 1;
}
}


另一种写法:
@RequestMapping(value = "6", method = {RequestMethod.GET, RequestMethod.POST})
public Integer num6() {
return 6;
}
如果我只要只能用 get 或者 Post 其中一种呢?应该怎么写。
只用 get
// 写法 1
@RequestMapping(value="/2", method = RequestMethod.GET)
public Integer num2() {
return 2;
}
// 写法 2
@GetMapping("/3")
public Integer num3() {
return 3;
}

只请求 Post
// 写法 1
@RequestMapping(value="/4", method = RequestMethod.POST)
public Integer num4() {
return 4;
}
// 写法 2
@PostMapping("/5")
public Integer num5() {
return 5;
}


Postman 是一筐广泛用于 API 开发、测试和调试的工具,被开发者、测试工具等广泛使用,其核心价值体现在高效、便捷的处理 API 相关工作。
Post 是 API 开发调试的高效工具,核心优势:
API(Application Programming Interface,应用程序编程接口)是不同软件之间进行交互的一套规则、协议和工具的集合,它规定了一方如何向另一方请求服务或数据,以及另一方如何响应。API 就像两个软件之间的'桥梁'或'服务员',让他们能按照统一的方式沟通,而无需了解对方的内部工作原理。
就像我们去网购的时候,我们直接对自己想要的东西直接下单购买即可,不用了解其内部具体流程是怎么样执行的,最后他都会把你要的东西给到你。这里'下单的流程'就是 API 规则。
界面介绍:


表单提交数据,在 form 标签中加上 enctyped="multipart/form-data",通常用于提交图片/文件。对应 Content-type:multipart/form-data。

form 表单:对应 Content-type:application/x-www-form-urlencoded。


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;
}


@RequestMapping("/4")
public String method3(String name, Integer age) {
return "接收多个参数:" + "姓名:" + name + " 年龄:" + age;
}

@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
如果前后端参数命名不一致,可能会出接收不到的情况,这时候我们可以使用 @RequestParam 来重命名前后端参数。
// 将其重命名为 str
@RequestMapping("/6")
public String method6(@RequestParam("str") String s) {
return "接收参数:" + s;
}


如果真的不想要传参数怎么办? 看一下 @RequestParam 的源码。

其默认参数为 true,所以一定要传参数,我们将其改为 false 就好了。
@RequestMapping("/7")
public String method7(@RequestParam(value = "str", required = false) String s) {
return "接收参数:" + s;
}

@RequestMapping("/8")
public String method8(String[] s) {
return Arrays.toString(s);
}

传递集合需要使用 @RequestParam 用于接收单个请求参数。如果要接收 List 类型,需要显示开启'允许多值'模式,否则 Spring 无法解析。
@RequestMapping("/9")
public List<Integer> method8(@RequestParam List<Integer> num) {
return num;
}


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online