SpringMVC基础
课程计划
-
搭建Springmvc框架
-
流程图
-
实际应用案例
-
接收参数
-
返回值
-
获取ServletAPI
-
REST风格
学习目标
-
学会搭建SpringMVC框架
-
深入了解MVC的流程
-
可以接收多种类型的参数
-
返回JSON数据
-
学会REST风格
一、介绍
SpringMVC 是Spring框架的Web开发模块。
后续,会把SpringMVC融合到Spring中,形成SpringBoot框架
未来日常开发中,会非常频繁的使用SpringMVC中的知识点。
虽然是mvc的知识,会在SpringBoot框架中使用
- 核心优势
-
注解驱动:@RequestParam/@RequestBody 简化了参数/数据的绑定
-
MVC框架:控制器(Controller)+ 模型(Model)+ 视图 (View) 分离职责
-
数据友好:自动支持JSON等格式的序列化和反序列化,在接受和返回JSON数据方面,非常便捷
-
企业级功能:Restful API,拦截器,统一的异常处理,这些功能都会在企业实际应用中使用。
-
开发高效:约定优于配置,减少了XML的配置,专注业务逻辑
- 底层原理
基于Servelt技术构建的框架。通过更高级的抽象,降低开发的复杂度,兼容Servlet 3.0 + 规范
二、入门案例
1、创建项目


2、引入依赖
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javasm</groupId>
<artifactId>mvcdemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>mvcdemo Maven Webapp</name>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--SpringMVC的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.2.12</version>
</dependency>
<!--Spring框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.2.12</version>
</dependency>
<!--Servlet-->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</dependency>
<!--Jackson(JSON处理)-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version><!-- 与 Spring6 兼容-->
</dependency>
<!--FastJson2 (可以不引入)-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.40</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--当前插件,辅助获取参数-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<!--添加 -parmeters ,保留方法参数名称-->
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
3、新建配置类
@Configuration
@ComponentScan(basePackages = "com.javasm")
@EnableWebMvc//开启WebMvc
public class WebMvcConfig implements WebMvcConfigurer {
//在下方,添加各种MVC配置
}
4、新建初始化类
/**
* WebInitializer 实现了 WebApplicationInitializer接口
* 用来代替web.xml配置类的
* Spring框架会自动扫描并识别实现了该接口的类
* Spring框架 提交了 SpringServletContainerInitializer 来处理当前类
* 当前应用 部署 支持Servlet 3.0 + 的容器时
* 容器会自动调用WebApplicationInitializer.onStartup()方法
* 无需手动实例化或者调用
*/
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//创建AnnotationConfigWebApplicationContext对象。声明启动类
AnnotationConfigWebApplicationContext context =
new AnnotationConfigWebApplicationContext();
context.register(WebMvcConfig.class);
//注册 DispatcherServlet
DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration =
servletContext.addServlet("dispatcher",dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
//注册 字符编码 过滤器
FilterRegistration.Dynamic encodingFilter =
servletContext.addFilter("characterEncodingFilter", CharacterEncodingFilter.class);
encodingFilter.setInitParameter("encoding","UTF-8");
encodingFilter.setInitParameter("forceEncoding","true");
encodingFilter.addMappingForUrlPatterns(null,false,"/");
}
}
5、新建Controller
/**
* @RequestMapping("/web/user") 浏览器,通过/web/user路径,可以找到当前的Controller
*/
@Controller
@RequestMapping("/web/user")
public class WebUserController {
/**
* @RequestMapping("/hello") 浏览器 /web/user/hello 找到当前方法
* 正常返回字符串,mvc中,直接返回字符串,并不是显示字符串,而是去寻找字符串对应的页面
* @ResponseBody 表示,当前的方法,返回的是json字符串。自动把返回值转成json
*
*/
@RequestMapping("/hello")
@ResponseBody
public String hello(){
return "Hello Spring MVC !!!!!";
}
}
6、测试
当前项目使用了Spring 6+,支持的最低jdk是17,所以Tomcat最低要求是Tomcat 10







三、流程
DispatcherServlet内部流程

总结
前端控制器 DispatcherServlet
处理器映射器 Handler Mappding
处理器 Controller
视图解析器 ViewResolver
最终的视图View
四 、参数
1、普通参数
1.1 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebUser {
private Integer uid;
private String username;
}
1.2 Controller
@PostMapping("/doAdd1")
@ResponseBody
public String doAdd1(Integer id,String name){
WebUser webUser = new WebUser();
webUser.setUid(id);
webUser.setUsername(name);
return name;
}
1.3 异常
17-Nov-2025 11:32:57.142 警告 [http-nio-8080-exec-1] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]
返回的数据类型是JSON,但是MVC中没有配置

2、数组
@PostMapping("/doAdd2")
@ResponseBody
public String doAdd2(String[] hobbys){
return Arrays.toString(hobbys);
}

3、对象
@PostMapping("/doAdd3")
@ResponseBody
public String doAdd3(WebUser webUser){
return webUser.toString();
}


4、包装类
4.1 vo
@Data
public class WebUserVo{
private WebUser webUser;
private String[] hobbys;
List<Player> playerList;
Map<Integer,String> items;
}
4.2 model
@Data
public class Company {
private Integer cid;
private String name;
}
@Data
public class Player {
private Integer id;
private String nickname;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebUser {
private Integer uid;
private String username;
private Company company;
}
4.3 Controller
@PostMapping("/doAdd4")
@ResponseBody
public String doAdd4(WebUserVo vo){
return "success";
}
4.4 测试
先修改tomcat的配置文件 server.xml

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
relaxedQueryChars="[,]"
URIEncoding="UTF-8"
responseEncoding="UTF-8"
useBodyEncodingForURI="true"
/>
