处理json 和HttpMessageConverterT

news2025/1/11 8:03:55

文章目录

  • 简单处理json 和HttpMessageConverter<T>
    • 处理JSON-@ResponseBody
      • 应用案例
        • 完成示意图
        • 代码应用
    • 处理JSON-@RequestBody
      • 应用案例
        • 说明
        • 代码实现
    • 处理JSON-注意事项和细节
      • 应用实例:
      • 小结
    • HttpMessageConverter<T>
      • 基本说明
      • 工作机制简图
      • 处理JSON-底层实现(HttpMessageConverter<T>)
        • Dubug 源码-梳理一下

简单处理json 和HttpMessageConverter

处理JSON-@ResponseBody

项目开发中,我们往往需要服务器返回的数据格式是按照json 来返回的。

应用案例

完成示意图


代码应用

引入处理json 需要的jar 包,注意spring5.x 需要使用jackson-2.9.x.jar 的包.

创建springmvc\web\json.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>json提交</title>
    <!-- 引入jquery -->
    <script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>

    <!-- 编写jquery代码和ajax请求 -->
    <script type="text/javascript">
        $(function () {
            //给id="getJson"绑定点击事件
            $("#getJson").click(function () {
                //console.log("ok ....")测试是否绑定成功
                var url = this.href;
                var args = {"time": new Date};//这是发送数据,为了防止页面缓存
                $.post(
                    url,
                    args,
                    function (data) {//data 就是返回的数据,是json格式=>如果是多个json数据,可以遍历
                        console.log("dataa= ", data);
                        console.log("dog.name=", data.name)
                        console.log("dog.addresss=", data.address)
                    },
                    "json"
                );
                return false;//返回false,防止重复提交
            })
        })
    </script>

</head>
<body>
<h1>请求一个json数据</h1>
<%--
1.当用户点击超链接时,我们发出一个ajax请求
2. 接收到请求后,我们查看这个数据
--%>
<a href="<%=request.getContextPath()%>/json/dog" id="getJson">点击获取json数据</a>
</body>
</html>

创建JavaBean: springmvc\src\com\web\json\Dog.java , 作为返回的数据

public class Dog {
    private String name;
    private String address;

    public Dog(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public Dog() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

创建springmvc\src\com\web\json\JsonHandler.java

@Controller
public class JsonHandler {
    @RequestMapping(value = "/getJson")
    //指定返回的数据格式json ,靠这个@ResponseBody
    @ResponseBody
    public Dog getJson() {
        //创建一只狗
        Dog dog = new Dog();
        dog.setName("大黄狗");
        dog.setAddress("北京八达岭~");
        return dog;
    }
}

完成测试(页面方式), 浏览器http://localhost:8080/springmvc/json.jsp

处理JSON-@RequestBody

应用案例

说明

前面是通过表单, 或者url 请求携带参数名=参数值把数据提交给目标方法

  1. 给大家举例客户端发送json 字符串数据,
  2. 使用SpringMVC 的@RequestBody 将客户端提交的json 数据,封装成JavaBean 对象
  3. 再把这个javabean 以json 对象形式返回
  1. 完成效果示意图

代码实现

修改json.jsp, 增加发送json 数据代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>json提交</title>
    <!-- 引入jquery -->
    <script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>

    <!-- 编写jquery代码和ajax请求 -->
    <script type="text/javascript">
        $(function () {
            //给id="getJson"绑定点击事件
            $("#getJson").click(function () {
                //console.log("ok ....")测试是否绑定成功
                var url = this.href;
                var args = {"time": new Date};//这是发送数据,为了防止页面缓存
                $.post(
                    url,
                    args,
                    function (data) {//data 就是返回的数据,是json格式=>如果是多个json数据,可以遍历
                        console.log("dataa= ", data);
                        console.log("dog.name=", data.name)
                        console.log("dog.addresss=", data.address)
                    },
                    "json"
                );
                return false;//返回false,防止重复提交
            })
            //绑定按钮点击事件, 提交json数据
            //springmvc 可以在在台將json轉成對象
            $("button[name='butt1']").click(function () {
                //目标:将userName 和 age 封装成json字符串,发送给目标方法
                var url = "/springmvc/save2";
                var userName = $("#userName").val();
                var age = $("#age").val();
                //将json对象转成json字符串
                var args = JSON.stringify({"userName": userName, "age": age});
                $.ajax({
                    url: url,
                    data: args,
                    type: "POST",
                    success: function (data) {
                        console.log("返回的data= ", data);
                    },
                    //下面这个contentType参数,是指定发送数据的编码和格式
                    contentType: "application/json;charset=utf-8"
                })
            })
        })
    </script>

</head>
<body>
    <h1>请求一个json数据</h1>
    <%--
    1.当用户点击超链接时,我们发出一个ajax请求
    2. 接收到请求后,我们查看这个数据
    --%>
    <a href="<%=request.getContextPath()%>/json/dog" id="getJson">点击获取json数据</a>

        <h1>发出一个json数据</h1>
    u:<input id="userName" type="text"><br/>
    a:<input id="age" type="text"><br/>
    <button name="butt1">添加用户</button>
</body>
</html>

修改JsonHandler.java , 增加处理json 代码, 注意:这里用的是@PostMapping , 等价:@RequestMapping(method = RequestMethod.POST)

@PostMapping("/save2")
@ResponseBody
public User save2(@RequestBody User user){
    //将前端传过来的数据以json 的格式相应回浏览器
    System.out.println("user~= " + user);
    return user ;
}

增加JavaBean : User.java

public class User {
    private String userName;
    private Integer age;

    public User(String userName, Integer age) {
        this.userName = userName;
        this.age = age;
    }

    public User() {
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}

完成测试(页面方式), 浏览器输入http://localhost:8080/springmvc/json.jsp

处理JSON-注意事项和细节

  1. 目标方法正常返回JSON 需要的数据, 可以是一个对象, 也可以是一个集合[举例]

  1. 前面是返回一个Dog 对象->转成Json 数据格式返回

  2. @ResponseBody 可以直接写在controller 上,这样对所有方法生效

应用实例:

修改JsonHandler.java

//@Controller
//@ResponseBody
@RestController
public class JsonHandler {
    /**
     * 1. 目标方法 @ResponseBody,表返回的数据是json格式
     * 2. springmvc底层根据目标方法@ResponseBody, 返回指定格式, 根据的http请求来进行处理
     * 3. 底层原理我们在前面自定义@ResponseBody说过, 这里原生的springmvc使用转换器
     */
    @RequestMapping(value = "/json/dog")
    //@ResponseBody
    public Dog getJson() {
        //返回对象
        //springmvc会根据你的设置,转成json格式数据返回
        Dog dog = new Dog();
        dog.setName("大黄狗");
        dog.setAddress("小新的家");
        return dog;
    }

    //编写方法,以json格式返回多个Dog
    @RequestMapping(value = "/json/dogs")
    //@ResponseBody
    public List<Dog> getJsons() {
        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog("大黄狗", "小新的家"));
        dogs.add(new Dog("大黄狗2", "小新2的家"));
        dogs.add(new Dog("大黄狗3", "小新3的家"));
        return dogs;

    /**
     * 1. @RequestBody User user 在形参指定了 @RequestBody
     * 2. springmvc就会将提交的json字符串数据填充给指定Javabean
     */
    @RequestMapping(value = "/save2")
    //@ResponseBody
    public User save2(@RequestBody User user) {
        //将前台传过来的数据 以json的格式相应回浏览器
        System.out.println("user~= " + user);
        return user;
    }
}

完成测试。

小结

@ResponseBody + @Controller 可以直接写成@RestController , 我们看一下源码!

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}

HttpMessageConverter

基本说明

SpringMVC 处理JSON-底层实现是依靠HttpMessageConverter来进行转换的。

工作机制简图

处理JSON-底层实现(HttpMessageConverter)

  1. 使用HttpMessageConverter 将请求信息转化并绑定到处理方法的入参中, 或将响应结果转为对应类型的响应信息,

Spring 提供了两种途径:
√ 使用@RequestBody / @ResponseBody 对目标方法进行标注。
√ 使用HttpEntity / ResponseEntity 作为目标方法的入参或返回值。

  1. 当控制器处理方法使用到@RequestBody/@ResponseBody 或HttpEntity/ResponseEntity 时,

    Spring 首先根据请求头或响应头的Accept 属性选择匹配的HttpMessageConverter,

进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的HttpMessageConverter 就会报错。

Dubug 源码-梳理一下



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

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

相关文章

区块链挖矿的机制原理解析

什么是区块链挖矿&#xff1f; 全球大概有10亿台电脑随时保持运行的状态&#xff0c;但是它们的利用率只有20%&#xff0c;剩余的80%时间都在闲置状态&#xff0c;如果让它们成为云计算节点&#xff0c;在闲暇之余也能成为挖矿机&#xff0c;主人也可以无形中得到一份额外收益…

Ansys Zemax | 设计衍射光学元件(DOE)和超透镜(metalens)

在这篇文章中&#xff0c;我们简要介绍了使用 OpticStudio 设计衍射光学元件&#xff08;DOE&#xff09;和超透镜&#xff08;metalens&#xff09;的过程。我们讨论了相位面和局部光栅的概念。附件中还提供了一些有用的DLLs&#xff0c;以支持特殊的 DOE 或 metalens 设计方法…

windows C++多线程同步<2>-事件

windows C多线程同步&#xff1c;2&#xff1e;-事件 事件对象和关键代码段不同&#xff0c;它是属于内核对象&#xff1b;又分为人工重置事件对象和自动重置事件对象&#xff1b; 同一个线程不允许在不释放事件的情况下多次获取事件&#xff1b; 相关API 白话来讲&#xff1…

尚硅谷大数据项目《在线教育之采集系统》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P004 P006 P007 P009 P010 P017 P025 P026 P027 P028 P030 P004 将数据以图形图表的方式展示出来&#xff01; P006 数据埋点 所谓埋点就是在应用中特定的流程收集一些信息&…

【Linux命令200例】cksum用于计算文件的校验和

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

[SSM]Spring IoC注解式开发

目录 十二、Spring IoC注解式开发 12.1回顾注解 12.1.1自定义注解 12.1.2使用注解 12.1.3通过反射机制读取注解 12.2声明Bean的注解 12.3Spring注解的使用 12.4选择性实例化Bean 12.5负责注入的注解 12.5.1Value 12.5.2Autowired与Qualifier 12.5.3Resource 12.6全…

Maven发布中央仓库始终报403

把域名 oss.sonatype.org 全部替换为&#xff1a;s01.oss.sonatype.org

Spring Cloud【SkyWalking服务环境搭建、微服务接入SkyWalking探针、Docker搭建Elasticsearch环境 】(十四)

目录 分布式请求链路追踪_SkyWalking服务环境搭建 分布式请求链路追踪_微服务接入SkyWalking探针 分布式请求链路追踪_Docker搭建Elasticsearch环境 分布式请求链路追踪_SkyWalking使用Elasticsearch持久化 分布式请求链路追踪_SkyWalking自定义链路追踪 分布式请求链路…

疲劳驾驶检测和识别3:Android实现疲劳驾驶检测和识别(含源码,可实时检测)

疲劳驾驶检测和识别3&#xff1a;Android实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 目录 疲劳驾驶检测和识别3&#xff1a;Android实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶检测和识别模型…

24 鼠标常用事件

鼠标进入&#xff1a;enterEvent鼠标离开&#xff1a;leaveEvent鼠标按下&#xff1a;mousePressEvent鼠标释放&#xff1a;mouseRelaseEvent鼠标移动&#xff1a;mouseMoveEvent 提升为自定义控件MyLabel 代码&#xff1a; //mylabel.h #ifndef MYLABEL_H #define MYLABEL_H#…

linux LVM磁盘管理

Linux运维过程中经常会遇到扩容的场景&#xff0c;下面做一点简单笔记&#xff0c;所谓好记性不如烂笔头。 1、新建磁盘挂载 &#xff08;1&#xff09;先看看主机上有没有挂载磁盘或挂载的磁盘有没有剩余的。 如下图可以看到这台机器挂了两个盘&#xff0c;一个/dev/sda,这…

【项目管理】第三节:PMP备考学习建议

文章目录 1.项目管理的价值观与方法论2.PMP开始的形式和题型 1.项目管理的价值观与方法论 对于中国考生而言&#xff0c;PMP”考试有两关要过:第一关是认知升级&#xff0c;考生通过学习和梳理项目管理知识&#xff0c;提升自己对项目管理的认知;第二关是思维升级&#xff0c;…

【Vue3】Vue3中的组合式API是什么?hook是什么?什么是“组合式函数”?项目中如何使用自定义 hook 函数?

组合式API与hook 一、什么是组合式 API&#xff1f;&#xff08;composition-api&#xff09;二、什么是组合式函数&#xff1f;&#xff08;hook&#xff09;2.1 无状态的函数&#xff08;utils&#xff09;2.2 有状态的函数&#xff08;hooks&#xff09;2.3 utils与hooks的联…

yolov5s模型剪枝详细过程(v6.0)

本文参考github上大神的开源剪枝项目进行学习与分享&#xff0c;具体链接放在文后&#xff0c;希望与大家多多交流&#xff01; 一、原模型训练 在官方源码上训练yolov5模型&#xff0c;支持v6.0分支的n/s/m/l模型&#xff0c;我这里使用的是v5s&#xff0c;得到后将项目clone到…

Cesium态势标绘专题-椭圆(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

图像处理之Hough变换检测直线

hough变换-直线检测 一、 前言二、Hough 变换三、直线检测四、代码实现1.hough检测2.画直线代码3.画hough空间代码4.检测结果 一、 前言 霍夫变换是一种特征检测(feature extraction)&#xff0c;被广泛应用在图像分析&#xff08;image analysis&#xff09;、计算机视觉(com…

[算法通关村] 1.2 链表的插入

上一节我们谈到了链表的概念&#xff0c;以及链表的创建方法&#xff0c;忘记的小伙伴可以复习一下&#xff1a; [算法通关村] 1.1 单向链表的创建 今天我们来探究一下链表的插入&#xff0c;链表的插入共有 3 种可能性&#xff0c;分别是在链表的头部插入、在中间插入&#x…

CMake学习-All in one

参考引用 CMake与Make最简单直接的区别通过例子学习CMakeLIO-SAM 1. 引言 1.1 什么是 CMake 1.1.1 CMake 背景 1.1.2 CMake 定义 CMake 是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装&#xff08;编译&#xff09;过…

基础算法-数组模拟队列

队列&#xff1a;先进先出 什么叫做队列&#xff1a; 就是一个特殊的数组。这个数组&#xff0c;最前面叫队头&#xff0c;最后面叫队尾。只允许在最后面添加元素&#xff0c;只允许在最前面删除元素。 解题思路&#xff1a; 用一个数组 q 保存数据。 用 hh 代表队头&…

关于PyTorch中一维卷积Conv1d的理解

首先明确一点&#xff0c;PyTorch中的一维卷积是从左往右做的&#xff0c;不是从上往下。 然后明确第二点&#xff0c;一维卷积和二维卷积最大的区别在于&#xff0c;一维卷积的卷积方向只有一个维度&#xff0c;一维卷积的卷积核不像二维卷积核一样可以左右和上下两个维度移动…