跳到主要内容
Spring Web MVC 核心概念与实战指南 | 极客日志
Java java
Spring Web MVC 核心概念与实战指南 Spring Web MVC 是基于 Servlet 规范的经典 Web 框架。本文涵盖 MVC 模式解析、Spring Boot 项目搭建、核心注解用法、请求参数接收(含 JSON 与文件上传)、Cookie/Session 会话管理及响应处理。通过加法计算器、用户登录及图书管理等实战案例,演示企业级开发规范与常用工具的应用,帮助开发者快速掌握后端接口开发与调试技巧。
Spring Web MVC 核心概念与实战指南
1. 核心概念解析
1.1 什么是 Spring Web MVC
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,正式名称来源于源模块 spring-webmvc。它从 Spring 框架诞生之初就包含在内,为 Java Web 应用提供了完整的解决方案。
Servlet 定义了动态页面开发的技术标准,Tomcat、WebLogic 等容器则是具体实现。Spring MVC 在此基础上封装了请求处理流程,让开发者能更专注于业务逻辑。
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 MVC 负责处理 Web 请求的核心逻辑,而 Spring Boot 则像是一个功能完备的厨房,通过自动配置让烹饪(开发)更便捷。
特性 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 中会自动引入以下依赖,无需额外配置即可运行 Web 服务:
<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 "id: " + 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;
}
多个参数 @RequestMapping("/r4")
public String r4 (String name, String password, Integer age) {
return "name: " + name + ", age: " + age;
}
4.2 复杂参数处理
对象参数接收 参数较多时,封装为实体类,Spring 按属性名自动绑定。
public class Person {
private String name;
private int age;
}
@RequestMapping("/r5")
public String r5 (Person person) {
return "person = " + person;
}
数组与集合 数组可直接接收,集合需配合 @RequestParam。
@RequestMapping("/r7")
public String r7 (String[] names) {
return Arrays.toString(names);
}
@RequestMapping("/r8")
public String r8 (@RequestParam List<String> names) {
return names.toString();
}
4.3 JSON 数据处理 JSON 是轻量级数据交换格式,跨平台兼容性好。Spring MVC 默认集成 Jackson 工具包。
4.3.1 对象互转 使用 ObjectMapper 进行序列化和反序列化。
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONTests {
private static ObjectMapper objectMapper = new ObjectMapper ();
public void test () throws Exception {
Person p = new Person ();
p.setName("zhangsan" );
String json = objectMapper.writeValueAsString(p);
Person p1 = objectMapper.readValue(json, Person.class);
}
}
4.3.2 接收 JSON 请求 后端需使用 @RequestBody 注解绑定请求正文,并设置 Content-Type: application/json。
@RequestMapping("/r9")
public String r9 (@RequestBody Person person) {
return "接收到的参数 person = " + person;
}
4.4 文件上传 使用 @RequestPart 或 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 "文件已保存" ;
}
4.5 Cookie 与 Session
Cookie 操作 可通过 HttpServletRequest 或 @CookieValue 读取。
@RequestMapping("/getCookie2")
public String getCookie2 (@CookieValue("class") String className) {
return "className: " + className;
}
Session 操作 Session 存储在服务器端,通过 SessionID 关联客户端。
@RequestMapping("/setSession")
public String setSession (HttpSession session) {
session.setAttribute("name" , "zhangsan" );
return "设置成功" ;
}
@RequestMapping("/getSession")
public String getSession (HttpSession session) {
String name = (String) session.getAttribute("name" );
return "name: " + name;
}
注意:不同浏览器拥有独立的 SessionID,若手动替换 Cookie 中的 SessionID,服务器会识别为同一会话,导致数据混淆。
@RequestMapping("/getHeader")
public String getHeader (@RequestHeader("User-Agent") String userAgent) {
return "ua: " + userAgent;
}
5. 响应处理高级应用
5.1 静态页面 需使用 @Controller 并返回视图路径,静态资源放在 resources/static 下。
@Controller
public class IndexController {
@RequestMapping("/index")
public String 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 加法计算器 简单的 GET/POST 接口,接收两个数字并返回结果。
@RestController
@RequestMapping("/calc")
public class CalcController {
@RequestMapping("/sum")
public String sum (Integer num1, Integer num2) {
return "<h1>结果:" + (num1 + num2) + "</h1>" ;
}
}
6.2 用户登录系统 @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 图书管理系统 @RestController
@RequestMapping("/book")
public class BookController {
@RequestMapping("/getList")
public List<BookInfo> getList () {
return bookService.getBookList();
}
}
7. 开发工具与规范
7.1 Postman 测试 Postman 是常用的接口调试工具,支持多种请求方式和参数类型。配置 Headers 时注意 Content-Type。
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;
}
7.3 企业开发规范
命名 :类名大驼峰,变量小驼峰,包名全小写。
格式 :4 空格缩进,关键逻辑添加注释。
注解 :优先使用组合注解,属性较多时分行书写。
8. 参考资料 相关免费在线工具 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