教会你怎么返回json来完成需求

简介: 教会你怎么返回json来完成需求

😀前言

处理 json 和 HttpMessageConverter

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉


🥰处理 json 和 HttpMessageConverter

😀处理 JSON-@ResponseBody

说明:

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

SpringMVC 是如何处理的, 下面是功能示意图

下面是要完成的效果

准备工作

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

创建json.jsp

1.当用户点击超链接时,我们发出一个ajax请求

2. 接收到请求后,我们查看这个数据

3. 使用前面讲过的jquery发出ajax请求知识

<%@ 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)
                        alert("返回数据 json=" + JSON.stringify(data))
                    },
                    "json"
                );
                return false;//这里我们返回false,就不使用href默认机制
            })
        })
    </script>
</head>
<body>
<h1>请求一个json数据</h1>
<a href="<%=request.getContextPath()%>/json/dog" id="getJson">点击获取json数据</a>
创建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 + '\'' +
                '}';
    }
}
创建JsonHandler.java

1. 目标方法 @ResponseBody,表返回的数据是json格式

2. springmvc底层根据目标方法@ResponseBody, 返回指定格式, 根据的http请求来进行处理

3. 底层原理我们在前面自定义@ResponseBody讲过, 这里原生的springmvc使用转换器

@RestController
public class JsonHandler {
@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;
    }
}
完成测试(页面方式)和 (Postman 方式)

浏览器 http://localhost:8080/springmvc/json.jsp

😊处理 JSON-@RequestBody

应用案例

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

1) 给大家举例客户端发送 json 字符串数据,

2) 使用 SpringMVC 的 @RequestBody 将客户端提交的 json 数据,封装成 JavaBean 对象

3) 再把这个 javabean 以 json 对象形式返回

修改 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,就不使用href默认机制
            })
            //绑定按钮点击事件, 提交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>
<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>

修改 JsonHandler.java , 增加处理 json 代码,

注意:@PostMapping , 等价:@RequestMapping(method = RequestMethod.POST)

@RequestBody User user 在形参指定了 @RequestBody

springmvc就会将提交的json字符串数据填充给指定Javabean

    @RequestMapping(value = "/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 +
                '}';
    }
}

并完成测试(页面方式与postman)

浏览器 http://localhost:8080/springmvc/json.jsp


注意如果没有就直接  发送就好了


😉处理 JSON-注意事项和细节

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

@RestController
public class JsonHandler {
    //编写方法,以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;
    }
}

完成测试(页面和 Postman 都可以通过

 @ResponseBody + @Controller 可以直接写成 @RestController ,

我们看一下源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

💖HttpMessageConverter

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

● 工作机制简图

处理 JSON-底层实现(HttpMessageConverter)

使用 HttpMessageConverter

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

Spring 提供了两种途径:

使用 @RequestBody / @ResponseBody 对目标方法进行标注

使用 HttpEntity / ResponseEntity 作为目标方法的入参或返回值

当控制器处理方法使用到

@RequestBody/@ResponseBody 或HttpEntity/ResponseEntity 时,

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

进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter,

若找不到可用的 HttpMessageConverter 将报错

● Dubug 源码-梳理一下

这理已经拿到了inputMessage 把请求的报文封装到里面去

其中

selectObjectMapper(javaType.getRawClass(), contentType);这个是处理Jason数据的

这里可以看到要到的地址

这是要回送的contentType

😄总结

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

@ResponseBody + @Controller 可以直接写成 @RestController

 

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
867 0
|
存储 文件存储 对象存储
S3存储服务间数据同步工具Rclone迁移教程
目前大多项目我们都会使用各种存储服务,例如oss、cos、minio等。当然,因各种原因,可能需要在不同存储服务间进行数据迁移工作,所以今天就给大家介绍一个比较通用的数据迁移工具Rclone。
S3存储服务间数据同步工具Rclone迁移教程
【Layui】子页面向父级页面传递参数
【Layui】子页面向父级页面传递参数
1383 0
【Layui】子页面向父级页面传递参数
|
缓存 网络协议 应用服务中间件
NATAPP - 连不上 / 错误信息等问题解决汇总
NATAPP - 连不上 / 错误信息等问题解决汇总
4261 0
NATAPP - 连不上 / 错误信息等问题解决汇总
|
存储 负载均衡 云计算
抖音服务器是什么样的
抖音服务器采用分布式云计算架构,遍布全国多个数据中心,如北上广、四川和贵州等地,利用高带宽、云集群并发及OSS、CDN、SLB等技术,确保大量用户同时流畅观看视频。这不仅需要强大的服务器群支持,还需精准的负载均衡与内容分发网络,保障用户体验。
667 1
|
11月前
|
人工智能 API UED
AI智能体再进化,工作流怎么玩?阿里云百炼上手教程
本次分享由讲师林粒粒呀介绍如何快速制作AI智能工具,特别是利用阿里云百炼平台创建工作流。通过简单的拖拽操作,小白用户也能轻松上手,实现从PPT主题到大纲的自动生成,并能一次性生成多个版本。借助API和Python脚本,还可以将Markdown格式的大纲转换为本地PPT文件。整个流程展示了AI智能体在实际应用中的高效性和实用性,帮助用户大幅提升工作效率。
1880 32
|
11月前
|
XML JSON 前端开发
HTTP协议,Content-Type格式介绍篇
通过理解和正确使用Content-Type头字段,可以确保数据在网络上传输时的正确性和高效性,提升网络应用的可靠性和用户体验。
962 25
|
人工智能 Cloud Native 数据管理
媒体声音|阿里云王远:一站式数据管理平台的智能化跃迁
在DTCC 2024大会上,阿里云数据库产品管理与技术架构部负责人王远与IT168 & ITPUB特约嘉宾薛晓刚就数据库与AI技术的融合、云原生数据库的新趋势及向量数据库的支撑能力等热点话题进行了深入探讨。王远认为,Data+AI不仅是一个概念,已进入实际落地阶段。在智能化时代,单一数据库引擎难以满足多元业务需求,需要构建统一的数据管理能力,以支持不同工作负载。阿里云通过“瑶池”数据库品牌,提供云原生、平台化、一体化和智能化的数据库解决方案,助力用户应对复杂的数据管理挑战。
503 11
|
Java fastjson Apache
【数据安全】数据脱敏方案总结
【数据安全】数据脱敏方案总结
906 1
|
安全 网络安全 数据安全/隐私保护
非对称加密的日常实践应用:以RSA加密为例
**RSA加密简介与Python实现** RSA,一种非对称加密技术,基于大数因子分解,用于数据加密和完整性保护。本文介绍了RSA基本原理,包括密钥生成(选取大质数p和q,计算n和φ(n),选择公钥指数e和私钥指数d),并展示了使用Python `cryptography` 库生成密钥对、加密和解密消息的代码示例。通过这些步骤,读者可理解RSA在网络安全中的应用,如HTTPS和数字签名。
1129 3