一、前置知识:三层架构与 MVC 模型
1.1 三层架构(B/S 项目通用分层)
我们做的 Java Web 项目都是 B/S 架构,通常分为三层:
| 层级 | 作用 | 对应技术 / 框架 |
|---|---|---|
| 表现层(WEB 层) | 处理客户端请求、数据交互、页面跳转 | SpringMVC(本次重点) |
| 业务层(Service 层) | 处理核心业务逻辑、事务控制 | Spring IoC + 事务管理 |
| 持久层(DAO 层) | 操作数据库、数据持久化 | MyBatis/JDBC |
表现层通常采用 MVC 设计模型 ,也就是我们要学的 SpringMVC 的核心思想。
1.2 MVC 模型
MVC 是一种设计模式,全称 Model-View-Controller,各部分职责清晰:
-
Model(模型):数据封装,用 JavaBean 封装数据(比如用户、角色实体类)。
-
View(视图):数据展示,JSP/HTML 页面,用来渲染数据给用户。
-
Controller(控制器):请求分发与处理,接收用户请求、调用业务逻辑、控制页面跳转。
二、SpringMVC的入门案例
2.1 SpringMVC的概述
1.SpringMVC的概述
-
是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
-
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
-
使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。
三、项目环境搭建(基于 Maven Web 项目)
项目名 SpringMVC01,包名要求 com.qcby,下面是完整的依赖和配置步骤。
3.1 创建如下目录结构的MavenWEB项目(选择maven---勾选模板---maven-archetype-webapp---next---输入包名和项目名---一直next,最后finish即可)
SpringMVC01
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── qcby # 你的包名
│ │ │ ├── demo1 # 入门案例的 Controller
│ │ │ └── demo2 # RequestMapping 案例
│ │ ├── resources
│ │ │ └── springmvc.xml # SpringMVC 核心配置文件
│ │ └── webapp
│ │ ├── WEB-INF
│ │ │ ├── pages
│ │ │ │ └── suc.jsp # 成功页面
│ │ │ └── web.xml # Web 项目核心配置文件
│ │ └── index.jsp # 首页


3.2 导入tomcat(这里我是以其他项目进行演示的,步骤都一样)








经过上面的步骤,tomcat就配置好了
3.3 配置 pom.xml 依赖
直接复制下面的代码到你的 pom.xml:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qcby</groupId><artifactId>SpringMVC01</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>SpringMVC01 Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><spring.version>5.0.2.RELEASE</spring.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- Spring 核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><!-- SpringMVC 核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- Servlet 依赖,scope=provided 避免和 Tomcat 冲突 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- JSP 依赖 --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-databind</artifactId>--><!--<version>2.9.0</version>--><!--</dependency>--><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-core</artifactId>--><!--<version>2.9.0</version>--><!--</dependency>--><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-annotations</artifactId>--><!--<version>2.9.0</version>--><!--</dependency>--></dependencies><build><finalName>SpringMVC01</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.4.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.3.1</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>3.3.0</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.4.0</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>3.1.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>3.1.2</version></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></pluginManagement></build>
</project>
四、编写 JSP 页面
4.1 首页 index.jsp(webapp 目录下)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC入门程序</title></head>
<body>
<h3>SpringMVC 入门案例</h3>
<%-- 超链接,对应 Controller 的请求路径 --%>
<a href="/hello.do">点击进入入门程序</a>
<br><br></body>
</html>
4.2 成功页面 suc.jsp(WEB-INF/pages 目录下)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功页面</title>
</head>
<body><h3>✅ 操作成功!SpringMVC 入门案例运行成功~</h3>
</body>
</html>
五、编写 Controller 控制器(核心代码)
5.1 入门案例的 HelloController(com.qcby.demo1 包下)
package com.qcby.demo1;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** 控制器类,处理用户请求* 交给 Spring IoC 容器管理*/
@Controller
public class HelloController {/*** 处理首页超链接发送的请求* @return 视图名称,由视图解析器拼接路径*/@RequestMapping(path = "/hello.do")public String sayHello() {System.out.println("入门方法执行了...");// 配置视图解析器后,直接返回视图名即可,不用写完整路径return "suc";}}
六、核心配置文件编写
6.1 web.xml(WEB-INF 目录下)
配置 SpringMVC 的核心前端控制器 DispatcherServlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!-- 配置 SpringMVC 前端控制器 DispatcherServlet --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 加载 SpringMVC 配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 服务器启动时就加载 Servlet,初始化 SpringMVC --><load-on-startup>1</load-on-startup></servlet><!-- 配置 Servlet 映射,拦截所有 *.do 请求 --><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
6.2 springmvc.xml(resources 目录下)
配置组件扫描、视图解析器和注解驱动:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 1. 配置组件扫描,只扫描 com.qcby 包下的注解 --><context:component-scan base-package="com.qcby"/><mvc:resources location="/js/" mapping="/js/**"/><!-- 2. 配置视图解析器,拼接视图路径 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀:视图文件的目录 --><property name="prefix" value="/WEB-INF/pages/"/><!-- 后缀:视图文件的扩展名 --><property name="suffix" value=".jsp"/></bean><!-- 3. 开启 SpringMVC 注解驱动,支持 @RequestMapping 等注解 --><mvc:annotation-driven/></beans>
启动tomcat可以看执行结果
七、入门案例执行流程与组件解析
7.1 完整执行流程
-
Tomcat 启动:加载 web.xml,创建 DispatcherServlet,加载 springmvc.xml。
-
容器初始化:Spring 扫描 com.qcby 包,创建 HelloController 和 RoleController 对象。
-
请求到达:用户点击超链接,请求先到 DispatcherServlet(前端控制器)。
-
请求匹配:根据 @RequestMapping 注解,找到对应的 Controller 方法。
-
方法执行:执行 Controller 方法,返回视图名(比如 suc)。
-
视图解析:视图解析器拼接路径 /WEB-INF/pages/suc.jsp。
-
页面渲染:Tomcat 渲染 JSP 页面,返回给用户。
7.2 SpringMVC 核心组件
| 组件 | 作用 |
|---|---|
| DispatcherServlet(前端控制器) | 整个流程的入口,接收所有请求,分发到对应处理器 |
| HandlerMapping(处理器映射器) | 根据请求 URL 找到对应的处理器(Controller) |
| Handler(处理器 / Controller) | 实际处理请求的类,编写业务逻辑 |
| HandlerAdapter(处理器适配器) | 适配不同类型的处理器,执行 Controller 方法 |
| ViewResolver(视图解析器) | 根据返回的视图名,拼接成完整的视图路径 |
| View(视图) | 具体的 JSP/HTML 页面,负责数据展示 |
八、RequestMapping注解
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上
-
作用在类上:第一级的访问目录
-
作用在方法上:第二级的访问目录
-
细节:路径可以不编写 / 表示应用的根目录开始
RequestMapping的属性:
-
path 指定请求路径的url
-
value value属性和path属性是一样的
-
mthod 指定该方法的请求方式
-
params 指定限制请求参数的条件
补充:
-
path 和 value 完全等价:在 SpringMVC 源码中,两者指向同一个属性,写哪个都可以,推荐用 path,语义更清晰。
-
method 属性:可以限制请求方式(GET/POST/PUT/DELETE 等),不指定则支持所有请求方式。
-
params 属性:
-
格式:params = "参数名" 表示必须携带该参数。
-
进阶用法:params = "!username" 表示不能携带该参数;params = "username=admin" 表示参数值必须为指定值。
-
-
类上的 @RequestMapping:作用是给所有方法的路径加上统一前缀,比如类上写 /role,方法里写 /save.do,最终路径就是 /role/save.do,方便模块管理。
8.1 RequestMapping 注解案例 RoleController(com.qcby.demo2 包下)
package com.qcby.demo2;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;/*** 角色模块控制器* @RequestMapping 作用在类上:一级请求路径 /role*/
@Controller
@RequestMapping(path = "/role")
public class RoleController {// ======================================// 1. path 属性(指定请求URL路径)// ======================================@RequestMapping(path = "/save.do")public String save() {System.out.println("✅ 演示 path 属性:请求路径 /role/save.do 执行成功");return "suc";}// ======================================// 2. value 属性(和 path 完全等价)// ======================================@RequestMapping(value = "/delete.do")public String delete() {System.out.println("✅ 演示 value 属性:请求路径 /role/delete.do 执行成功");return "suc";}// ======================================// 3. method 属性(限制请求方式)// 只允许 GET 请求访问,POST 等其他方式会报 405 错误// ======================================@RequestMapping(path = "/update.do",method = {RequestMethod.GET})public String update() {System.out.println("✅ 演示 method 属性:仅 GET 请求 /role/update.do 执行成功");return "suc";}// ======================================// 4. params 属性(限制必须携带请求参数)// 必须携带 username 参数才能访问,否则报 400 错误// ======================================@RequestMapping(path = "/find.do",params = "username")public String find() {System.out.println("✅ 演示 params 属性:携带 username 参数的 /role/find.do 执行成功");return "suc";}// ======================================// 组合演示:同时使用 method + params// 仅允许 GET 请求,且必须携带 id 参数// ======================================@RequestMapping(path = "/detail.do",method = {RequestMethod.GET},params = "id")public String detail() {System.out.println("✅ 演示 method + params 组合:/role/detail.do 执行成功");return "suc";}}
另外,还需要在index.jsp文件中添加以下代码:
<h1>SpringMVC @RequestMapping 属性演示</h1><h3>1. path 属性演示</h3><a href="/role/save.do">访问 /role/save.do(path 属性)</a><h3>2. value 属性演示</h3><a href="/role/delete.do">访问 /role/delete.do(value 属性)</a><h3>3. method 属性演示(仅允许 GET)</h3><a href="/role/update.do">访问 /role/update.do(GET 请求,method 限制)</a><h3>4. params 属性演示(必须带 username 参数)</h3><a href="/role/find.do?username=admin">访问 /role/find.do(带 username 参数,params 限制)</a><br><a href="/role/find.do">访问 /role/find.do(不带参数,会 400 错误)</a><h3>5. method + params 组合演示</h3><a href="/role/detail.do?id=1">访问 /role/detail.do(GET + 带 id 参数)</a>
启动tomcat看结果,结合后端控制台查看

8.2 每个属性的效果说明

九、常见问题与避坑指南
-
包名问题:所有 Controller 必须在 com.qcby 包及其子包下,否则组件扫描无法识别。
-
视图路径问题:/WEB-INF 目录下的 JSP 不能直接访问,必须通过视图解析器跳转。
-
请求后缀问题:web.xml 中配置了 *.do,所以请求路径必须以 .do 结尾。
-
依赖冲突问题:servlet-api 和 jsp-api 的 scope 必须设置为 provided,避免和 Tomcat 自带的 jar 包冲突。
十、总结
通过这个入门案例,你已经掌握了 SpringMVC 的核心流程:
-
三层架构与 MVC 模型的分工。
-
SpringMVC 项目的完整搭建流程(依赖、配置、Controller、视图)。
-
@RequestMapping 注解的用法和请求映射规则。
-
SpringMVC 核心组件的职责和执行流程。
