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"
               />
相关推荐
stevenzqzq2 小时前
android recyclerview缓存2_四级缓存机制
android·spring boot·缓存
222you2 小时前
SpringBoot对SpringMVC的整合
java·spring boot·后端
刘一说2 小时前
深入理解 Spring Boot 高级特性:条件化 Bean 注册机制
java·spring boot·后端
启山智软2 小时前
使用 Spring Boot + Vue.js 组合开发多商户商城(B2B2C平台)是一种高效的全栈技术方案
vue.js·spring boot·后端
Qiuner3 小时前
Spring Boot 进阶:application.properties 与 application.yml 的全方位对比与最佳实践
java·spring boot·后端
optimistic_chen4 小时前
【Java EE进阶 --- SpringBoot】Spring事务
java·spring boot·笔记·spring·java-ee·事务
李昊哲小课4 小时前
手写 Spring Boot 嵌入式Tomcat项目开发教学
spring boot·后端·tomcat
麦兜*4 小时前
Redis在Web3中的应用探索:作为链下状态缓存与索引层
java·spring boot·redis·spring cloud·缓存·docker·web3
百***35944 小时前
Spring Boot 中 RabbitMQ 的使用
spring boot·rabbitmq·java-rabbitmq