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)制作菜品。

1.3 Spring MVC 与 Spring Boot 的关系
Spring Boot 并非替代 Spring MVC,而是实现它的便捷方式。Boot 简化了配置与部署,而 MVC 仍是处理 Web 请求的核心。
| 特性 | Spring MVC | Spring Boot |
|---|---|---|
| 本质 | Web 框架 | 快速开发脚手架 |
| 核心作用 | 处理 Web 请求与响应 | 简化配置与部署 |
| 依赖关系 | 可独立使用 | 集成 Spring MVC |
2. 项目搭建与环境配置
2.1 创建步骤
直接用 Spring Initializr 生成项目最省事:
- 新建 Spring Boot 项目,推荐版本 3.2.0 及以上。
- 勾选 Spring Web 模块(即核心依赖)。
- 配置基本信息(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. 企业开发规范
遵循规范可提升代码可读性和维护性:
- 命名规范:类名大驼峰,方法名小驼峰,包名全小写。
- 代码格式:缩进 4 个空格,关键逻辑添加注释。
- 注解使用:优先使用组合注解(如
@RestController)。


