跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

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

Spring Web MVC 基于 Servlet API 构建,是 Spring 框架处理 Web 请求的核心模块。深入解析 MVC 设计模式在 Spring 中的实现,涵盖 Controller、Model、View 的职责划分。内容包含项目快速搭建、常用注解(如 RequestMapping、RequestBody)的应用详解,以及参数接收、JSON 数据交互、文件上传等实战场景。此外还涉及 Cookie、Session 会话管理及响应状态码设置。通过加法计算器、登录系统等案例,展示企业级开发规范与工具使用(Postman、Lombok),帮助开发者掌握从入门到实战的全流程技能。

星落发布于 2026/3/30更新于 2026/4/253 浏览
Spring Web MVC 核心概念与实战指南

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

1. 核心概念解析

1.1 什么是 Spring Web MVC

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

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

1.2 MVC 设计模式深度解析

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

  • Model(模型):处理数据逻辑和业务逻辑,包含数据的存储、处理和运算。
  • View(视图):负责数据展示和接收用户操作,如 HTML 页面。
  • Controller(控制器):作为桥梁,接收请求,选择模型处理,并将结果返回视图。

类比理解:以饭店就餐为例,服务员(View)接待顾客,前厅(Controller)分配订单给后厨,后厨(Model)制作菜品。

MVC 定义图

1.3 Spring MVC 与 Spring Boot 的关系

Spring Boot 并非替代 Spring MVC,而是实现它的便捷方式。Boot 简化了配置与部署,而 MVC 仍是处理 Web 请求的核心。

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

2. 项目搭建与环境配置

2.1 创建步骤

直接用 Spring Initializr 生成项目最省事:

  1. 新建 Spring Boot 项目,推荐版本 3.2.0 及以上。
  2. 勾选 Spring Web 模块(即核心依赖)。
  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 路径最前是否加 / 不影响访问,但路径 + 请求方式必须唯一。

3.2 请求参数接收

3.2.1 @RequestParam 参数重命名

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

@RequestMapping("/r6")
public String r6(@RequestParam(value = "sa", required = false) String resouce) {
    return "接收到 resouce = " + resouce;
}
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 基础参数传递

直接通过方法参数接收前端参数,名称需一致。

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

多个参数同时接收时,顺序不影响绑定结果:

@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 JSON 语法要点
  • Key 必须用双引号包裹。
  • 不支持注释(部分工具除外)。
  • 结构包括对象 {} 和数组 []。
4.3.2 对象互转工具

Spring Web 依赖已集成 jackson-databind,使用 ObjectMapper 即可。

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

public class JSONTests {
    private static ObjectMapper objectMapper = new ObjectMapper();
    
    public static void main(String[] args) throws Exception {
        Person person = new Person();
        person.setName("zhangsan");
        person.setAge(18);
        
        // 对象转 JSON
        String jsonStr = objectMapper.writeValueAsString(person);
        System.out.println(jsonStr);
        
        // JSON 转对象
        Person p = objectMapper.readValue(jsonStr, 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 文件上传功能

使用 @RequestPart 或 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 会话管理

Cookie 存储在客户端,Session 存储在服务器端。

4.5.1 Cookie 操作

可通过 HttpServletRequest 获取,或使用 @CookieValue 注解。

@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request, HttpServletResponse response) {
    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 区分用户。

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

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

4.6 获取 Header

使用 @RequestHeader 注解可方便地获取请求头信息。

@RequestMapping("/getHeader")
public String getHeader(@RequestHeader("User-Agent") String userAgent) {
    return "User-Agent: " + 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");
    map.put("MySQL", "MySQL Value");
    return map;
}

5.3 状态码与 Header 设置

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

6. 综合项目实战

6.1 加法计算器

  • 路径:/calc/sum
  • 参数:num1, num2
@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 ("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 userName != null ? userName : "";
    }
}

7. 开发工具与效率提升

7.1 Postman 接口测试

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

7.2 Lombok 简化开发

Lombok 通过注解自动生成 getter/setter 等冗余代码。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

常用注解:

  • @Data:生成 getter/setter、toString 等方法。
  • @NoArgsConstructor / @AllArgsConstructor:构造方法。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private int id;
    private String name;
    private String password;
}

8. 企业开发规范

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

  1. 命名规范:类名大驼峰,方法名小驼峰,包名全小写。
  2. 代码格式:缩进 4 个空格,关键逻辑添加注释。
  3. 注解使用:优先使用组合注解(如 @RestController)。

目录

  1. Spring Web MVC 核心概念与实战指南
  2. 1. 核心概念解析
  3. 1.1 什么是 Spring Web MVC
  4. 1.2 MVC 设计模式深度解析
  5. 1.3 Spring MVC 与 Spring Boot 的关系
  6. 2. 项目搭建与环境配置
  7. 2.1 创建步骤
  8. 2.2 核心依赖
  9. 3. 核心注解与应用
  10. 3.1 路由映射 @RequestMapping
  11. 3.2 请求参数接收
  12. 3.2.1 @RequestParam 参数重命名
  13. 3.2.2 @PathVariable 路径参数
  14. 3.3 响应处理
  15. 4. 请求处理全场景实战
  16. 4.1 基础参数传递
  17. 4.2 复杂参数处理
  18. 4.2.1 对象参数接收
  19. 4.2.2 数组与集合参数
  20. 4.3 传递 JSON 数据
  21. 4.3.1 JSON 语法要点
  22. 4.3.2 对象互转工具
  23. 4.3.3 后端接收 JSON
  24. 4.4 文件上传功能
  25. 4.5 Cookie 与 Session 会话管理
  26. 4.5.1 Cookie 操作
  27. 4.5.2 Session 操作
  28. 4.6 获取 Header
  29. 5. 响应处理高级应用
  30. 5.1 静态页面返回
  31. 5.2 JSON 数据响应
  32. 5.3 状态码与 Header 设置
  33. 6. 综合项目实战
  34. 6.1 加法计算器
  35. 6.2 用户登录系统
  36. 7. 开发工具与效率提升
  37. 7.1 Postman 接口测试
  38. 7.2 Lombok 简化开发
  39. 8. 企业开发规范
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 选择结构详解:if 语句与三元运算符
  • 大模型基础面试知识全解析:架构、训练与微调策略
  • 基于 OpenCvSharp 的无人机图像拼接技术指南
  • JUnit NoSuchMethodError 报错及 Spring Boot 版本兼容修复方案
  • Java 二分查找算法实战:从基础到进阶
  • 主流 API 接口管理与调试工具实战指南
  • DeepSeek 各版本演进历程与核心特性对比
  • DISC-FinLLM:金融领域大语言模型及多专家系统解析
  • 开源医疗大模型排行榜:健康领域基准测试与评估
  • Java 统计子字符串在父字符串中的出现次数
  • 前端 CI/CD 流程与自动化部署实践
  • Vheer:免费免登录的 AI 绘画与视频生成工具
  • KoboldAI 安装与配置指南
  • Prompt 驱动的结构化抽取:从非结构化文本高效提取表格
  • AI 绘画技术解析:Stable Diffusion 原理入门
  • Llama-3.2-3B 代码审查:基于 Java 面试题的质量评估体系
  • 无线蜂窝网络:核心原理、架构与代际演进
  • 医学统计学基础概念与 Python 数据分析实践
  • 本地部署 ComfyUI 运行 Stable Diffusion 3.5-FP8
  • 基于 Spring Boot 的智行无忧停车场管理系统设计与实现

相关免费在线工具

  • 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