跳到主要内容Spring Web MVC 核心概念与实战指南 | 极客日志Javajava
Spring Web MVC 核心概念与实战指南
综述由AI生成Spring Web MVC 基于 Servlet API,通过 MVC 模式解耦业务逻辑与界面展示。内容涵盖项目搭建、核心注解(如 RequestMapping)、请求参数处理(含 JSON 与文件上传)、会话管理(Cookie/Session)及响应控制。结合加法计算器、登录系统及图书管理等实战案例,演示了从基础配置到企业级开发规范的完整流程,并介绍了 Postman 接口测试与 Lombok 工具的使用,帮助开发者快速掌握后端 Web 开发技能。
CodeArtist9 浏览 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