SpringMVC基础

SpringMVC基础

课程计划

  • 搭建Springmvc框架

  • 流程图

  • 实际应用案例

  • 接收参数

  • 返回值

  • 获取ServletAPI

  • REST风格

学习目标

  • 学会搭建SpringMVC框架

  • 深入了解MVC的流程

  • 可以接收多种类型的参数

  • 返回JSON数据

  • 学会REST风格

一、介绍

SpringMVC 是Spring框架的Web开发模块。

后续,会把SpringMVC融合到Spring中,形成SpringBoot框架

未来日常开发中,会非常频繁的使用SpringMVC中的知识点。

虽然是mvc的知识,会在SpringBoot框架中使用

  • 核心优势
  1. 注解驱动:@RequestParam/@RequestBody 简化了参数/数据的绑定

  2. MVC框架:控制器(Controller)+ 模型(Model)+ 视图 (View) 分离职责

  3. 数据友好:自动支持JSON等格式的序列化和反序列化,在接受和返回JSON数据方面,非常便捷

  4. 企业级功能:Restful API,拦截器,统一的异常处理,这些功能都会在企业实际应用中使用。

  5. 开发高效:约定优于配置,减少了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"
               />
相关推荐
用户83071968408213 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解14 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解14 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记18 小时前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解2 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者2 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart2 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot