Spring MVC详解

📌 摘要

Spring MVC 是 Spring Framework 提供的一个模块化 Web 框架,用于构建基于 MVC 架构的 Java Web 应用。它具备良好的解耦性、可扩展性和灵活性,是目前主流的 Java Web 开发框架之一。

本文将系统讲解 Spring MVC 的基本原理、核心组件、请求处理流程、常用注解以及实际开发中的常见配置和技巧,适合初学者快速上手,也适合中高级开发者查漏补缺。

🎯 一、引言:什么是 Spring MVC?

随着前后端分离架构的普及,后端接口的职责越来越清晰。Spring MVC 作为 Spring 生态中负责 Web 层的核心模块,凭借其强大的功能和良好的集成能力,成为众多 Java 开发者的首选。

✅ Spring MVC 的优势:

支持 MVC 分层架构

支持 RESTful 风格接口设计

可灵活整合各种视图技术(如 Thymeleaf、JSP、JSON)

易于测试、松耦合设计

支持国际化、数据绑定、表单验证等功能

🧱 二、Spring MVC 的核心组件

组件

描述

DispatcherServlet

前端控制器,负责接收所有请求并协调其他组件

HandlerMapping

根据请求路径找到对应的 Controller 方法

ViewResolver

解析视图名称为具体的视图实现(如 JSP)

ModelAndView

封装模型数据和视图信息

Controller

处理具体业务逻辑的类或方法

🔁 三、Spring MVC 请求处理流程详解

用户发送 HTTP 请求。

请求被 DispatcherServlet 接收。

HandlerMapping 查找合适的 Controller。

调用 Controller 方法处理请求,返回 ModelAndView。

ViewResolver 解析视图名,渲染模型数据。

返回最终响应给用户(HTML 页面或 JSON 数据)。

🛠️ 四、搭建第一个 Spring MVC 项目(基于 Spring Boot)

1. 创建 Maven 工程并引入依赖

org.springframework.boot

spring-boot-starter-web

2. 创建 Controller 类

import org.springframework.web.bind.annotation.*;

@RestController

@RequestMapping("/api")

public class HelloController {

@GetMapping("/hello")

public String sayHello() {

return "Hello, Spring MVC!";

}

}

3. 启动类

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

启动后访问:http://localhost:8080/api/hello,即可看到输出 "Hello, Spring MVC!"

📦 五、Spring MVC 核心注解详解

注解

用途

@Controller

表示该类是一个控制器,返回值为视图名

@RestController

结合 @Controller 和 @ResponseBody,适用于 RESTful 接口

@RequestMapping

映射 URL 到类或方法

@GetMapping / @PostMapping 等

更细粒度的请求映射

@PathVariable

获取 URL 中的变量

@RequestParam

获取请求参数

@RequestBody

将请求体反序列化为对象

@ResponseBody

将返回值直接写入 HTTP 响应体中

📝 六、常见配置与使用场景

1. 视图解析器配置(如 Thymeleaf)

@Configuration

public class WebConfig implements WebMvcConfigurer {

@Bean

public ViewResolver viewResolver() {

ThymeleafViewResolver resolver = new ThymeleafViewResolver();

resolver.setTemplateEngine(templateEngine());

return resolver;

}

// ...其他配置

}

2. 静态资源放行

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");

}

3. 全局异常处理

@ControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)

public ResponseEntity handleException() {

return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误");

}

}

4. 表单验证支持(JSR 380)

@PostMapping("/users")

public ResponseEntity createUser(@Valid @RequestBody User user, BindingResult result) {

if (result.hasErrors()) {

return ResponseEntity.badRequest().body(result.getAllErrors());

}

// 处理业务逻辑

return ResponseEntity.ok("创建成功");

}

📊 七、Spring MVC 与 RESTful API 实践

Spring MVC 对 RESTful API 的支持非常完善,适合构建前后端分离的应用。

示例:用户管理接口

@RestController

@RequestMapping("/api/users")

public class UserController {

private final UserService userService;

public UserController(UserService service) {

this.userService = service;

}

@GetMapping("/{id}")

public ResponseEntity getUserById(@PathVariable Long id) {

return ResponseEntity.ok(userService.getUserById(id));

}

@PostMapping

public ResponseEntity createUser(@RequestBody User user) {

return ResponseEntity.status(HttpStatus.CREATED).body(userService.saveUser(user));

}

@DeleteMapping("/{id}")

public ResponseEntity deleteUser(@PathVariable Long id) {

userService.deleteUser(id);

return ResponseEntity.noContent().build();

}

}

⚙️ 八、性能优化与最佳实践

优化点

说明

使用异步处理

@Async 实现非阻塞调用

缓存静态内容

使用 Spring Cache 或 Redis

合理使用线程池

配置 TaskExecutor 提升并发能力

日志记录

使用 MDC 记录 traceId 方便排查问题

接口文档

使用 Swagger 或 SpringDoc 自动生成 API 文档

💼 九、总结

Spring MVC 是构建现代 Java Web 应用的重要工具,无论是传统的 MVC 页面应用还是现代化的 RESTful 接口服务,都能轻松胜任。

掌握 Spring MVC 的核心原理和常用技巧,不仅能提升开发效率,也能帮助你在面试和工作中脱颖而出。

如果你在学习过程中遇到任何疑问,欢迎在评论区留言交流!

👍 如果你觉得这篇文章对你有帮助,别忘了点赞、收藏、转发哦!