# SpringMVC

1. 什么是 MVC

MVC 是一种软件架构的思想,将软件按照模型,视图,控制器来划分

M: Model, 模型层,指工程中的 javaBean, 作用是处理数据

JavaBean 分为两类:

  • 一类称为实体类 Bean: 专门存储业务数据的,如 Student,User 等

  • 一类称为业务处理 Bean: 指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问

V: View, 视图层,指工程中的 html 或 jsp 等页面,作用是与用户进行交互,展示数据

C: Controller, 控制层,指工程中的 Servlet, 作用是接收请求和响应浏览器

MVC 的工作流程:

用户通过视图层发送请求到服务器,在服务器中请求被 Controller 接收,Controller 调用相应的 Model 层处理请求,处理完毕将结果返回到 Controller,Controller 再根据请求处理的结果找到相应的 View 视图,渲染数据后最终响应给浏览器

# Spring 概述

  • SpringMVC 技术与 Servlet 技术功能等同,均属于 web 层开发技术

当前 web 程序的工作流程

web 通过浏览器访问页面,前端页面使用异步提交的方式发送到后端服务器,后端服务器采用,表现层,业务层,数据层的三层架构的形式进行开发,页面发送的请求由表现层接收,获取用户的请求参数后,将参数传递到业务层再由业务层访问数据层得到用户需要访问的数据后将数据返回给表现层

image_2023-02-28-09-55-34

表现层拿到数据后将数据转换成 json 格式发送给前端页面,前端页面接收数据后解析数据并组织成用户浏览的最终页面信息交给浏览器

image_2023-02-28-10-04-48

  • SpringMVC 是一种基于 Java 实现 MVC 模型的轻量级 web 框架

  • 优点

    • 使用简单,开发便捷(相比于 Servlet)
  • 灵活性强

image_2023-02-28-10-09-22

  • 小结
    • SpringMVC 是一种表现层框架技术
    • SpringMVC 用于进行表现层功能开发

# 操作步骤

1. 使用 SpringMVC 技术需要先导入 SpringMVC 坐标与 Servlet 坐标

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.2.10.RELEASE</version>
</dependency>
<build>
   <plugins>
      <plugin>
         <groupId>org.apache.tomcat.maven</groupId>
         <artifactId>tomcat7-maven-plugin</artifactId>
         <version>2.2</version>
         <configuration>
            <port>80</port>
            <path>/</path>
         </configuration>
      </plugin>
   </plugins>
</build>

image_2023-02-28-11-01-23

2. 创建 SpringMVC 控制器类 (等同于 Servlet 功能)

@SuppressWarnings("all")
// 使用 @Controller 定义 bean
@Controller
public class UserController {
//    设置当前路径的访问操作
    @RequestMapping("/save")
//    设置当前操作的返回值类型
    @ResponseBody
    public String save(){
        System.out.println("user save running...");
        return "{'module':'springMVC'}";
    }
}

3. 初始化 SpringMVC 环境 (同 Spring 环境), 设定 SpringMVC 加载对应的 bean

@SuppressWarnings("all")
// 创建 SpringMvc 的配置类,加载 controller 对应的 bean
@Configuration
@ComponentScan("com.dkx.springmvc")
public class SpringMvcConfig {
}

4. 初始化 Servlet 容器,加载 SpringMVC 环境,并设置 SpringMVC 技术处理的请求

// 定义一个 Servlet 容器启动的配置类,在里面加载 Spring 的配置
@SuppressWarnings("all")
public class ServletContainerInitializerConfig extends AbstractDispatcherServletInitializer {
//    加载 SpringMvc 容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext c = new AnnotationConfigWebApplicationContext();
        c.register(SpringMvcConfig.class);
        return c;
    }
//    设置哪些请求归属 SpringMvc 处理
    @Override
    protected String[] getServletMappings() {
//        设置所有请求归 SpringMvc 去处理
        return new String[]{"/"};
    }
//    加载 SpringMvc 容器的配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

# @Controller

  • 类型:类注解

  • 位置:SpringMvc 控制器类定义上方

  • 作用:设定 SpringMvc 的核心控制器 bean

# @RequestMapping

  • 类型:方法注解

  • 位置:SpringMvc 控制器方法定义上方

  • 作用:设置当前控制器方法请求访问路径

  • 相关属性

    • value (默认): 请求访问路径
  • SpringMVC 入门程序开发总结 (1+N)

    • 一次性工作
      • 创建工程,设置服务器,加载工程
      • 导入坐标
      • 创建 web 容器启动类,加载 SpringMVC 配置,并设置 SpringMVC 请求拦截路径
      • SpringMVC 核心配置类(设置配置类,扫描 controller 包,加载 Controller 控制器 bean)
    • 多次工作
      • 定义处理请求的控制器类
      • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回 json 数据(@ResponseBody)
  • AbstractDispatcherServletInitializer 类是 SpringMvc 提供的快速初始化 web3.0 容器的抽象类

  • AbstractDispatcherServletInitializer 提供三个接口方法供用户实现

    • createServletApplicationContext () 方法,创建 Servlet 容器时,加载 SpringMVC 对应的 bean 并放入 WebApplicationContext 对象范围中,而 WebApplicationContext 的范围为 ServletContext 范围,即整个 web 容器范围
//    加载 SpringMvc 容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext c = new AnnotationConfigWebApplicationContext();
        c.register(SpringMvcConfig.class);
        return c;
    }
  • getServletMappings () 方法,设定 SpringMVC 对应的请求映射路径,设置为 / 表示拦截所有请求,任意请求都将转入到 SpringMVC 进行处理
//    设置哪些请求归属 SpringMvc 处理
    @Override
    protected String[] getServletMappings() {
//        设置所有请求归 SpringMvc 去处理
        return new String[]{"/"};
    }
  • createRootApplicationContext () 方法,如果创建 Servlet 容器时需要加载非 SpringMVC 对应的 bean, 使用当前方法进行,使用方式同 createServletApplicationContext ()
//    加载 SpringMvc 容器的配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
}

# 入门案例工作流程分析

  • 启动服务器初始化过程
  1. 服务器启动,执行 ServletContainersInitConfig 类,初始化 web 容器

  2. 执行 createServletApplicationContext 方法,创建了 WebApplicationContext 对象

  3. 加载 SpringMvcConfig

  4. 执行 @ComponentScan 加载对应的 bean

  5. 加载 UserController, 每个 @RequestMapping 的名称对应一个具体的方法

  6. 执行 getServletMapping 方法,定义所有的请求都通过 SpringMvc

  • 单次请求过程
  1. 发送请求 localhost/save

  2. web 容器发现所有请求都经过 SpringMVC, 将请求交给 SpringMVC 处理

  3. 解析请求路径 /save

  4. 由 /save 匹配执行对应的方法 save ()

  5. 执行 save ()

  6. 检测到有 @ResponseBody 直接将 save () 方法的返回值作为响应体返回给请求方

image_2023-02-28-14-48-08

# Controller 加载控制与业务 bean 加载控制

  • SpringMVC 相关 bean (表现层 bean)

  • Spring 控制的 bean

    • 业务 bean (Service)
    • 功能 bean (DataSource 等)
  • SpringMVC 相关 bean 加载控制

    • SpringMVC 加载的 bean 对应的包均在 com.dkx.spring.controller 包内
  • Spring 相关 bean 加载控制

    • 方式一:Spring 加载的 bean 设定扫描范围为 com.dkx.spring, 排除掉 controller 包内的 bean
    • 方式二:Spring 加载的 bean 设定扫描范围为精准范围,例如 Service 包,dao 包等
    • 方式三:不区分 Spring 与 SpringMVC 的环境,加载到同一个环境中

image_2023-02-28-14-57-35

# @ComponentScan

  • 名称:@ComponentScan

  • 类型:类注解

  • 作用:用于设定扫描 Bean 路径,多个数据使用数组格式

  • 范例:

@Configuration
@ComponentScan(value = "com.dkx.spring",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        )
)
public class SpringMvcConfig {
}
  • 属性
    • excludeFilters: 排除扫描路径加载的 bean, 需要指定类别 (type) 与具体项 (classes)
    • includeFilters: 加载指定的 bean, 需要指定类别 (type) 与具体项 (classes)

# 简化初始化 Servlet 容器

// 定义简化 Servlet 容器启动的配置类,在里面加载 Spring 的配置
@SuppressWarnings("all")
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
// 加载 Spring 容器配置
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
// 加载 SpringMVC 容器配置
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
// 设置哪些请求归属 SpringMVC 处理
    @Override
    protected String[] getServletMappings() {
       // 设置所有请求归属 SpringMVC 去拦截处理
        return new String[]{"/"};
    }
}

# PostMan 简介

  • PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件

  • 作用:常用于进行接口测试

  • 特征

    • 简单
    • 实用
    • 美观
    • 大方

# PostMan 基本使用

  • 注册登录

  • 创建工作空间 / 进入工作空间

  • 发起请求测试结果

# 请求与响应

# 请求的映射路径

问题

  • 如果两个 Controller 不同的类中有同样一个访问路径为 /save 那么,将会报错如下:

image-20230301103255294

导致错误的代码

  • UserController
@SuppressWarnings("all")
@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("User save running...");
        return "{'module':'springMvc User Save'}";
    }
}
  • BookController
@SuppressWarnings("all")
@Controller
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("Book save running...");
        return "{'module':'springMVC Book save'}";
    }
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("Book delete running...");
        return "{'module':'springMVC Book delete'}";
    }
}
  1. 团队多人开发,每人设置不同的请求路径,冲突问题如何解决 ---<font style="color:red"> 设置模块名作为请求路径前缀 </font>
  • 在 UserController 类中的 save 访问路径加上 user 的一级路径,BookController 中也要这样加上统一规范
@SuppressWarnings("all")
@Controller
public class UserController {
    @RequestMapping("/user/save")
    @ResponseBody
    public String save(){
        System.out.println("User save running...");
        return "{'module':'springMvc User Save'}";
    }
}

访问路径查看效果

image_2023-03-01-10-45-02

# 简化书写

  • 类上定义整个模块的路径前缀

  • 类中定义访问路径的具体

@SuppressWarnings("all")
@Controller
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("Book save running...");
        return "{'module':'springMVC Book save'}";
    }
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("Book delete running...");
        return "{'module':'springMVC Book delete'}";
    }
}

访问结果

image_2023-03-01-11-01-34

# 请求方式

# Get 请求

  • 处理中文乱码问题
    • 在 pom.xml 中配置 Tomcat7 的编码具体看如下:
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <port>80</port>
        <path>/</path>
        <uriEncoding>
            UTF-8
        </uriEncoding>
    </configuration>
</plugin>
@SuppressWarnings("all")
@Controller
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(String name,int age){
        System.out.println("Book save running..."+name+","+age);
        return "{'module':'springMVC Book save'}";
    }
}

Send Request

image_2023-03-01-11-15-51

show console result

image_2023-03-01-11-17-02

# Post 请求

  • 普通参数:form 表单 Post 请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

Post 请求不能在 Url 中写?来进行参数的赋值

image_2023-03-01-11-18-32

我们需要在响应体中进行赋值

image_2023-03-01-11-22-51

image_2023-03-01-11-26-14

show console result

image_2023-03-01-11-26-51

# 处理请求参数中文乱码问题

  • 在 config 目录下 ServletConfig 类中定义处理乱码的过滤方法
@SuppressWarnings("all")
public class ServeltConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
//    处理乱码
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter character = new CharacterEncodingFilter();
        character.setEncoding("UTF-8");
//        多个 character 使用,(逗号) 分隔
        return new Filter[]{character};
    }
}

image_2023-03-01-11-38-16

send request

image_2023-03-01-11-44-17

show console result

image_2023-03-01-11-44-39

  • <font style="color:red"> 注意 </font>: 此处理乱码方式对 POST 有效,但对 GET 无效

# @RequestParam

  • 问题:如果发送请求参数的 key 与我们接收参数的参数名不相同那么则接收不到参数

  • 类型:形参注解

  • 位置:SpringMvc 控制器方法形参定义前面

  • 作用:绑定请求参数与处理器方法形参间的关系

  • 参数:

    • required: 是否为必传参数
    • defaultValue: 参数默认值

send request

image_2023-03-01-11-58-02

show console result

image_2023-03-01-11-57-49

  • 用于在访问路径的方法的参数列表中对请求参数进行形参之间绑定关系
@SuppressWarnings("all")
@Controller
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
//                    RequestParam 绑定请求参数和形参之间的关系
    public String save(@RequestParam("n") String name, int age){
        System.out.println("Book save running..."+name+","+age);
        return "{'module':'springMVC Book save'}";
    }
}

send request

image_2023-03-01-11-59-05

show console result

image_2023-03-01-11-59-33

# 五种数据类型的传参方式

# 普通参数:

  • url 地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

image_2023-03-01-14-50-09

  • 请求参数名与形参变量名 <font style="color:red"> 不同 </font>, 使用 < font style="color:red">@RequestParam</font> 绑定参数关系
@RequestMapping("/save")
@ResponseBody
//                RequestParam 绑定请求参数和形参之间的关系
public String save(@RequestParam("n") String name, int age){
   System.out.println("Book save running..."+name+","+age);
   return "{'module':'springMVC Book save'}";
}

# POJO 参数 / 嵌套 POJO 参数:

前者:请求参数名与形参对象属性名相同,定义 POJO 类型形参即可接收参数

后者:POJO 对象中包含 POJO 对象

<font style="color:red"> 注意: </font> 编写实体类代码的时候一定加上 getter 和 setter 还有 toString 否则值为 null

image_2023-03-01-14-57-29

//    pojo 参数,如果发送请求的参数名和 pojo 类中的属性名相同则可以接收到参数值
@RequestMapping("/save")
@ResponseBody
public String save(User u){
   System.out.println(u);
   return "{'module':'springMvc User Save'}";
}

# 数组参数:

  • 请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

image_2023-03-01-15-01-24

//    数组参数
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
   System.out.println(Arrays.toString(likes));
   return "{'module':'springMvc User arrayParam running...'}";
}

# 集合保存普通参数:

  • 请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系

image_2023-03-01-15-03-14

//    集合参数
@RequestMapping("/listParam")
@ResponseBody           /*List 是引用类型它会创建对象 set 属性,加上注解来让它直接往里面添加值 */
public String listParam(@RequestParam List<String> likes){
   System.out.println(likes);
   return "{'module':'springMvc User listParam running...'}";
}

# 传递 json 数据

  1. 导入坐标
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>
  1. 设置发送 json 数据(请求 body 中添加 json 数据)

    image-20230417173450225

  2. 开启自动转换 json 数据的支持

image-20230301170021890

<font style="color:red"> 注意事项:</font>@EnableWebMvc 注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即 json 数据进行自动类型转换

  1. 设置接收 json 数据

  2. 设置接收 json 数据 @RequestBody

@RequestMapping("/json")
    @ResponseBody
//    RequestBody: 用于接收前端给后端传递的 json 数据
    public String listParamforJson(@RequestBody List<String> likes){
        System.out.println(likes);
        return "{'module':'springMvc User listParamforJson'}";
    }
//-------------------------------Run Result-------------------------------
[,, Wrapr, 篮球]

# json 数组

  • 在 SpringMvcConfig 配置类中 配置注解 @EnableWebMvc
@SuppressWarnings("all")
@Configuration
@ComponentScan("com.dkx.spring")
@EnableWebMvc
public class SpringMvcConfig {
}
  • Controller 类
@SuppressWarnings("all")
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/json")
    @ResponseBody
//    RequestBody: 用于接收前端给后端传递的 json 数据
    public String listParamforJson(@RequestBody List<String> likes){
        System.out.println(likes);
        return "{'module':'springMvc User listParamforJson'}";
    }
}

send request

image_2023-03-01-15-45-34

show console result

image_2023-03-01-16-09-14

# json 对象 (POJO)

  • User
@SuppressWarnings("all")
public class User {
    private String name;
    private String name1;
    private String name2;
    private String name3;
    private String name4;
    private Address address;
    public User() {
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", name1='" + name1 + '\'' +
                ", name2='" + name2 + '\'' +
                ", name3='" + name3 + '\'' +
                ", name4='" + name4 + '\'' +
                ", address=" + address +
                '}';
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public User(String name, String name1, String name2, String name3, String name4, Address address) {
        this.name = name;
        this.name1 = name1;
        this.name2 = name2;
        this.name3 = name3;
        this.name4 = name4;
        this.address = address;
    }
    public User(String name, String name1, String name2, String name3, String name4) {
        this.name = name;
        this.name1 = name1;
        this.name2 = name2;
        this.name3 = name3;
        this.name4 = name4;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName1() {
        return name1;
    }
    public void setName1(String name1) {
        this.name1 = name1;
    }
    public String getName2() {
        return name2;
    }
    public void setName2(String name2) {
        this.name2 = name2;
    }
    public String getName3() {
        return name3;
    }
    public void setName3(String name3) {
        this.name3 = name3;
    }
    public String getName4() {
        return name4;
    }
    public void setName4(String name4) {
        this.name4 = name4;
    }
}
  • Address
@SuppressWarnings("all")
public class Address {
    private String provind;
    private String city;
    public Address() {
    }
    public Address(String provind, String city) {
        this.provind = provind;
        this.city = city;
    }
    public String getProvind() {
        return provind;
    }
    public void setProvind(String provind) {
        this.provind = provind;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Override
    public String toString() {
        return "Address{" +
                "provind='" + provind + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}
  • UserController
@RequestMapping("/pojo")
    @ResponseBody
//    RequestBody: 用于接收前端给后端传递的 json 数据
    public String pojoParam(@RequestBody User u){
        System.out.println(u);
        return "{'module':'springMvc User pojoParam'}";
    }

send request

image_2023-03-01-16-42-25

# json 数组 (POJO)

@RequestMapping("/listPOJO")
    @ResponseBody
//    @RequestBody: 用于接收前端给后端传递的 json 数据
    public String listPOJOforParamJson(@RequestBody List<User> list){
        System.out.println(list);
        return "{'module':'springMvc User listPOJOforParamJson'}";
    }

send request

image_2023-03-01-16-50-01

# @EnableWebMvc

  • 类型:配置类注解

  • 位置:SpringMvc 配置类定义上方

  • 作用: 开启 SpringMvc 多项辅助功能

# @RequestBody

  • 类型:形参注解

  • 位置:SpringM vc 控制器方法形参定义前面

  • 作用: 将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

# @RequestBody 与 RequestParam 区别

  • 区别

    • @RequestParam 用于接收 url 地址传参,表单传参 (application/x-www-form-urlencoded)
    • @requestBody 用于接收 json 数据 (application/json)
  • 应用

    • 后期开发中,发送 json 格式数据为主,@RequestBody 应用较广
    • 如果发送非 json 格式数据,选用 @RequestParam 接收请求参数

# 日期类型参数传递

  • 日期类型数据基于系统不同格式也不尽相同
    • 2088-08-18
    • 2088/08/18
    • 08/18/2088

# @DateTimeFormat

  • 类型:形参注解

  • 位置:SpringMvc 控制器方法形参前面

  • 作用:设定日期时间型数据格式

  • 属性:pattern: 日期时间格式字符串

public class User {
    private String name;
   // 设定日期时间类型格式,如果格式在 json 传递参数时不一致则会导致报错
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date date;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", date=" + date +
                '}';
    }
}

controller

@Controller
public class UserController {
    @RequestMapping("/json")
    @ResponseBody
    public String save(@RequestBody User u){
        System.out.println(u);
        return "{'model':'springMVC'}";
    }
}
//--------------------------------Result--------------------------------
User{name='Dkx', date=Wed Dec 19 08:00:00 CST 2001}

PostMan, 发送 json 的数据

{
    "name":"Dkx",
    "date":"2001-12-19"
}

# 类型转换器

帮我们进行类型转换的接口,将 Date 转换为 String 类型但是从第二个 Date 参数开始不进行自动转换

  • Converter 接口
@FunctionalInterface
public interface Converter<S, T> {
    @Nullable
    T convert(S var1);
}
  • 请求参数年龄数据 (String --> Integer)

  • 日期格式转换 (String --> Date)

  • @EnablewebMvc 功能之一:根据类型匹配对应的类型转换器

# 响应

  • 响应页面
//    响应页面 / 跳转页面
    @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("页面跳转");
        return "/page.jsp";
    }
  • 响应数据
    • 文本数据
//    响应文本数据
    @RequestMapping("/toText")
//    [WARNING] No mapping for GET /response text: 找一个文件为 response 找不到报错异常
//    加上 ResponseBody 用于接收 json 数据 (application/json)
    @ResponseBody
    public String toText(){
        System.out.println("返回纯文本数据");
        return "response text";
    }
  • json 数据
//    响应 POJO 对象
    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println("返回POJO对象");
        User user = new User();
        user.setName("小日子-刘桑");
        user.setAge(20);
        return user;
    }
  • 响应 json 数据 (对象集合转 json 数组)
@RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println("返回Json集合数据");
        User user = new User();
        user.setName("刘桑");
        user.setAge(23);
        User user1 = new User();
        user1.setName("张三");
        user1.setAge(22);
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user1);
        return list;
    }

# @ResponseBody

  • 类型:方法注解

  • 位置:SpringMvc 控制器方法定义上方

  • 作用:设置当前控制器返回值作为响应体

帮我们转换的接口:HttpMessageConverter 接口