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"
               />
相关推荐
ZePingPingZe7 分钟前
SpringMVC与Servlet容器[Tomcat]
spring boot·servlet·tomcat
计算机毕设指导620 分钟前
基于微信小程序的精致护肤购物系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
进阶的小名31 分钟前
[超轻量级消息队列(MQ)] Redis 不只是缓存:我用 Redis Stream 实现了一个 MQ(自定义注解方式)
数据库·spring boot·redis·缓存·消息队列·个人开发
何中应36 分钟前
@Autowrited和@Resource注解的区别及使用场景
java·开发语言·spring boot·后端·spring
Chan1611 小时前
【 Java八股文面试 | JavaSE篇 】
java·jvm·spring boot·面试·java-ee·八股
FG.12 小时前
LangChain4j
java·spring boot·langchain4j
smileNicky15 小时前
SpringBoot系列之集成Pulsar教程
java·spring boot·后端
麦麦大数据16 小时前
J009 美食推荐可视化大数据系统vue+springboot
vue.js·spring boot·mysql·推荐算法·美食·可视化分析·沙箱支付
rfidunion16 小时前
springboot+VUE+部署(1。新建项目)
java·vue.js·spring boot
小翰子_16 小时前
Spring Boot整合Sharding-JDBC实现日志表按月按周分表实战
java·spring boot·后端