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

Spring Web MVC 核心概念与实战

Spring Web MVC 基于 Servlet API 构建,是 Spring 框架中的核心 Web 解决方案。深入解析 MVC 设计模式及其在 Spring 中的职责分工,对比了 Spring MVC 与 Spring Boot 的关系。内容涵盖项目搭建、核心注解(如 RequestMapping、RequestParam、RequestBody)的应用,以及参数接收、JSON 数据处理、文件上传、会话管理(Cookie/Session)等实战场景。通过加法计算器、登录系统等案例演示了完整开发流程,并介绍了 Postman 测试与 Lombok 提效工具,最后总结了企业级开发规范。

路由之心发布于 2026/4/10更新于 2026/10/22104 浏览
Spring Web MVC 核心概念与实战

Spring Web MVC 核心概念

什么是 Spring Web MVC

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,正式名称来源于源模块(spring-webmvc),通常简称为 Spring MVC。Servlet 是 Java Web 开发的规范,定义了动态页面开发的技术标准,而 Tomcat、Weblogic 等容器则是该规范的具体实现。

MVC 设计模式深度解析

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

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

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

Spring MVC 与 Spring Boot 的关系

Spring Boot 并非替代 Spring MVC,而是实现它的便捷方式。Spring Boot 如同功能完备的厨房,Spring MVC 则是其中实现烹饪功能的燃气灶。Boot 简化了配置与部署,但 Web 功能的核心仍依赖 MVC。

特性Spring MVCSpring Boot
本质Web 框架快速开发脚手架
核心作用处理 Web 请求与响应简化配置与部署
发布时间2004 年2014 年

项目搭建与环境配置

项目创建步骤

推荐使用 Spring Boot 3.2.0 及以上版本创建项目:

  1. 新建 Spring Boot 项目。
  2. 勾选 Spring Web 模块(即 Spring MVC 核心依赖)。
  3. 配置基本信息完成创建。
核心依赖说明

pom.xml 中会自动引入以下依赖,它包含了 Spring MVC 核心组件、Servlet API 及嵌入式 Tomcat:

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

无需额外配置即可实现 Web 功能开发。

核心注解与应用

路由映射 @RequestMapping

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



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

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

@RequestMapping("/r6")
public String r6(@RequestParam(value = "sa", required = false) String resouce) {
    return "接收到 resouce = " + resouce;
}

@PathVariable:从 URL 路径中提取参数,适用于 RESTful 风格。

@RequestMapping("/r11/{articleId}/{type}")
public String r11(@PathVariable("articleId") Integer id, @PathVariable String type) {
    return "articleId = " + id + ", type = " + type;
}
响应处理
  • @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 "这是返回的数据内容";
    }
}

请求处理全场景实战

基础参数传递

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

@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;
}
复杂参数处理

当参数较多时,可封装为实体类接收,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;
}

数组与集合参数: 数组参数可直接接收,集合参数需配合 @RequestParam。

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

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

JSON 是一种轻量级的文本数据交互格式,基于 ECMAScript 规范,核心优势是跨平台兼容、结构灵活且安全性高。

JSON 语法要点:

  • Key 必须用双引号包裹。
  • 不同数据之间用逗号分隔,末尾不可加多余逗号。
  • 字符串类型值需用双引号包裹,数字、布尔值无需包裹。

对象互转工具:Spring Web 依赖已集成 jackson-databind,使用 ObjectMapper 类。

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 s = objectMapper.writeValueAsString(person);
        System.out.println(s);
        
        // json 字符串转对象
        String json = "{\"name\":\"zhangsan\",\"age\":18}";
        Person person1 = objectMapper.readValue(json, Person.class);
        System.out.println(person1);
    }
}

后端接口实现:使用 @RequestBody 注解绑定请求正文。

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

注意:发送 JSON 请求时需设置 Header Content-Type: application/json。

文件上传功能

使用 MultipartFile 处理文件上传。

@RequestMapping("/r12")
public String r12(MultipartFile file) throws IOException {
    // 获取原始文件名
    System.out.println("文件原始名称:" + file.getOriginalFilename());
    // 保存文件
    File destFile = new File("D:/temp/" + file.getOriginalFilename());
    file.transferTo(destFile);
    return "接受到文件,已保存至 D:/temp 目录";
}
Cookie 与 Session 会话管理

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

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 成功";
}

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

若交换 SessionID,对应的 Session 数据也会随之切换,说明 Session 是基于服务器端的会话标识来区分用户的。

响应处理高级应用

静态页面返回

需使用 @Controller 注解,静态页面放置在 resources/static 目录下。

@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index() {
        return "/index.html";
    }
}
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;
}
状态码与 Header 设置
@RequestMapping("/setStatus")
@ResponseBody
public String setStatus(HttpServletResponse response) {
    response.setStatus(401); // 未授权
    return "设置状态码成功";
}

综合项目实战

加法计算器
  • 接口:/calc/sum
  • 代码:
@RestController
@RequestMapping("/calc")
public class CalcController {
    @RequestMapping("/sum")
    public String sum(Integer num1, Integer num2) {
        Integer sum = num1 + num2;
        return "<h1>计算结果:" + sum + "</h1>";
    }
}
用户登录系统

核心功能包括账号校验、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;
    }
}

开发工具与效率提升

Postman 接口测试

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

Lombok 简化开发

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

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

企业开发规范

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

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

目录

  1. Spring Web MVC 核心概念
  2. 什么是 Spring Web MVC
  3. MVC 设计模式深度解析
  4. Spring MVC 与 Spring Boot 的关系
  5. 项目搭建与环境配置
  6. 项目创建步骤
  7. 核心依赖说明
  8. 核心注解与应用
  9. 路由映射 @RequestMapping
  10. 请求参数接收
  11. 响应处理
  12. 请求处理全场景实战
  13. 基础参数传递
  14. 复杂参数处理
  15. 传递 JSON 数据
  16. 文件上传功能
  17. Cookie 与 Session 会话管理
  18. 响应处理高级应用
  19. 静态页面返回
  20. JSON 数据响应
  21. 状态码与 Header 设置
  22. 综合项目实战
  23. 加法计算器
  24. 用户登录系统
  25. 开发工具与效率提升
  26. Postman 接口测试
  27. Lombok 简化开发
  28. 企业开发规范

更多推荐文章

查看全部
  • AI 应用开发不仅是调接口:从面试看技术深度与工程实践
  • 大模型 Token 机制与上下文窗口管理实战
  • 大模型技术学习与发展的路径梳理
  • Java ID 生成策略全面解析:从单机到分布式最佳实践
  • UI UX Pro Max:让 AI 编码助手具备专业前端设计能力
  • LLM 继续预训练(Continue Pretrain)实践指南与经验总结
  • 深入理解哈希表:原理、源码与设计哲学
  • C++ 笔试刷题 Day 9:数字格式化、跳台阶与扑克牌顺子
  • Python 基础核心知识点详解:从数据类型到面向对象编程
  • Python 高效读取数据文件指定行数方法
  • C++ 入门基础:历史渊源、应用场景与学习建议
  • 2026 年 3 月全球 AI 前沿动态与产业落地洞察
  • Windows 系统下 Java JDK 下载与安装配置
  • LLM 大模型技术实战:Prompt 提示工程策略与技巧总结
  • Mac 本地大模型部署实战:Ollama 与 ChatBox 配置指南
  • ES6 核心语法全解析:let 到 Async-Await 实战避坑指南
  • NativePHP for Mobile v3 发布:PHP 零成本构建原生移动应用
  • 基于 AI 辅助的 Java 在线图书借阅平台开发实践
  • Windows 多版本 JDK 配置及 JAVA_HOME 切换失效排查
  • 云边端一体化解析: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