跳到主要内容Spring Web MVC 核心概念与实战指南 | 极客日志Javajava
Spring Web MVC 核心概念与实战指南
Spring Web MVC 基于 Servlet API,通过 MVC 模式解耦业务逻辑与界面展示。内容涵盖项目搭建、核心注解(如 RequestMapping)、请求参数处理(含 JSON 与文件上传)、会话管理(Cookie/Session)及响应控制。结合加法计算器、登录系统及图书管理等实战案例,演示了从基础配置到企业级开发规范的完整流程,并介绍了 Postman 接口测试与 Lombok 工具的使用,帮助开发者快速掌握后端 Web 开发技能。
Spring Web MVC 核心概念与实战指南
1. Spring Web MVC 核心概念
1.1 什么是 Spring Web MVC
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,正式名称来源于源模块(spring-webmvc),通常简称为 Spring MVC。它从 Spring 框架诞生之初就包含在内,为 Java Web 应用提供了完整的解决方案。
Servlet 定义了动态页面开发的技术标准,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,而是实现它的便捷方式。Spring Boot 如同功能完备的厨房,而 Spring MVC 则是其中的燃气灶。Boot 简化配置,MVC 负责核心 Web 功能。
| 特性 | Spring MVC | Spring Boot |
|---|
| 本质 | Web 框架 | 快速开发脚手架 |
| 核心作用 | 处理 Web 请求与响应 | 简化配置与部署 |
| 依赖关系 | 可独立使用 | 集成 Spring MVC |
2. 项目搭建与环境配置
2.1 项目创建步骤
推荐使用 Spring Boot 方式创建项目:
- 新建 Spring Boot 项目,选择 3.2.0 及以上版本。
- 勾选 Spring Web 模块(即 Spring MVC 核心依赖)。
- 配置基本信息(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 {
@RequestMapping("/sayHi")
public String sayHi() {
return "hello, Spring MVC";
}
}
- 类级注解:设置请求路径前缀。
- 方法级注解:设置具体路径,支持多层结构。
- 注意:URL 路径前是否加
/ 不影响访问,但请求方式(GET/POST)需唯一。
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/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;
}
多个参数同时接收时,顺序不影响绑定,只要参数名匹配即可。
4.2 复杂参数处理
4.2.1 对象参数接收
参数较多时可封装为实体类,Spring 自动按属性名绑定:
public class Person {
private String name;
private String password;
private int age;
}
@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);
}
@RequestMapping("/r8")
public String r8(@RequestParam List<String> names) {
return "接收到的参数 names = " + names;
}
未使用 @RequestParam 可能导致 500 错误。
4.3 传递 JSON 数据
JSON 是轻量级文本数据格式,广泛用于前后端交互。
4.3.1 JSON 语法要点
- Key 必须用双引号包裹。
- 不支持注释。
- 结构包括对象
{} 和数组 []。
4.3.2 JSON 与 Java 互转
Spring Web 默认集成 Jackson,无需额外引入:
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(person);
Person p = objectMapper.readValue(json, Person.class);
4.3.3 后端接收 JSON
需通过 @RequestBody 注解绑定请求正文:
@RequestMapping("/r9")
public String r9(@RequestBody Person person) {
return "接收到的参数 person = " + person;
}
前端请求头需设置 Content-Type: application/json。
4.4 文件上传
@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 目录";
}
4.5 Cookie 与 Session 会话管理
4.5.1 Cookie 操作
可通过 HttpServletRequest 获取,或使用 @CookieValue 注解:
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue("class") String className) {
return "获取 Cookie 成功 className:" + className;
}
4.5.2 Session 操作
Session 存储在服务器端,客户端通过 SessionID 关联。
@RequestMapping("/setSession")
public String setSession(HttpSession session) {
session.setAttribute("name", "zhangsan");
return "设置 Session 成功";
}
@RequestMapping("/getSession")
public String getSession(HttpSession session) {
String name = (String) session.getAttribute("name");
return "name:" + name;
}
@RequestMapping("/getHeader")
public String getHeader(@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;
}
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response) {
response.setStatus(401);
return "设置状态码成功";
}
6. 综合项目实战
6.1 加法计算器
@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;
}
}
6.3 图书管理系统
展示列表、修改、删除功能,结合 AJAX 进行前端渲染。
7. 开发工具与效率提升
7.1 Postman 接口测试
Postman 是常用的接口测试工具,支持多种请求方式和参数类型,无需编写前端代码即可验证后端逻辑。
7.2 Lombok 简化开发
Lombok 通过注解自动生成 getter/setter 等冗余代码:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private int id;
private String name;
}
8. 企业开发规范
- 命名规范:类名大驼峰,方法/变量小驼峰,包名全小写。
- 代码格式:4 空格缩进,关键逻辑添加注释,逻辑块间留空行。
- 注解使用:属性多时单独一行,优先使用组合注解(如
@RestController)。
相关免费在线工具
- 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