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"
/>

790

被折叠的 条评论
为什么被折叠?



