数据交换和异步请求【JSON & Ajax】

目录

JSON简介

        JSON的定义格式

        JSON对象和字符串对象相互转换

        JSON在Java中的使用

        JSON字符串 和 Javabean 对象、List 对象、map 对象之间的转换

        简单使用: 

        细节说明:

 Ajax简介

        JavaScript原生Ajax请求

        简单使用:

        JQuery的Ajax请求

        常用方法:

        简单使用:


JSON简介

1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)

2. JSON 是轻量级的文本数据交换格式;独立于语言;具有自我描述性,更易理解

JSON 在线文档:https://www.w3school.com.cn/js/js_json_intro.asp


JSON的定义格式

var 变量名 = { 
"k1" : value,   // Number 类型 
"k2" : "value", // 字符串类型
"k3" : [],      // 数组类型 
"k4" : {},      // json 对象类型 
"k5" : [{},{}]  // json 数组 
}; 

规则:

1、映射(元素/属性)用冒号 “:” 表示。

        "名称":值 , 注意名称是字符串,因此要用双引号引起来

2、并列的数据之间用逗号 “,” 分隔。

        "名称 1":值,"名称 2":值

3、映射的集合(对象)用大括号 {} 表示。

        {"名称 1":值,"名称 2":值}

4、并列数据的集合(数组)用方括号 [] 表示。

        [{"名称 1":值,"名称 2":值}, {"名称 1":值," 名称 2":值}]

5、元素值类型:string, number, object, array, true, false, null


JSON对象和字符串对象相互转换

JSON 是一个内建对象,有方法可以使用 

JSON.stringify(json) //将一个 json对象 转换成为 json字符串
JSON.parse( jsonString ) //将一个 json字符串 转换成为 json对象 

例子: 

<script type="text/javascript">
    // 一个 json 对象 
    var jsonObj = {"name": "小明", age: 10}; 

    // 把 json 对象转换成为字符串对象 
    var jsonStr = JSON.stringify(jsonObj); 
    console.log(jsonStr);
 
    // 把 json 对象的字符串,转换成为 json 对象 
    var jsonObj2 = JSON.parse(jsonStr); 
    console.log(jsonObj2); 
</script> 


JSON在Java中的使用

1、java 中使用 json,需要引入到第 3 方的包 gson.jar

2、gson.jar 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以对 JSON 字符串 和 Java 对象 相互转换

3、gson需要得到类的完整路径,然后进行底层反射才能得到需要的类,所以gson 设计者就提供TypeToken类来解决该问题

JSON字符串 和 Javabean 对象、List 对象、map 对象之间的转换

【注:需要引入到第 3 方的包 gson.jar

主要使用了以下两个方法:

gson.toJson(Book);  //java对象 转化为 json字符串

gson.fromJson(strBook, Book.class); //json字符串 转换为 java对象

简单使用: 


import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JavaJson {
    public static void main(String[] args) {

        //创建一个gson对象,作为一个工具对象使用
        Gson gson = new Gson();


        //javabean对象 和 json字符串的转换
        Book book = new Book(100, "JAVA编程");
        //1. javebean对象 -> json字符串
        String strBook = gson.toJson(book);
        System.out.println("strBook=" + strBook);
        //2. json字符串->javabean对象
        Book book2 = gson.fromJson(strBook, Book.class);
        System.out.println("book2=" + book2);


        //list对象 和 json字符串的转换
        List<Book> bookList = new ArrayList<>();
        bookList.add(new Book(200, "数学"));
        bookList.add(new Book(300, "英语"));
        //1. list对象 -> json字符串
        String strBookList = gson.toJson(bookList);
        System.out.println("strBookList= " + strBookList);
        //2. json字符串 -> list对象
        Type type = new TypeToken<List<Book>>() {
        }.getType();
        List<Book> bookList2 = gson.fromJson(strBookList, type);
        System.out.println("bookList2= " + bookList2);


        //map对象 和 json字符串的转换
        Map<String, Book> bookMap = new HashMap<>();
        bookMap.put("k1", new Book(400, "红楼梦"));
        bookMap.put("k2", new Book(500, "西游记"));
        //1. map对象 -> json字符串
        String strBookMap = gson.toJson(bookMap);
        System.out.println("strBookMap=" + strBookMap);
        //2. json字符串 -> map对象
        Map<String, Book> bookMap2 = gson.fromJson(strBookMap,
                new TypeToken<Map<String, Book>>() {
                }.getType());
        System.out.println("bookMap2=" + bookMap2);
    }
}



//自定义的一个JavaBean
class Book {
    private Integer id;
    private String name;

    public Book(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

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

细节说明:

TypeToken之后为何要加 {} ?

(1) 如果直接  new TypeToken<List<Book>>()  则会提示
 'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken'
因为TypeToken 的无参构造器是的修饰符是protected,不在同一个包内不能直接访问,因此报错
(2) new TypeToken<List<Book>>(){} 使用就可以,是因为后面多了个 {} ,此时这个类型就不是 TypeToken,而是匿名内部类(可理解为其子类)
(3) 当执行该匿名内部类(子类)的无参构造器时, 就会默认执行 super(),从而间接访问了TypeToken 用protected修饰的无参构造器

 Ajax简介

1、Ajax 即“ Asynchronous Javascript And XML ”(异步 JavaScript 和 XML)

2、Ajax 是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术


JavaScript原生Ajax请求

在线文档:https://www.w3school.com.cn/js/js_ajax_intro.asp

核心:XMLHttpRequest

简单使用:

//1、创建XMLHttpRequest对象[ajax引擎对象]
var xhr = new XMLHttpRequest();
//2、准备指定数据
var uname = document.getElementById("uname").value;
xhr.open("GET", "/json_ajax/checkUserServlet?uname=" + uname, true);
//3、在send函数调用前,给XMLHttpRequest 绑定一个事件onreadystatechange
//该事件表示,可以去指定一个函数,每当 xhr对象readyState 改变时,
//就会触发 onreadystatechange 事件
xhr.onreadystatechange = function () {
    //console.log("xhr=", xhr)
    if (xhr.readyState == 4 && xhr.status == 200) {
        //获取返回的json数据
        var responseText = xhr.responseText;
        console.log("返回的信息=" + responseText);
    }
}
//4、发送数据
xhr.send();

注意事项:

JavaSE 和 Javaweb方式 加载properties配置文件的方法不同

//JavaSE中加载properties配置文件的方法为:
//properties.load(new FileInputStream("src\\druid.properties"));

//javaweb方式加载properties配置文件的方法为:
//要获取src目录下的文件,需要使用类加载器
properties.load(JDBCUtilsByDruid.class.getClassLoader()
        .getResourceAsStream("druid.properties"));


JQuery的Ajax请求

在线文档:https://www.w3school.com.cn/jquery/jquery_ajax_get_post.asp

编写原生的 Ajax 要写很多的代码,还要考虑浏览器兼容问题,使用不方便,在实际工作中,一般使用 JavaScript 的库(比如 Jquery) 发送 Ajax 请求,从而解决这个问题。


常用方法:

(说明:完整的参数参看在线文档

使用之前需要引入jquery

<!--    引入jquery    -->
<script type="text/javascript" src="./script/jquery-3.6.0.min.js"></script>
$.ajax 方法
常用参数 
url: 请求的地址 
type : 请求的方式 get 或 post 
data : 发送到服务器的数据。将自动转换为请求字符串格式 
success: 成功的回调函数 
error: 失败后的回调函数 
dataType: 返回的数据类型 常用 json 或 text 

$.get 和$.post 方法
常用参数 
url: 请求的 URL 地址 
data: 请求发送到服务器的数据
success: 成功时回调函数 
type: 返回内容格式,xml, html, script, json, text 

$.getJSON 方法
常用参数 
url: 请求发送的哪个 URL 
data: 请求发送到服务器的数据 
success: 请求成功时运行的函数 

说明:$.get、$.post 和 $.getJSON底层还是使用$.ajax()方法来实现异步请求

简单使用:

    <!--    引入jquery-->
    <script type="text/javascript" src="./script/jquery-3.6.0.min.js"></script>

    <script type="text/javascript">
        $(function (){
            $("#checkButton").click(function (){
                //alert("ok....")
                $.ajax({
                    url:"/json_ajax/checkUserServlet3",
                    type:"GET",
                    data:
                        {
                            username:$("#uname").val(),
                            date:new Date()
                        },
                    success:function (data, status, xhr){
                        console.log("data= " + JSON.stringify(data));
                        console.log("status= " + status);
                        console.log("xhr= " + JSON.stringify(xhr));
                        
                    },
                    error:function (){
                        alert("失败。。。");
                    },
                    dataType:"json"
                });

                // $.get(
                //     "/json_ajax/checkUserServlet3",
                //     {
                //         username:$("#uname").val(),
                //         date:new Date()
                //     },
                //     function (data, status, xhr){
                //         console.log("data= " + JSON.stringify(data));
                //         console.log("status= " + status);
                //         console.log("xhr= " + JSON.stringify(xhr));
                //         //alert("get...")
                //        
                //     },
                //     "json"
                // )
                //
                // $.post(
                //     "/json_ajax/checkUserServlet3",
                //     {
                //         username:$("#uname").val(),
                //         date:new Date()
                //     },
                //     function (data, status, xhr){
                //         console.log("data= " + JSON.stringify(data));
                //         console.log("status= " + status);
                //         console.log("xhr= " + JSON.stringify(xhr));
                //         //alert("post...")
                //        
                //     },
                //     "json"
                // )
                //
                // $.getJSON(
                //     "/json_ajax/checkUserServlet3",
                //     {
                //         username:$("#uname").val(),
                //         date:new Date()
                //     },
                //     function (data, status, xhr){
                //         console.log("data= " + JSON.stringify(data));
                //         console.log("status= " + status);
                //         console.log("xhr= " + JSON.stringify(xhr));
                //         // alert("getJSON...")
                //        
                //     }
                // )

            })
        })

    </script>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值