【SpringMVC笔记】 - 1 - SpringMVC入门
一、MVC 架构模式
1. 什么是 MVC
MVC 是一种通用的软件架构设计思想(并非 Java 专属,所有语言均可使用),将应用程序划分为三个核心模块:
- M(Model)模型:负责业务逻辑处理与数据封装
- V(View)视图:负责数据的可视化展示
- C(Controller)控制器:作为调度中心,协调模型与视图的交互
2. MVC 的核心优点
- 低耦合:模块间相互独立,修改某一层不影响其他层
- 高复用:相同模型可被多个视图复用
- 易维护:代码职责清晰,便于定位和修复问题
- 高内聚:开发者可专注于单一模块的开发
3. MVC 工作流程
- 前端浏览器发送 HTTP 请求到 Web 服务器
- 控制器接收请求,封装前端提交的数据
- 控制器调用模型处理业务逻辑
- 模型返回处理后的数据给控制器
- 控制器调用视图渲染数据
- 视图生成 HTML 响应返回给浏览器

4. MVC vs 三层模型
| 对比维度 | MVC 架构模式 | 三层模型 |
|---|---|---|
| 关注点 | 整个应用的展示层与控制层分离 | 业务逻辑组件的垂直分层(表现层 / 业务层 / 数据访问层) |
| 核心目标 | 解决前端与后端的解耦问题 | 解决业务逻辑与数据访问的解耦问题 |
| 实际应用 | 现代开发中通常两者结合使用:三层模型处理业务数据流转,MVC 处理请求与视图展示 |

二、SpringMVC 概述
1. 什么是 SpringMVC
SpringMVC 是基于 Servlet 实现的 MVC 架构 Web 框架,是 Spring 框架 Web 模块的核心子项目(Spring Web 还包含 WebFlux、WebSocket 等模块)。它完整实现了 MVC 规范,开发者只需专注于业务逻辑编写。
2. SpringMVC vs 原生 Servlet 开发
SpringMVC 封装了大量重复代码,相比原生 Servlet 开发优势显著:
- 统一入口控制 :通过
DispatcherServlet统一接收和分发所有请求,无需手动编写多个 Servlet - 自动数据绑定 :表单数据自动封装到 JavaBean 对象,无需手动
request.getParameter() - IoC 容器集成:所有组件由 Spring 容器管理,实现依赖注入与松耦合
- 统一请求处理:内置拦截器、异常处理器,无需手动编写过滤器和异常处理逻辑
- 多视图支持:无缝集成 JSP、Thymeleaf、FreeMarker 等多种视图技术
3. SpringMVC 核心特点
- 轻量级:仅需几个几百 KB 的 Jar 包即可运行
- 模块化:请求处理流程拆分为控制器、模型、视图等独立模块
- 易扩展:提供大量扩展点,支持自定义组件(如自定义拦截器、视图解析器)
- 易测试:支持脱离 Web 服务器进行单元测试
- 约定大于配置:提供自动化默认配置,减少重复配置工作
三、第一个 SpringMVC 程序(基础版)
步骤 1:创建 Maven 模块
- 创建空项目,命名为
springmvc - 配置项目 JDK 为 Java 17
- 配置 Maven 环境
- 新建 Maven 模块,修改
pom.xml打包方式为war
xml
<groupId>com.zzz.springmvc</groupId>
<artifactId>springmvc-001</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
步骤 2:添加核心依赖
xml
<dependencies>
<!-- SpringMVC核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.4</version>
</dependency>
<!-- 日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.3</version>
</dependency>
<!-- Servlet API(Tomcat已提供,scope设为provided) -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!-- Thymeleaf与Spring6整合依赖 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring6</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
</dependencies>
步骤 3:添加 Web 支持
- 在
src/main目录下创建webapp目录 - 在
webapp/WEB-INF目录下创建web.xml配置文件
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<!-- SpringMVC前端控制器(核心入口) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- /表示拦截所有非JSP请求,/*表示拦截所有请求(包括JSP) -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
步骤 4:编写控制器 Controller
创建FirstController类:
java
@Controller // 将该类交给Spring容器管理
public class FirstController {
// 映射请求路径/haha到该方法
@RequestMapping(value = "/haha")
public String handleRequest() {
System.out.println("正在处理请求....");
// 返回逻辑视图名称(对应/WEB-INF/templates/first.html)
return "first";
}
}
步骤 5:配置 SpringMVC 核心配置文件
在WEB-INF目录下创建springmvc-servlet.xml(默认命名规则:<servlet-name>-servlet.xml):
xml
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 组件扫描:扫描指定包下的注解 -->
<context:component-scan base-package="com.zzz.springmvc.controller"/>
<!-- Thymeleaf视图解析器 -->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
<property name="characterEncoding" value="UTF-8"/>
<property name="order" value="1"/> <!-- 优先级,数值越小优先级越高 -->
<property name="templateEngine">
<bean class="org.thymeleaf.spring6.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/WEB-INF/templates/"/> <!-- 模板前缀 -->
<property name="suffix" value=".html"/> <!-- 模板后缀 -->
<property name="templateMode" value="HTML"/>
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
</beans>
步骤 6:创建视图页面
在WEB-INF目录下创建templates目录,新建first.html:
html
<!DOCTYPE html>
<!-- 必须添加Thymeleaf命名空间 -->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>第一个SpringMVC程序</title>
</head>
<body>
<h1>我的第一个Spring MVC程序</h1>
</body>
</html>
步骤 7:部署与测试
- 配置 Tomcat 10 服务器
- 将项目部署到 Tomcat
- 启动 Tomcat,访问:
http://localhost:8080/springmvc/haha - 预期结果:页面显示 "我的第一个 Spring MVC 程序",控制台输出 "正在处理请求..."

核心执行流程总结
- 浏览器发送请求:
http://localhost:8080/springmvc/haha DispatcherServlet接收请求- 根据请求路径
/haha映射到FirstController#handleRequest()方法 - 方法执行并返回逻辑视图名称
first - 视图解析器拼接前缀和后缀,找到
/WEB-INF/templates/first.html - 渲染视图并返回响应给浏览器
四、第二个 SpringMVC 程序(优化版)
核心优化点
- 自定义 SpringMVC 配置文件的位置和名称
- 配置
load-on-startup提前初始化DispatcherServlet - 设置项目首页
步骤 1:修改 web.xml 配置
xml
<?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">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 自定义配置文件路径(classpath对应resources目录) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 服务器启动时初始化DispatcherServlet(默认第一次访问时初始化) -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
步骤 2:移动配置文件
将springmvc-servlet.xml移动到resources目录,并重命名为springmvc.xml(内容不变)
步骤 3:编写首页控制器
创建com.zzz.springmvc.controller.IndexController:
java
@Controller
public class IndexController {
// 映射根路径到首页
@RequestMapping("/")
public String toIndex() {
return "index";
}
}
步骤 4:创建首页视图
在WEB-INF/templates目录下新建index.html:
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>欢迎来到SpringMVC首页</h1>
</body>
</html>
步骤 5:测试
启动 Tomcat,直接访问:http://localhost:8080/springmvc/,即可看到首页内容

五、扩展:一个 Controller 处理多个请求
一个 Controller 类可以包含多个处理方法,分别映射不同的请求路径,实现业务逻辑的模块化管理。
核心实现逻辑
- 在同一个 Controller 类中定义多个方法
- 每个方法通过
@RequestMapping注解映射独立的 URL 路径 - 不同方法可返回不同的逻辑视图名称,对应不同的页面
步骤 1:编写多方法 Controller
确保 FirstController 类中包含两个请求处理方法:
java
@Controller
public class FirstController {
@RequestMapping(value = "/first")
public String first() {
System.out.println("正在处理请求....");
// 返回逻辑视图名称(决定跳转到哪个页面)
return "first";
}
@RequestMapping(value = "/second")
public String second() {
System.out.println("正在处理请求....");
return "second";
}
}
步骤 2:创建 second.html 视图
在 WEB-INF/templates 目录下新建 other.html 文件:
html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Second Thymeleaf</title>
</head>
<body>
<h1>我的第二个Spring MVC程序</h1>
</body>
</html>
步骤 3:修改 first.html 添加跳转链接
在 first.html 中添加跳转到 other 页面的超链接:
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>第一个SpringMVC程序</title>
</head>
<body>
<h1>我的第一个Spring MVC程序</h1>
<!-- 添加跳转链接:th:href 会自动添加上下文路径 -->
<a th:href="@{/second}">点击进入Second</a>
</body>
</html>
步骤 4:测试
1、启动 Tomcat 服务器
2、访问 first 页面:
在浏览器地址栏输入:http://localhost:8080/springmvc/first
- 预期结果:页面显示 "我的第一个 Spring MVC 程序" 及跳转链接

3、测试页面跳转:
点击页面上的 "点击进入Second" 链接
-
预期结果:浏览器地址栏变为
http://localhost:8080/springmvc/second -
页面显示 "我的第二个Spring MVC程序"

总结
本章作为 SpringMVC 的入门教程,全面介绍了该框架的核心概念、优势及基础开发流程。以下是主要内容的回顾:
- 理论基础 (MVC 模式) :明确了 MVC(Model-View-Controller)是一种通用的软件架构设计思想,旨在通过将应用程序划分为模型(业务逻辑与数据)、视图(用户界面)和控制器(调度中心)三个核心模块,来实现代码的低耦合、高复用和易维护。同时厘清了 MVC 架构模式(关注展示层分离)与三层模型(表现层/业务层/数据层垂直分层)的区别,指出在现代开发中两者通常结合使用。
- SpringMVC 概述 :确定了 SpringMVC 是基于 Servlet API 构建的、完整实现了 MVC 规范的轻量级 Web 框架,是 Spring 框架的核心子项目。相比原生 Servlet 开发,它通过统一入口控制 (
DispatcherServlet) 、自动数据绑定 、与 Spring IoC 容器无缝集成 以及多视图技术支持(如 Thymeleaf)等特性,极大地简化了 Web 层开发。 - 实战演练与流程掌握 :
- 通过构建基础版和优化版两个示例程序,完整演示了从创建 Maven 工程、添加核心依赖、在
web.xml中配置DispatcherServlet入口、编写基于注解 (@Controller,@RequestMapping) 的控制器,到配置 Thymeleaf 视图解析器及创建 HTML 页面的一整套流程。 - 梳理并总结了 SpringMVC 的核心执行流程:浏览器请求 ->
DispatcherServlet接收 -> 映射到 Controller 方法执行 -> 返回逻辑视图名 -> 视图解析器定位文件 -> 渲染视图 -> 返回 HTML 响应。
- 通过构建基础版和优化版两个示例程序,完整演示了从创建 Maven 工程、添加核心依赖、在
- 进阶扩展 :展示了如何在一个 Controller 类中定义多个处理方法来映射不同的 URL 路径,并通过 Thymeleaf 的标准表达式 (
th:href) 实现页面间的跳转,体现了框架在处理复杂业务模块时的灵活性。
序,完整演示了从创建 Maven 工程、添加核心依赖、在 web.xml 中配置 DispatcherServlet 入口、编写基于注解 (@Controller, @RequestMapping) 的控制器,到配置 Thymeleaf 视图解析器及创建 HTML 页面的一整套流程。
- 梳理并总结了 SpringMVC 的核心执行流程:浏览器请求 ->
DispatcherServlet接收 -> 映射到 Controller 方法执行 -> 返回逻辑视图名 -> 视图解析器定位文件 -> 渲染视图 -> 返回 HTML 响应。
- 进阶扩展 :展示了如何在一个 Controller 类中定义多个处理方法来映射不同的 URL 路径,并通过 Thymeleaf 的标准表达式 (
th:href) 实现页面间的跳转,体现了框架在处理复杂业务模块时的灵活性。
通过本章的学习,读者应掌握 MVC 模式的基本思想,理解 SpringMVC 的工作原理,并能够独立搭建起基础的 SpringMVC + Thymeleaf 开发环境。这为后续深入学习请求参数处理、响应数据封装、拦截器等核心功能打下了坚实基础。