跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Web MVC 入门:从概念到实践

Spring Web MVC 的基本概念及实战应用。首先阐述了 MVC 架构模式及其在 Spring 中的应用,包括 Model、View、Controller 的职责划分。接着详细讲解了 Spring Boot 项目的创建流程,重点分析了@RestController 和@RequestMapping 注解的使用场景,涵盖类级别与方法级别的映射组合,以及 GET 和 POST 请求的限定方式。最后通过 Postman 工具演示了 API 接口的测试方法,包括普通传参、表单数据、JSON 传输以及对象、数组和集合参数的接收技巧,并说明了@RequestParam 注解在参数重命名和可选性设置中的作用。

战神发布于 2026/4/6更新于 2026/9/1168 浏览
Spring Web MVC 入门:从概念到实践

文章配图

一、什么是 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

  1. 建立连接:将用户(浏览器)和 Java 连接起来,访问一个地址可以调用 Spring 程序。
  2. 请求:用户请求一些参数,想办法获取这些参数。
  3. 响应:执行了业务逻辑,把程序执行结果返回给用户。

1. 项目准备

创建项目

点击 New Project 创建新项目。

文章配图

点击 Spring Initializr,没有的话需要自己去下载,随后点击下一步。

文章配图

出现下面的界面。

文章配图

  • 这里注意一下,只能包含小写字母、数字、连字符(-)、下划线、句号(.),不能包含大写字母。

文章配图

文章配图

文章配图

文章配图

文章配图

文章配图

点击启动项目

文章配图

建立连接

我们创建一个类,实现用户与浏览器的交互。

文章配图

代码如下:

@RestController
public class Hello {
    @RequestMapping("/sayhello")
    public String say() {
        return "hello";
    }
}

在浏览器输入网址:127.0.0.1:8080/sayhello 查看结果。

文章配图

  • 127.0.0.1:本地主机地址,表示定位到当前电脑。
  • 8080:是 Spring Boot 应用的默认端口号。表示定位到'电脑上运行的 Spring Boot 程序'。
  • /sayhello:请求路径,接口地址。表示定位带请求支援的位置。
  • http://127.0.0.1:8080/sayhello:表示的就是向本地计算机中的 8080 端口程序,获取资源位置。

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 {
    // 即支持 post,又支持 get
    @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 其中一种呢?应该怎么写。

只用 get

// 只支持 get
// 写法 1
@RequestMapping(value="/2", method = RequestMethod.GET)
public Integer num2() {
    return 2;
}
// 写法 2
@GetMapping("/3")
public Integer num3() {
    return 3;
}

文章配图

只请求 Post

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

文章配图

文章配图

三、Postman

1. 什么是 Postman?

Postman 是一套广泛用于 API 开发、测试和调试的工具,被开发者、测试工具等广泛使用,其核心价值体现在高效、便捷的处理 API 相关工作。

Postman 是 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

如果前后端参数命名不一致,可能会出接收不到的情况,这时候我们可以使用@RequestParam 来重命名前后端参数。

// 将其重命名为 str
@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;
}

文章配图

目录

  1. 一、什么是 Spring Web MVC?
  2. 1. 定义
  3. 2. 关于 MVC
  4. 2.1 什么是 MVC?
  5. 二、学习 Spring MVC
  6. 1. 项目准备
  7. 2. @RestController 注解的介绍
  8. 3. @RequestMapping 注解
  9. 1. @RequestMapping 只用在类上(相当于“只给文件夹起名,不给文件起名”)
  10. 2. @RequestMapping 只用在方法上(相当于“只给文件起名,不给文件夹起名”)
  11. 3. @RequestMapping 用在类和方法上(相当于给文件夹和文件都取名)
  12. 三、Postman
  13. 1. 什么是 Postman?
  14. 2. 关于 API
  15. 3. 传参介绍
  16. 1. 普通传参:通过查询字符串来传参
  17. 2. form-data(完整表示为:multipart/form-data)
  18. 3. x-www-form-urlencoded
  19. 4. raw:可以上传任意格式的文本,比如:text、JavaScript、json、html、xml
  20. 4. 传递参数
  21. 1. 传递单个参数
  22. 2. 传递多个参数
  23. 3. 传递对象
  24. 4. 传递数组
  25. 5. 传递集合

更多推荐文章

查看全部
  • Java 调用 UniHttp 接口参数乱序导致百度 SN 校验失败解决方案
  • Python 实战指南:Web 开发、数据科学与自动化
  • FPGA 工程师职业方向详解:岗位分类与核心能力
  • 基于 Canvas/WebGL/WebRTC 的多维度浏览器指纹隐身实战
  • AI 赋能原则 10 解读:政府 2.0 与公共智能系统建设
  • DeepSeek 结合通义万相实现 AI 视频生成实战指南
  • Neo4j 5.26 版本下载安装配置步骤
  • AI 编程工具选型指南:从 Copilot 到 Trae
  • 字符串模拟题精选:思维与实现解析
  • Docker 部署 MySQL 8.0:镜像拉取、配置与远程访问
  • 基于 Python Django 的衣物捐赠系统设计与实现
  • 三种 AI 编程助手的真实上手体验:Copilot、Cursor 与 JetBrains
  • OpenClaw 插件更新:支持配置 QQ 与飞书机器人
  • Spring AI 开发 MCP Server 与 MCP Client(SSE 方式)
  • OpenAI 指控 DeepSeek 非法蒸馏,字节发布 Seedance 2.0,Java 26 预览版上线
  • Spring Boot 中的 Service 层怎么落地
  • OCLP-Mod 使用教程:老旧 Mac 升级最新 macOS
  • DeepSeek 结合通义万相制作 AI 视频实战指南
  • Lostlife2.0 整合 LLama-Factory 引擎重塑 NPC 对话逻辑
  • 大模型应用优化:提示工程、RAG 与微调等 5 种方法

相关免费在线工具

  • 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