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

Spring Web MVC 核心概念与实战指南

Spring Web MVC 基于 Servlet API 构建,是 Spring 框架中处理 Web 请求的核心组件。涵盖 MVC 设计模式解析、项目搭建流程、常用注解(如 @RequestMapping、@RequestBody)的应用细节,以及参数接收、JSON 交互、文件上传和会话管理(Cookie/Session)等实战场景。通过加法计算器、登录系统及图书管理等案例,演示了从基础配置到企业级开发规范的完整链路,帮助开发者快速掌握后端接口开发与数据交互逻辑。

abccba发布于 2026/3/23更新于 2026/10/22102 浏览
Spring Web MVC 核心概念与实战指南

Spring Web MVC 核心概念与实战指南

1. 核心概念:Spring Web MVC 是什么

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。其正式名称来源于源模块(spring-webmvc),通常简称为 Spring MVC。

官方定义:Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning.

Servlet 是 Java Web 开发的规范,定义了动态页面开发的技术标准。Tomcat、Weblogic 等容器则是该规范的具体实现。Spring MVC 基于 Servlet 规范,为 Web 应用提供了完整的解决方案。

1.1 MVC 设计模式深度解析

MVC(Model View Controller)将软件系统分为模型、视图和控制器三个部分,实现业务逻辑与界面展示的解耦。

1.1.1 三大组件职责
  • Model(模型):应用程序的主体,负责数据逻辑和业务处理。
  • View(视图):用户交互界面,负责展示数据和接收操作。
  • Controller(控制器):桥梁,接收请求,协调模型处理,返回结果给视图。
1.1.2 类比理解

以饭店就餐为例:

  • 服务员(View):接待顾客、记录点餐、上菜。
  • 前厅(Controller):接收订单,分配给后厨。
  • 后厨(Model):制作菜品,处理核心业务。

1.2 Spring MVC 与 Spring Boot 的关系

Spring Boot 并非替代 Spring MVC,而是实现它的便捷方式。两者关系如下表:

特性Spring MVCSpring Boot
本质Web 框架,实现 MVC 模式快速开发脚手架
核心作用处理 Web 请求与响应简化配置与部署
依赖关系可独立使用集成 Spring MVC

类比来说,Spring Boot 像是一个功能完备的厨房,而 Spring MVC 则是其中实现烹饪功能的燃气灶。厨房(Boot)通过配置工具实现多种功能,但烹饪(Web 开发)的核心依赖于灶具(MVC)。

2. 项目搭建与环境配置

2.1 创建步骤

Spring MVC 项目通常通过 Spring Boot 快速创建:

  1. 新建 Spring Boot 项目,推荐版本 3.2.0 及以上。
  2. 勾选 Spring Web 模块(即 Spring MVC 核心依赖)。
  3. 配置基本信息(Group、Artifact 等),完成初始化。

2.2 核心依赖

创建后的 pom.xml 会自动引入核心依赖:

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

该依赖包含了 Spring MVC 核心组件、Servlet API 及 Tomcat 嵌入式容器,无需额外配置即可开发。

3. 核心注解与应用

3.1 路由映射 @RequestMapping

这是最基础的路由注解,用于关联 URL 与 Java 方法。

@RestController
@RequestMapping("/user")
public class UserController {
    // 完整访问路径:/user/sayHi
    @RequestMapping("/sayHi")
    public String sayHi() {
        return "hello, Spring MVC";
    }
}
  • 类级注解:设置请求路径前缀。
  • 方法级注解:设置具体路径,支持多层结构。
  • 注意:URL 路径最前是否加 / 不影响访问,Spring 会自动补全。

3.2 请求参数接收

3.2.1 @RequestParam 参数重命名

解决前后端参数名不一致问题,并可设置必传:

@RequestMapping("/r6")
public String r6(@RequestParam(value = "sa", required = false) String resouce) {
    return "接收到 resouce = " + resouce;
}
  • value:指定前端参数名。
  • required:默认 true,设为 false 则非必传。
3.2.2 @PathVariable 路径参数

适用于 RESTful 风格接口,从 URL 中提取参数:

@RequestMapping("/r11/{articleId}/{type}")
public String r11(@PathVariable("articleId") Integer id, @PathVariable String type) {
    return "articleId = " + id + ", type = " + type;
}

访问示例:http://127.0.0.1:8080/param/r11/5/zhangsan

3.3 响应处理

  • @ResponseBody:标识返回数据而非视图。
  • @RestController:组合注解(@Controller + @ResponseBody),类中所有方法默认返回数据。
// 返回视图
@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }
}

// 返回数据
@RestController
public class DataController {
    @RequestMapping("/data")
    public String getData() {
        return "这是返回的数据内容";
    }
}

4. 请求处理全场景实战

4.1 基础参数传递

4.1.1 单个参数接收

参数名需与请求参数一致:

@RequestMapping("/r1")
public String r1(String name) {
    return "接收到参数 name = " + name;
}

访问:http://127.0.0.1:8080/request/r1?name=zhangsan

4.1.2 多个参数接收

顺序不影响绑定,只要参数名匹配:

@RequestMapping("/r4")
public String r4(String name, String password, Integer age) {
    return "name=" + name + ", password=" + password + ", age=" + age;
}

4.2 复杂参数处理

4.2.1 对象参数接收

参数较多时封装为实体类,Spring 自动按属性名绑定:

public class Person {
    private String name;
    private String password;
    private int age;
    // getter/setter 省略
}

@RequestMapping("/r5")
public String r5(Person person) {
    return "接收到参数 person = " + person;
}
4.2.2 数组与集合

数组参数直接接收:

@RequestMapping("/r7")
public String r7(String[] names) {
    return "names = " + Arrays.toString(names);
}

集合参数需配合 @RequestParam:

@RequestMapping("/r8")
public String r8(@RequestParam List<String> names) {
    return "names = " + names;
}

4.3 传递 JSON 数据

JSON 是轻量级文本数据格式,广泛用于前后端交互。

4.3.1 语法要点
  • Key 必须用双引号包裹。
  • 不支持注释。
  • 结构包括对象 {} 和数组 []。
4.3.2 对象互转

Spring Web 依赖已集成 jackson-databind,无需额外引入:

package cn.overthinker.springboot;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JSONTests {
    private static ObjectMapper objectMapper = new ObjectMapper();

    public static void main(String[] args) throws JsonProcessingException {
        Person person = new Person();
        person.setName("zhangsan");
        person.setAge(18);
        
        // 对象转 JSON
        String jsonStr = objectMapper.writeValueAsString(person);
        System.out.println(jsonStr);
        
        // JSON 转对象
        String json = "{\"name\":\"zhangsan\",\"age\":18}";
        Person p = objectMapper.readValue(json, Person.class);
        System.out.println(p);
    }
}
4.3.3 后端接收 JSON

前端需设置 Content-Type: application/json,后端使用 @RequestBody:

@RequestMapping("/r9")
public String r9(@RequestBody Person person) {
    return "接收到的参数 person = " + person;
}

4.4 文件上传

使用 MultipartFile 处理:

@RequestMapping("/r12")
public String r12(MultipartFile file) throws IOException {
    // 获取原始文件名
    String originalFilename = file.getOriginalFilename();
    // 保存文件
    File destFile = new File("D:/temp/" + originalFilename);
    file.transferTo(destFile);
    return "文件已保存至 D:/temp 目录";
}

4.5 Cookie 与 Session

4.5.1 Cookie 操作

可通过 HttpServletRequest 或 @CookieValue 获取:

@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + ":" + cookie.getValue());
        }
    }
    return "获取 Cookie 成功";
}
4.5.2 Session 操作

Session 存储在服务器端,客户端仅持有 SessionID。

// 设置 Session
@RequestMapping("/setSession")
public String setSession(HttpSession session) {
    session.setAttribute("name", "zhangsan");
    session.setAttribute("age", 20);
    return "设置 Session 成功";
}

// 获取 Session
@RequestMapping("/getSession")
public String getSession(HttpSession session) {
    String name = (String) session.getAttribute("name");
    return "name: " + name;
}

注意:Session 基于 SessionID 区分用户。若交换不同浏览器的 SessionID,对应的会话数据也会随之切换。

4.6 获取 Header

// 方案一:HttpServletRequest
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request) {
    String userAgent = request.getHeader("User-Agent");
    return "userAgent: " + userAgent;
}

// 方案二:@RequestHeader
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent) {
    return "userAgent: " + userAgent;
}

5. 响应处理高级应用

5.1 静态页面返回

需使用 @Controller 并返回视图路径,静态资源放在 resources/static 下:

@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index() {
        return "/index.html";
    }
}

5.2 JSON 数据响应

Spring MVC 可自动将对象转换为 JSON:

@ResponseBody
@RequestMapping("/returnJson")
public HashMap<String, String> returnJson() {
    HashMap<String, String> map = new HashMap<>();
    map.put("Java", "Java Value");
    return map;
}

5.3 状态码与 Header 设置

@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response) {
    response.setStatus(401); // 未授权
    return "设置状态码成功";
}

@RequestMapping("/setHeader")
public String setHeader(HttpServletResponse response) {
    response.setHeader("MyHeader", "MyHeaderValue");
    return "设置 Header 成功";
}

6. 综合项目实战

6.1 加法计算器

  • 路径:/calc/sum
  • 逻辑:接收两个数字,返回计算结果 HTML。
@RestController
@RequestMapping("/calc")
public class CalcController {
    @RequestMapping("/sum")
    public String sum(Integer num1, Integer num2) {
        Integer result = num1 + num2;
        return "<h1>计算结果:" + result + "</h1>";
    }
}

6.2 用户登录系统

核心功能:账号校验、Session 保持、显示当前用户。

@RestController
@RequestMapping("/user")
public class LoginController {
    @RequestMapping("/login")
    public boolean login(String userName, String password, HttpSession session) {
        if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {
            return false;
        }
        // 模拟校验
        if ("zhangsan".equals(userName) && "123456".equals(password)) {
            session.setAttribute("userName", userName);
            return true;
        }
        return false;
    }

    @RequestMapping("/getLoginUser")
    public String getLoginUser(HttpSession session) {
        String userName = (String) session.getAttribute("userName");
        return StringUtils.hasLength(userName) ? userName : "";
    }
}

6.3 图书管理系统

包含列表展示、状态处理等。前端通过 AJAX 调用 /book/getList 接口渲染表格。

7. 开发工具与效率提升

7.1 Postman 接口测试

Postman 是常用的接口测试工具,支持多种请求方式和参数类型,无需编写前端代码即可验证后端逻辑。

7.2 Lombok 简化开发

Lombok 通过注解自动生成 Getter/Setter 等方法,减少样板代码。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private int id;
    private String name;
    private String password;
}

8. 企业开发规范

遵循规范可提升代码可读性和维护性:

  1. 命名规范:类名大驼峰,方法名小驼峰,包名全小写。
  2. 代码格式:缩进 4 空格,关键逻辑添加注释。
  3. 注解使用:属性多时分行书写,优先使用组合注解。

9. 参考资料

  • Spring MVC 官方文档
  • Spring Boot 官方文档

目录

  1. Spring Web MVC 核心概念与实战指南
  2. 1. 核心概念:Spring Web MVC 是什么
  3. 1.1 MVC 设计模式深度解析
  4. 1.1.1 三大组件职责
  5. 1.1.2 类比理解
  6. 1.2 Spring MVC 与 Spring Boot 的关系
  7. 2. 项目搭建与环境配置
  8. 2.1 创建步骤
  9. 2.2 核心依赖
  10. 3. 核心注解与应用
  11. 3.1 路由映射 @RequestMapping
  12. 3.2 请求参数接收
  13. 3.2.1 @RequestParam 参数重命名
  14. 3.2.2 @PathVariable 路径参数
  15. 3.3 响应处理
  16. 4. 请求处理全场景实战
  17. 4.1 基础参数传递
  18. 4.1.1 单个参数接收
  19. 4.1.2 多个参数接收
  20. 4.2 复杂参数处理
  21. 4.2.1 对象参数接收
  22. 4.2.2 数组与集合
  23. 4.3 传递 JSON 数据
  24. 4.3.1 语法要点
  25. 4.3.2 对象互转
  26. 4.3.3 后端接收 JSON
  27. 4.4 文件上传
  28. 4.5 Cookie 与 Session
  29. 4.5.1 Cookie 操作
  30. 4.5.2 Session 操作
  31. 4.6 获取 Header
  32. 5. 响应处理高级应用
  33. 5.1 静态页面返回
  34. 5.2 JSON 数据响应
  35. 5.3 状态码与 Header 设置
  36. 6. 综合项目实战
  37. 6.1 加法计算器
  38. 6.2 用户登录系统
  39. 6.3 图书管理系统
  40. 7. 开发工具与效率提升
  41. 7.1 Postman 接口测试
  42. 7.2 Lombok 简化开发
  43. 8. 企业开发规范
  44. 9. 参考资料

更多推荐文章

查看全部
  • Docker 部署 OpenClaw 本地 AI 引擎及智谱 AI 配置指南
  • FPGA 入门实战:基于 Quartus 点亮 LED 灯
  • STL RB-tree 红黑树原理与插入操作实现详解
  • Windows 环境下 faster-whisper 部署:CUDA 加速与 PyAV 依赖配置
  • Python RESTful API 设计:从理论到企业级实战
  • C++ 中间件 spdlog 日志库介绍与二次封装
  • OpenClaw 开源 AI 代理框架详解:功能升级与生态接入
  • 提示词、Agent、MCP、Skill 详解:AI 核心概念解析
  • C# 与 C++ 开发的 OPC DA SERVER 软件实践
  • 国产摄像机 ISP 图像调试、FPGA 开发及算法工程师招聘
  • C++ Linux 环境下内存泄漏检测方式
  • Flutter 三方库 ml_algo 在鸿蒙系统下的端侧机器学习适配指南
  • IntelliJ IDEA 切换 Git 用户配置详解
  • Kubernetes 集群管理与核心组件详解
  • Bun 运行时:比 Node.js 更快的 JavaScript 开发新选择
  • AI 产品经理职业发展路径与核心技术能力解析
  • 大语言模型词表裁剪的实现思路与代码
  • C++ 网络编程中的序列化和反序列化实现
  • Java 面向对象入门:类、对象与封装核心详解
  • OpenClaw 开源 AI 智能体框架解析与部署指南

相关免费在线工具

  • 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