09【SpringMVC的Json支持】

news2024/11/25 18:27:25

文章目录

  • 三、Json的支持
    • 3.1 响应json
      • 3.1.1 @ResponseBody
      • 3.1.2 @JsonIgnore
      • 3.1.3 @JsonFormat
      • 3.1.4 ResponseEntity
      • 3.1.5 作用在类上
      • 3.1.6 @RestController
    • 3.2 请求Json
      • 3.2.1 @RequestBody
      • 3.2.2 HttpEntity
      • 3.2.3 封装Json数据


三、Json的支持

SpringMVC支持自动将JSON转换成Java对象,也支持将Java对象自动转成JSON,SpringMVC本身没有对JSON数据处理的类库,要支持JSON的自动转换必须导入JSON的支持包

Jackson依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.9.RELEASE</version>
    </dependency>

    <!--Jackson依赖-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-api</artifactId>
        <version>8.5.41</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.18</version>
    </dependency>
</dependencies>

3.1 响应json

  • 准备实体类:
package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class City {

    private Integer id;         // 城市id
    private String cityName;    // 城市名称
    private Double GDP;         // 城市GDP,单位亿元
    private Boolean capital;    // 是否省会城市
}

3.1.1 @ResponseBody

作用:将响应的信息放入响应体中,默认情况下Java对象会被application/json处理;

package com.dfbz.controller;

import com.dfbz.entity.City;
import com.dfbz.entity.Province;
import com.dfbz.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Controller
@RequestMapping("/demo01")
public class Demo01Controller {

    @ResponseBody           // 将结果集以json形式响应
    @GetMapping("/demo01")
    public City demo01() throws Exception {

        City city = new City(1, "南昌", 5500.0, true);
        return city;
    }

    @ResponseBody           // 将结果集以json形式响应
    @GetMapping(value = "/demo02")
    public List<City> demo02() throws Exception {

        List<City> cityList = new ArrayList<>();
        cityList.add(new City(1, "南京", 14000.00, true));
        cityList.add(new City(2, "南通", 2400.00, false));
        cityList.add(new City(3, "南阳", 4000.00, false));
        return cityList;
    }

    @ResponseBody
    @GetMapping(value = "/demo03")
    public String demo03() throws Exception {
        return "hello";                 // 响应的信息被放在响应体中,而不是当做视图跳转
    }
}

查看响应类型:

在这里插入图片描述

3.1.2 @JsonIgnore

作用:将实体转换为json时指定忽略的属性;

  • Province:
package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Province {
    private Integer id;
    private String name;
}
  • City:
package com.dfbz.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class City {

    private Integer id;         // 城市id
    private String cityName;    // 城市名称
    private Double GDP;         // 城市GDP,单位亿元
    private Boolean capital;    // 是否省会城市

    @JsonIgnore
    private Province province;  // 所属省份
    
    public City(Integer id, String cityName, Double GDP, Boolean capital) {
        this.id = id;
        this.cityName = cityName;
        this.GDP = GDP;
        this.capital = capital;
    }

}
  • Controller:
@ResponseBody           // 将结果集以json形式响应
@RequestMapping(value = "/demo04")
public City demo04() throws Exception{

    City city = new City(1, "南昌", 5500.0, true,new Province(1,"江西"));
    return city;
}

访问:http://localhost:8080/demo/demo04(没有忽略province属性之前)

在这里插入图片描述

添加忽略属性后访问:http://localhost:8080/demo/demo04

在这里插入图片描述

3.1.3 @JsonFormat

  • 作用:将Date按照指定的格式转换为字符串
package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private Integer id;
    private String name;
    private Integer age;

    private Date birthday;
}
  • Controller:
@ResponseBody
@RequestMapping(value = "/demo05")
public Student demo05() throws Exception{
    return new Student(1,"zhangsan",20,new Date());
}

访问:http://localhost:8080/demo01/demo05

在这里插入图片描述

添加日期格式化注解:

// 转换为json时按照什么格式进行转换
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private Date birthday;

再次访问:http://localhost:8080/demo01/demo05

在这里插入图片描述

3.1.4 ResponseEntity

作用:封装响应的信息

/**
 * 响应ResponseEntity
 * @return
 */
@ResponseBody
@RequestMapping(value = "/demo06")
public ResponseEntity<City> demo06() {

    // 响应体
    City city = new City(1, "南宁", 5000.0D, true, new Province(1, "广西"));

    // 响应头
    HttpHeaders headers = new HttpHeaders();
    headers.put("test", Arrays.asList("abc"));

    // 创建一个响应报文
    ResponseEntity<City> responseEntity = new ResponseEntity<>(city, headers, HttpStatus.OK);

    return responseEntity;
}

访问:http://localhost:8080/demo01/demo06

在这里插入图片描述

3.1.5 作用在类上

@ResponseBody注解不仅可以标注在方法上,还可以标注在类上,当该注解标注在类上时,该类的所有方法的返回值都会当作Json响应到前端;相当于在该类的所有的方法上都标注了@ResponseBody注解

在这里插入图片描述

package com.dfbz.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Controller
@ResponseBody
@RequestMapping("/test")
public class TestController {

    @GetMapping("/hello")
    public String str() {
        return "hello @ResponseBody..";
    }
}

访问:http://localhost:8080/test/hello

在这里插入图片描述

3.1.6 @RestController

@RestController是@Controller+@ResponseBody注解的整合版,拥有两个注解的功能,既能当前Bean注入到IOC容器,又能让当前Controller的所有方法的返回值以Json响应;

package com.dfbz.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
//@Controller
//@ResponseBody

@RestController                 // @Controller+/@ResponseBody
@RequestMapping("/test")
public class TestController {

    @GetMapping("/hello")
    public String str() {
        return "hello @ResponseBody...";
    }
}

3.2 请求Json

3.2.1 @RequestBody

作用:获取请求体的内容,注意:get请求方式是没有请求体的;

package com.dfbz.controller;

import com.dfbz.entity.Province;
import com.dfbz.entity.Student;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Controller
@RequestMapping("/demo02")
public class Demo02Controller {

    /**
     * 获取请求体的参数
     *
     * @param str
     * @param response
     * @throws Exception
     */
    @RequestMapping("/demo01")
    public void demo01(@RequestBody String str, HttpServletResponse response) throws Exception {          // 获取请求体的内容

        System.out.println(str);
        response.getWriter().write(str);
        System.out.println("--------------");
    }
}
  • HTML表单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="/js/jquery-3.5.1.min.js"></script>
</head>
<body>
<form action="/demo02/demo01" method="post">

    <input type="text" name="id">
    <input type="text" name="name">

    <input type="submit">
</form>

<button id="btn">sendRequest</button>

<script>

    $(function () {
        $("#btn").click(function () {
            var province = {id: 1, name: "吉林省"}
            $.post({
                url: "/demo02/demo01",
                
                // 如果不加这一句,ajax默认的提交格式为: application/x-www-form-urlencoded
                contentType: "application/json",
                data: JSON.stringify(province),
                success: function (res) {
                    console.log(res);
                }
            })
        })
    })
</script>
</body>
</html>

分别使用表单提交和Json提交测试:

在这里插入图片描述

3.2.2 HttpEntity

作用:接收前端提交的参数,包括请求体和请求头信息

/**
 * 使用HttpEntity当做参数
 *
 * @param entity
 * @throws Exception
 */
@RequestMapping("/demo02")
@ResponseBody
public String demo02(HttpEntity<String> entity) throws Exception {
    HttpHeaders headers = entity.getHeaders();        // 获取请求头
    System.out.println(headers);
    String provinceJsonStr = entity.getBody();                    // 获取请求体
    System.out.println(provinceJsonStr);
    System.out.println("----------------");
    return provinceJsonStr;
}

访问:http://localhost:8080/demo02/demo02

在这里插入图片描述

3.2.3 封装Json数据

@RequestBody不仅可以接收请求体中的参数,还可以将请求体数据为Json的转换为Java实体类型;

/**
 * 把JSON数据转换为Java对象
 * @param province
 * @return
 * @throws Exception
 */
@ResponseBody
@RequestMapping("/demo03")
public Province demo03(@RequestBody Province province) throws Exception {
    return province;
}


/**
 * 使用HttpEntity当做参数(封装成对象)
 *
 * @param entity
 * @throws Exception
 */
@RequestMapping("/demo04")
@ResponseBody
public Province demo04(HttpEntity<Province> entity) throws Exception {
    HttpHeaders headers = entity.getHeaders();        // 获取请求头
    System.out.println(headers);
    Province province = entity.getBody();                    // 获取请求体

    return province;
}
  • 前端:
$("#btn").click(function () {

    var json = {id: 1, name: "福建省"};

    // 必须将json对象转换为json字符串
    var jsonStr=JSON.stringify(json);
    $.post({		
       // url:"/demo02/demo03",				// 测试demo03和demo04
        url:"/demo02/demo04",
        data:jsonStr,		
        
        // 如果不加这一句,ajax默认的提交格式为: application/x-www-form-urlencoded
        contentType:"application/json",
        success:function (res) {
          	 console.log(res);
        }
    })
})

注意:JQuery在传递Json对象(不是Json字符串)数据到后台时,在底层会将Json对象转换为form表单进行传递;如果本次的提交类型(Content-Type)为application/x-www-form-urlencoded,那么在后端也是可以封装为Java对象的,前提是不能使用@RequestBody注解

因此在使用JQuery的ajax提交时,传递Json对象到后端时不能使用@RequestBody注解接收参数,而是使用默认的表单数据封装方式,即什么注解都不写;

/**
 * 接收表单提交的数据(JSON对象也可以)
 * @param province
 * @return
 * @throws Exception
 */
@RequestMapping("/demo05")
@ResponseBody
public Province demo05(Province province) throws Exception {
    return province;
}

表单和JSON对象提交:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="/js/jquery-3.5.1.min.js"></script>
</head>
<body>
<form action="/demo02/demo05" method="post">

    <input type="text" name="id">
    <input type="text" name="name">

    <input type="submit">
</form>

<button id="btn">sendRequest</button>

<script>

    $(function () {
        $("#btn").click(function () {
            var province = {id: 1, name: "辽宁省"}
            $.post({
                url: "/demo02/demo05",
                
                // 使用表单的请求方式(这也是默认的请求类型)			
                contentType: "application/x-www-form-urlencoded",			
                data: province,				// 直接提交JSON对象
                success: function (res) {
                    console.log(res);
                }
            })
        })
    })
</script>
</body>
</html>

点击sendRequest按钮发送请求,打开F12抓包工具:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu更换清华源

进入&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择你的ubuntu版本 vi /etc/apt/sources.list 如果执行apt update 报镜像源证书错误 &#xff08;1&#xff09;将/etc/apt/sources.list中的https改为http, 然后执行apt update&#xff1b; &#…

Linux进程状态

目录 一、普适操作系统的进程状态 1.什么是进程状态 2.三种重要的进程状态 &#xff08;1&#xff09;运行状态 &#xff08;2&#xff09;阻塞状态 &#xff08;3&#xff09;挂起状态 二、Linux源代码中的进程状态 三、Linux进程状态 1.运行状态 2.睡眠状态&#x…

AI加速(九): 深度理解吞吐量和延时

前文回顾&#xff1a; AI加速&#xff08;二&#xff09;| 计算机存储和计算的分离 AI加速&#xff08;三&#xff09;| 每条指令都是流水线的工人 AI加速&#xff08;四&#xff09;| 衣柜般的分层存储设计 AI加速&#xff08;五&#xff09;| 一个例子看懂流水——从指令到…

Java多线程之Thread和Runnable以及Callable接口多线程的简单实现(适合小白入门,十分简单)

Java多线程之Thread和Runnable一、介绍1、程序2、进程3、线程4、整体思路5、注意二、Thread1、思路流程2、样例代码3、多线程下载图片三、Runnable1、思路流程2、样例代码3、多线程下载图片四、Callable接口&#xff08;仅作了解&#xff09;1、具体流程2、优点3、样例五、两者…

视频编解码 — SVC可伸缩性

目录 SVC分层 时域SVC 空域SVC 在一对多的情况下&#xff0c;根据每个接收端的带宽不同&#xff0c;灵活调整发送码率 SVC分层 第0层&#xff0c;最底层&#xff0c;可以独立进行编解码&#xff0c;不依赖第1&#xff0c;第2层第1层&#xff0c;依赖于第0层第2层&#xff…

Linux中的/proc文件系统详解(C/C++代码实现)

Linux /proc这个特殊的目录包含有关Linux系统的所有详细信息&#xff0c;包括其内核、进程和配置参数。通过研究/proc目录&#xff0c;可以了解Linux命令的工作原理&#xff0c;甚至可以执行一些管理任务。 走进Linux的/proc目录 今天&#xff0c;我们将查看/proc目录并熟悉它…

最新版 苹果 IOS AppStore证书申请全流程 包括p12文件

第一步 登陆开发者网站并进入证书管理页。 辅助工具网站地址&#xff1a;http://www.applicationloader.net/ 第二步 添加【Certificates】证书。在这里插入图片描述 第三步 进入添加页后&#xff0c;根据需求选择。 第四步 选择好环境之后&#xff0c;这里需要选择一个…

GitHub上传本地程序操作的问题解决汇总

1、新建远程仓库 2、提交本地程序到GitHub 完整命令汇总&#xff0c;这些命令的顺序已解决目前Git提交所遇到的下面问题 存在的问题展示部分没贴出来&#xff0c;可以先按命令顺序走一遍流程。 git init //把这个目录变成Git可以管理的仓库git checkout -b main //切换至main默…

如何零基础自学 Python ?听我娓娓道来

如何零基础自学 Python &#xff1f; 前言 今天这篇文章是对初学者的一篇学习资料分享与总结&#xff01; 简单介绍下笔者的自学之路 起初学习 Python 是在 2020 年&#xff0c;那时临近毕业&#xff0c;由于面临着找工作的不确定性&#xff0c;便学习了相关的网络安全知识&…

计组作业笔记【 总线 】

系统总线按传输内容不同分为数据总线&#xff0c;地址总线&#xff0c;控制总线。 片内总线与系统总线是并列关系&#xff0c;与通信总线一同作为总线按功能的分类。 所以选B 总线复用是指一种信号线在不同时间传输不同的信息。 所以该题选A。 当某设备正获得了总线控制权时…

系统安装技能测试

系统安装技能测试 目录 系统安装技能测试 一、制作PE U盘 安装完成之后查看U盘是否有PE 使用制作好的U盘进入PE界面 二、使用虚拟机进入PE界面 虚拟机成功进入PE主界面 三、PE界面进行分区操作 在PE模式下&#xff0c;使用ISO进行系统安装 四、PE系统备份 五、使用PXE进行网克…

Springboot毕业设计毕设作品,微信校园疫情防控小程序设计与实现

功能清单 【后台管理员功能】 关于我们设置&#xff1a;设置学校简介、联系我们、加入我们、法律声明、学校详情 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信…

基于51单片机GPS定位系统设LCD12864显示(程序+原理图+PCB+论文)

资料编号&#xff1a;202 功能介绍&#xff1a; (1).定位功能 GPS通过接收卫星信号&#xff0c;可以准确地定出其所在的位置&#xff0c;位置误差小于10米。利用GPS&#xff0c;在12864上面显示当前位置。 (2).查询时间功能 GPS还可以接收卫星发下来的时间信息&#xff0c;…

【openEuler系列】配置本地yum源

个人名片&#xff1a; 对人间的热爱与歌颂&#xff0c;可抵岁月冗长&#x1f31e; Github&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff1a;念舒_C.ying CSDN主页✏️&#xff1a;念舒_C.ying 个人博客&#x1f30f; &#xff1a;念舒_C.ying 【openEuler系列】配置本地y…

漏洞深度分析|Apache Fineract 远程代码执行漏洞

项目介绍 Apache Fineract 是一个开源的系统&#xff0c;用于核心银行系统平台化建设。为创业者、金融机构和服务提供商提供了一个可靠、健壮的、可负担得起的金融服务解决方案。 项目地址 https://github.com/apache/fineract 漏洞概述 Apache Fineract 在 1.8.1 之前的版…

NR DCI Format介绍

NR DCI(下行控制信息)与LTE中的DCI类似&#xff0c;均是承载上/下行数据信道的调度信息&#xff08;如PDSCH/PUSCH&#xff09;。 如下表&#xff0c;摘自38212 7.3.1节。其中0-0/0-1承载上行数据信道PUSCH的调度信息。1-0/1-1承载下行数据信道PDSCH的调度信息&#xff0c;加扰…

QT断点调试[通俗易懂]

QT设置断点调试&#xff1a; 1、知道哪里可能出问题2、完全不清楚自己程序bug在哪3、跳过肯定不会出错的地方 前言&#xff1a; 这个东西难道大家不都应该会吗??? 本人用Qt Creator编写Qt的&#xff0c;~ 当然是有大佬用记事本写Qt的hhhh&#xff0c;每个人用IDE或者编辑器…

Python中__init__.py的作用介绍

一、文件__init__.py作用&#xff1a;package / module 的标志 下图的serrors包含这个文件时候&#xff0c;Python会将其当做一个模块&#xff08;module&#xff09;来处理&#xff0c;进而可以使用from serrors import xx方式导入serrors包中的文件或模块。 如图所示&#x…

Linux的IO(初阶)

Linux的IO(初阶) 文章目录Linux的IO(初阶)1.C语言文件IO1.1 C语言文件的(复习)1.2 相对路径与绝对路径(复习)1.3 C语言中文件操作函数(复习)1.4 C语言文件写入方式(复习)1.5 三个默认打开的流1.6 FILE类型的理解2.Linux系统文件IO2.1 打开文件的系统接口函数&#xff1a;open2.…

2023年,学测试还有前途吗?

最近因为疫情等各种原因&#xff0c;大厂裁员&#xff0c;失业等等频频受到关注。 不解释&#xff0c;确实存在&#xff0c;各行各业都很难&#xff0c;但是&#xff0c;说软件测试行业没有前途&#xff0c;我还真不认同&#xff08;不是为培训机构说好话&#xff0c;大环境不…