Spring MVC教程2025:从零到大师的终极指南(含源码)
一站式掌握Java Web开发核心框架,理论+实战,让你彻底搞懂Spring MVC! SEO描述:** 最全面、最实用的Spring MVC教程,从环境搭建、核心组件到实战项目,手把手教你快速上手,适合Java初学者及进阶开发者,附完整源码下载,助你成为Spring MVC高手。

引言:为什么你还在学习Spring MVC?
在Java Web开发的浩瀚星海中,框架层出不穷,从Struts到JSF,再到如今的Spring Boot,但你可能发现,无论技术如何演进,Spring MVC的身影始终屹立不倒,为什么?
因为它不仅仅是“老”,更是“经典”与“强大”的代名词。
- Spring Boot的基石: 现在最火的Spring Boot,其底层核心就是Spring MVC,不理解Spring MVC,你将无法真正掌握Spring Boot的自动配置原理和精髓。
- 企业级应用的中流砥柱: 无数大型企业级项目仍在使用基于Spring MVC构建的系统,掌握它,意味着你拥有了进入这些企业的“敲门砖”。
- 思想与架构的传承: Spring MVC的前端控制器模式、依赖注入、AOP等思想,是现代Java开发的基石,学习它,就是学习一套优秀的软件设计哲学。
本教程将是你从“知道”到“精通”Spring MVC的终极跳板,我们将摒弃枯燥的理论,采用“概念-实践-升华”三部曲,让你在动手编码中深刻理解每一个知识点。
Spring MVC核心:它到底是如何工作的?(一张图看懂)
想象一下一个餐厅的运作流程:

- 顾客(用户请求) 进门,不会直接冲向后厨。
- 迎宾员(DispatcherServlet) 接待顾客,了解他想点什么菜(请求URL)。
- 迎宾员根据菜单(
HandlerMapping),找到专门负责这道菜的厨师(Controller)。 - 厨师(
Controller)接到订单,开始烹饪(处理业务逻辑)。 - 做好后,厨师把菜交给传菜员(ModelAndView),并告诉他这道菜叫什么名字(视图名)。
- 传菜员拿着菜名,去后厨的菜架(ViewResolver)上找到对应的盘子(
View)。 - 传菜员将装好菜的盘子(
View渲染后的最终页面)端给顾客。
这个流程,就是Spring MVC的核心工作流程。
关键组件解析:
- DispatcherServlet: 前端控制器,所有请求的入口,负责协调其他组件工作,它是整个框架的“心脏”。
- HandlerMapping: 处理器映射器,根据用户请求的URL,找到对应的Controller处理方法。
- Controller: 控制器,开发者编写的核心类,负责接收请求、调用业务逻辑、返回处理结果。
- ModelAndView: 模型和视图,Controller处理完后,封装了要渲染的数据和视图名称。
- ViewResolver: 视图解析器,根据视图名称,找到并实例化真正的View对象。
- View: 视图,负责将Model中的数据渲染成最终的响应(如HTML、JSON等)。
实战演练:手把手搭建你的第一个Spring MVC项目
理论说再多,不如亲手敲一行代码,本节我们将创建一个标准的Maven项目,实现一个简单的“Hello, Spring MVC!”功能。
步骤1:环境准备
- JDK 8+
- Maven 3.6+
- IntelliJ IDEA (或Eclipse)
步骤2:创建Maven Web项目
在IDEA中,选择 File -> New -> Project,选择 Maven 并勾选 Create from archetype,然后选择 maven-archetype-webapp。

步骤3:添加Spring MVC依赖
打开 pom.xml,添加以下核心依赖:
<dependencies>
<!-- 1. Spring MVC 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version> <!-- 建议使用较新稳定版 -->
</dependency>
<!-- 2. Servlet API 依赖 (Tomcat等容器需要) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 3. JSP API 依赖 (如果使用JSP视图) -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- 4. JSTL 标签库 (简化JSP开发) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
步骤4:配置DispatcherServlet
在 src/main/webapp/WEB-INF 目录下,创建 spring-mvc-servlet.xml 文件,这个文件是Spring MVC的“大脑”。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 1. 扫描Controller包 -->
<context:component-scan base-package="com.example.controller"/>
<!-- 2. 开启MVC注解驱动 -->
<mvc:annotation-driven/>
<!-- 3. 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 4. 静态资源处理 -->
<mvc:default-servlet-handler/>
</beans>
配置详解:
component-scan:告诉Spring去哪里找被@Controller等注解标记的类。mvc:annotation-driven:开启注解驱动,使我们能使用@RequestMapping等注解。InternalResourceViewResolver:视图解析器配置,prefix是JSP文件存放的目录,suffix是文件后缀,返回"hello",会解析为/WEB-INF/views/hello.jsp。mvc:default-servlet-handler:将静态资源(如CSS, JS, 图片)的请求交给默认的Servlet处理,避免被DispatcherServlet拦截。
步骤5:配置Web.xml
在 webapp/WEB-INF/web.xml 中配置DispatcherServlet,并将其设置为所有请求的入口。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 1. 配置DispatcherServlet -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定Spring MVC配置文件的位置和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<!-- 拦截所有请求,除了.jsp(避免JSP重复解析) -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
步骤6:创建Controller、View和测试
-
创建Controller 在
java/com/example/controller包下创建HelloController.java:package com.example.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @GetMapping("/hello") // 或 @RequestMapping(value = "/hello", method = RequestMethod.GET) public String sayHello(Model model) { // 向模型中添加数据 model.addAttribute("message", "Hello, Spring MVC! This is your first app."); // 返回视图名称,由视图解析器拼接成完整路径 return "hello"; } } -
创建View 在
webapp/WEB-INF/views目录下创建hello.jsp:<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Hello Page</title> </head> <body> <h1>${message}</h1> <p>恭喜你,Spring MVC 配置成功!</p> </body> </html> -
部署并测试 将项目部署到Tomcat等Web服务器中,启动服务器,在浏览器访问:
http://localhost:8080/你的项目名/hello如果看到页面显示“Hello, Spring MVC! This is your first app.”,那么恭喜你,你已经成功迈出了Spring MVC的第一步!
进阶之路:深入理解核心注解与数据绑定
掌握了基础,我们来探索Spring MVC的“超能力”。
常用注解详解
| 注解 | 作用 | 示例 |
|---|---|---|
@RestController |
@Controller + @ResponseBody 的结合,用于返回JSON/XML等数据,而非视图,现代Web API开发首选。 |
@RestController @RequestMapping("/api") |
@RequestMapping |
用于映射HTTP请求URL到具体的处理方法上,可以作用于类和方法上。 | @RequestMapping(value = "/users", method = RequestMethod.GET) |
@GetMapping, @PostMapping |
@RequestMapping的简化版,分别对应GET和POST请求,代码更简洁。 |
@PostMapping("/create") |
@RequestParam |
用于获取请求中的参数。 | public String get(@RequestParam("name") String username) |
@PathVariable |
用于获取URL模板中的变量,RESTful风格常用。 | @GetMapping("/users/{id}") public User getUser(@PathVariable("id") Long userId) |
@RequestBody |
用于读取HTTP请求体中的JSON/XML数据,并自动绑定到Java对象上。 | @PostMapping("/create") public void createUser(@RequestBody User user) |
@ResponseBody |
将方法的返回值直接作为HTTP响应体返回,通常用于返回JSON/XML。 |
数据绑定与表单提交
Spring MVC最强大的特性之一就是自动数据绑定,它能将HTTP请求中的参数自动填充到Java对象中。
场景: 用户注册表单提交
-
创建实体类
public class User { private String username; private String email; // Getters and Setters... } -
创建Controller处理方法
@Controller @RequestMapping("/user") public class UserController { @PostMapping("/register") public String register(User user, Model model) { // Spring MVC会自动将表单数据填充到user对象中 System.out.println("注册用户: " + user.getUsername() + ", 邮箱: " + user.getEmail()); model.addAttribute("registeredUser", user); return "success"; // 跳转到成功页面 } } -
创建JSP表单
<form action="/your-project-name/user/register" method="post"> 用户名: <input type="text" name="username"><br> 邮箱: <input type="email" name="email"><br> <input type="submit" value="注册"> </form>
当用户填写表单并提交时,Spring MVC会根据name属性(username, email)自动查找User类中对应的属性,并调用其setter方法完成赋值。
高级特性与最佳实践
当你熟练使用基础后,这些高级特性将让你从“会用”变为“精通”。
RESTful API 设计
REST(Representational State Transfer)是一种软件架构风格,而非标准,Spring MVC是构建RESTful API的利器。
- 使用
@RestController:专门用于返回数据,不返回视图。 - 使用
@GetMapping,@PostMapping等:明确表示HTTP方法。 - 使用
@PathVariable:优雅地设计资源路径。 - 使用
@RequestBody和@ResponseBody:处理请求体和响应体。
示例:用户资源API
@RestController
@RequestMapping("/api/v1/users")
public class UserApiController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
// 业务逻辑...
return new User("John Doe");
}
@PostMapping
public User createUser(@RequestBody User user) {
// 业务逻辑...
return user; // 返回创建后的用户,通常包含ID
}
}
全局异常处理
使用@ControllerAdvice和@ExceptionHandler可以创建全局异常处理器,统一处理各种异常,避免在每个Controller中都写try-catch。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
ModelAndView mav = new ModelAndView("error"); // 跳转到错误页面
mav.addObject("errorMsg", ex.getMessage());
return mav;
}
// 也可以处理特定异常,并返回JSON
@ExceptionHandler(UserNotFoundException.class)
@ResponseBody
public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
拦截器
拦截器可以在请求到达Controller之前或之后执行一些逻辑,如日志记录、权限验证等。
-
实现
HandlerInterceptor接口public class LoggingInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("请求前拦截: " + request.getRequestURI()); return true; // true: 继续流程; false: 中断流程 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("请求后拦截"); } } -
在配置中注册拦截器
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有路径 --> <bean class="com.example.interceptor.LoggingInterceptor"/> </mvc:interceptor> </mvc:interceptors>
总结与展望
通过本教程,你已经从零开始,逐步掌握了Spring MVC的核心概念、环境搭建、实战开发以及进阶特性,你已经具备了构建一个功能完备的Java Web应用的能力。
回顾一下我们的学习路径:
- 理解核心架构:掌握了DispatcherServlet和各组件的协作流程。
- 完成实战项目:亲手搭建了第一个Spring MVC应用,实现了从请求到响应的完整闭环。
- 深入核心注解:学会了如何灵活使用注解来处理各种HTTP请求和参数。
- 探索高级特性:了解了RESTful API设计、全局异常处理和拦截器等企业级开发必备技能。
下一步,你可以:
- 整合持久层:将Spring MVC与MyBatis或JPA整合,实现数据库操作。
- 学习Spring Boot:在理解Spring MVC的基础上,学习Spring Boot的自动配置,你会发现开发效率呈指数级提升。
- 研究源码:深入Spring MVC的源码,探究
DispatcherServlet的初始化过程、HandlerMapping的匹配算法等,这将让你对框架的理解达到新的高度。
Spring MVC是一座富矿,本教程只是为你打开了一扇门,真正的宝藏,需要你在实践中不断探索和挖掘,祝你编程愉快,早日成为Spring大师!
附:完整项目源码下载
为了方便大家学习和实践,本文所涉及的所有源码已打包上传。点击此处下载完整源码 (此处为模拟链接,实际部署时可替换为真实下载地址)。 **
- 完整的Maven项目结构
pom.xml依赖配置web.xml和spring-mvc-servlet.xml配置文件HelloController和UserController示例代码- 对应的
JSP视图文件
使用说明:
- 下载并解压源码包。
- 在IDEA中导入项目。
- 配置Tomcat服务器。
- 一键部署并运行。
#Spring MVC #Java教程 #Web开发 #后端技术 #编程入门 #源码分析
