- SpringMVC概述
- 什么是SpringMVC
- SpringMVC框架的优点
- SpringMVC优化的方向
- SpringMVC执行流程
- 基于注解的SpringMVC程序
一、SpringMVC概述
1.1 什么是SpringMVC
- SpringMVC 是基于
MVC
开发模式的框架,用来优化控制器。- 它是 Spring 家族的一员,它也具备
IOC
和AOP
。
- 它是 Spring 家族的一员,它也具备
1.2 SpringMVC框架的优点
- 轻量级,基于
MVC
的框架。 - 易于上手,容易理解,功能强大。
- 具备
IOC
和AOP
。- 方便整合
Struts
、MyBatis
、Hibernate
、JPA
等其他框架。
- 方便整合
- 完全基于注解开发。
- 在
Controller
、Service
、Dao
中都可以使用注解,方便灵活。 - 使用
@Controller
创建处理器对象。 @Service
创建业务对象。@Autowired
或者@Resource
在控制器类中注入Service
,在Service
类中注入Dao
。
- 在
1.3 SpringMVC优化的方向
SpringMVC 主要是优化了下图中的蓝色部分,包括数据提交的优化、携带数据的优化以及返回结果处理的优化。

1.4 ★★★SpringMVC执行流程

- 执行流程说明:
- 向服务器发送
HTTP
请求,请求被前端控制器DispatcherServlet
捕获。 DispatcherServlet
根据<servlet-name>
中的配置对请求的URL
进行解析,得到请求资源标识符(URI
)。然后根据该URI
,调用HandlerMapping
获得该Handler
配置的所有相关的对象(包括Handler
对象以及Handler
对象对应的拦截器),最后以HandlerExecutionChain
对象的形式返回。DispatcherServlet
根据获得的Handler
,选择一个合适的HandlerAdapter
。- 提取
Request
中的模型数据,填充Handler
入参,开始执行Handler
(Controller
)。在填充Handler
的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:HttpMessageConveter
:将请求消息(如Json
、xml
等数据)转换成一个对象,将对象转换为指定的响应信息。- 数据转换:对请求消息进行数据转换。如
String
转换成Integer
、Double
等。 - 数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
- 数据验证:验证数据的有效性(长度、格式等),验证结果存储到
BindingResult
或Error
中。
Handler
(Controller
)执行完成后,向DispatcherServlet
返回一个ModelAndView
对象。- 根据返回的
ModelAndView
,选择一个适合的ViewResolver
(必须是已经注册到 Spring 容器中的ViewResolver
)返回给DispatcherServlet
。 ViewResolver
结合Model
和View
,来渲染视图。- 视图负责将渲染结果返回给客户端。
- 向服务器发送
1.5 ★基于注解的SpringMVC程序
项目需求:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。
新建一个空项目
SpringMVC-learning-code
,将项目编码都改为UTF-8
,并对项目的maven
进行设置。

新建项目,选择
webapp
模板。
修改目录,添加缺失的
test
,并添加java
,resources
(两套)。
修改
pom.xml
文件,添加 SpringMVC 的依赖,添加 Servlet 的依赖。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<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.f</groupId>
<artifactId>SpringMVC-001-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--SpringMVC依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.2</version>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>在
/main/resources
目录下利用 XML 的 Spring 模板添加springmvc.xml
配置文件:- 指定包扫描,添加视图解析器
InternalResourceViewResolver
。 - 配置文件名可以任意命名,推荐使用
springmvc.xml
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--添加包扫描-->
<context:component-scan base-package="com.f.springmvc.controller"/>
<!--添加视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<!--配置前缀为/admin/是因为我们最终要跳转的是webapp下admin目录中的页面-->
<property name="prefix" value="/admin/"/>
<!--配置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>- SpringMVC 框架为了避免请求资源路径与扩展名的冗余,在视图解析器
InternalResouceViewResolver
中引入了请求的前辍与后辍。在action
中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接。
- 指定包扫描,添加视图解析器
删除
web.xml
文件,新建web.xml
(若版本无问题则不需要删除,删除原生web.xml
文件的主要目的是为了防止版本过老无法支持框架运行)。在
web.xml
文件中注册 SpringMVC 框架(所有的 web 请求都是基于servlet
的)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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>
<!--告诉DispatcherServlet配置文件springmvc.xml的信息-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--表示从类路径下加载springmvc.xml的配置文件-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--指定拦截什么请求,只有后缀为.action的请求才交给DispatcherServlet处理-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app><param-value>classpath:springmvc.xml</param-value>
表示从类路径下加载 SpringMVC 的配置文件。因为 web 的请求都需要由 Servlet 来进行处理的,而 SpringMVC 的核心处理器就是一个
DispatcherServlet
,它负责接收客户端的请求,并根据请求的路径分派给对应的action
(控制器)进行处理,处理结束后依然由核心处理器DispatcherServlet
进行响应返回。DispatcherServlet
要在web.xml
文件中注册才可用。
注意:SpringMVC 的控制器是普通的
java
类,并不是 Servlet,只有DispatcherServlet
才是 Servlet。1
index.jsp <------> DispatcherServlet核心处理器(Servlet) <------> SpringMVC的控制器(普通的java类)
在
webapp
目录下新建admin
目录,在admin
目录下新建main.jsp
页面。1
2
3
4
5
6
7
8
9
10<%--main.jsp文件--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
<h1>hello,world!</h1>
</body>
</html>删除
index.jsp
页面,并新建一个index.jsp
文件,用于发送请求给服务器。1
2
3
4
5
6
7
8
9
10<%--index.jsp文件--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/demo.action">访问服务器</a>
</body>
</html>开发
HelloAction.java
–> 这就是一个控制器(相当于 javaweb 中的 servlet)。这是一个普通的类,不用继承和实现接口,类中的每个方法就是一个具体的
action
控制器。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31package com.f.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author fzy
* @date 2024/2/4 14:42
*/
// 由Spring来创建该类的实例对象
public class HelloAction {
/**
* 作为对比,看看以前的servlet方法规范:
* protected void doGet(HttpServletRequest request, HttpServletResponse response)
* throws ServletException, IOException {......}
*/
/**
* action中所有功能的实现都是由方法来完成的
* action中方法的规范
* 1.修饰符是public
* 2.方法返回值任意
* 3.方法的名称任意
* 4.方法可以没有参数,如果有,可以任意类型
* 5.要使用@RequestMapping注解,来声明一个访问路径
*/
public String hello() {
System.out.println("访问服务器成功!");
return "main"; // 这样可以直接跳到 /admin/main.jsp 页面上
}
}添加 tomcat 进行测试。