【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?

文章目录

    • [🌍一. 数据交换--JSON](#🌍一. 数据交换--JSON)
      • [❄️1. JSON介绍](#❄️1. JSON介绍)
      • [❄️2. JSON 快速入门](#❄️2. JSON 快速入门)
      • [❄️3. JSON 对象和字符串对象转换](#❄️3. JSON 对象和字符串对象转换)
      • [❄️4. JSON 在 java 中使用](#❄️4. JSON 在 java 中使用)
      • [❄️5. 代码演示](#❄️5. 代码演示)
    • [🌍二. 异步请求--Ajax](#🌍二. 异步请求--Ajax)
      • [❄️1. 基本介绍](#❄️1. 基本介绍)
      • [❄️2. JavaScript 原生 Ajax 请求](#❄️2. JavaScript 原生 Ajax 请求)
      • [❄️3. JQuery 的 Ajax 请求](#❄️3. JQuery 的 Ajax 请求)
    • [🌍三. 线程数据共享和安全 -ThreadLocal](#🌍三. 线程数据共享和安全 -ThreadLocal)
      • [❄️1. ThreadLocal基本介绍](#❄️1. ThreadLocal基本介绍)
      • [❄️2. 源码分析](#❄️2. 源码分析)

🙋‍♂️ 作者:@whisperrr.🙋‍♂️

👀 专栏:JavaWeb👀

💥 标题:【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?💥

❣️ 寄语:比较是偷走幸福的小偷❣️

前言:

数据交换和异步请求技术在Web开发中扮演着举足轻重的角色。JSON和Ajax作为这两大技术的代表,已经成为了前端工程师必备的技能。本文将带您深入了解JSON与Ajax的原理、应用场景和细节说明,助您在Web开发领域更进一步。

🌍一. 数据交换--JSON

❄️1. JSON介绍

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

2.JSON 是轻量级的文本数据交换格式

3.JSON 独立于语言 解读:即 java 、php、asp.net , go 等都可以使用 JSON

4.JSON 具有自我描述性,更易理解, 一句话,非常的好用...

❄️2. JSON 快速入门

1.JSON 的定义格式

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

2.解读 JSON 规则

  1. 映射(元素/属性)用冒号 : 表示,"名称":值 , 注意名称是字符串,因此要用双引号引起来
  2. 并列的数据之间用逗号 , 分隔。"名称 1":值,"名称 2":值
  3. 映射的集合(对象)用大括号 {} 表示。{"名称 1":值,"名称 2":值}
  4. 并列数据的集合(数组)用方括号 \[\] 表示。 {"名称 1":值,"名称 2":值}, {"名称 1":值," 名称 2":值}
  5. 元素值类型:string, number, object, array, true, false, null

3.JSON 快速入门案例

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>json 快速入门案例</title>
<script type="text/javascript">
var myJson = { "key1": "教育", // 字符串
		"key2": 123, // Number "key3": [1, "hello", 2.3], // 数组
		"key4": {"age": 12, "name": "jack"}, //json 对象
		"key5": [ //json 数组
		{"k1": 10, "k2": "milan"}, {"k3": 30, "k4": "smith"}
				]
};
//访问 json 的属性
console.log("key1= " + myJson.key1);
// 访问 json 的数组属性
console.log("key3[1]= " + myJson.key3[1]); // hello
// 访问 key4 的 name 属性
console.log("name= " + myJson.key4.name); // jack
// 访问 key5 json 数组的第一个元素
console.log("myJson.key5[0]= " + myJson.key5[0]); //[object, object]
console.log("myJson.key5[0].k2= " + myJson.key5[0].k2)// milan
</script>
</head>
<body>
<h1>json 快速入门案例</h1>
</body>
</html>

❄️3. JSON 对象和字符串对象转换

1.应用案例

  1. JSON.stringify(json)功能: 将一个 json 对象转换成为 json 字符串 简单说名字来源.Serialize
  2. JSON.parse( jsonString )功能: 将一个 json 字符串转换成为 json 对象

代码演示:

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON 对象和字符串对象转换</title>
<script type="text/javascript">
// 一个 json 对象
var jsonObj = {"name": "韩顺平教育", age: 10};
//JSON 是一个 build-in 对象,内建对象,有方法可以使用
console.log(JSON)
// 把 json 对象转换成为字符串对象
var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr);
// 把 json 对象的字符串,转换成为 json 对象
var jsonObj2 = JSON.parse(jsonStr);
console.log(jsonObj2);
</script>
</head>
<body>
<h1>JSON 对象和字符串对象转换</h1>
</body>
</html>

2.注意事项和细节

1.JSON.springify(json 对 象) 会 返 回对 应 string, 并 不 会影 响 原 来 json 对 象.

2.JSON.parse(string) 函数会返回对应的 json 对象, 并不会影响原来 string.

3.在定义 Json 对象时, 可以使用 ' ' 表示字符串.

比如 var json_person = {"name": "jack", "age": 100};

也可以写成 var json_person = {'name': 'jack', 'age': 100};

4.但是在把原生字符串转成 json 对象时, 必须使用 "", 否则会报错

比如:var str_dog = "{'name':'小黄狗', 'age': 4}"; 转 json 就会报错.

5.JSON.springify(json 对象) 返回的字符串, 都是 "" 表示的字符串, 所以在语法格式正确的情况下, 是可以重新转成 json 对象的.

❄️4. JSON 在 java 中使用

1.说明

  1. java 中使用 json,需要引入到第 3 方的包 gson.jar
  2. Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
  3. 可以对 JSON 字符串 和 Java 对象相互转换

2.JSON 在 Java 中应用场景

  1. Javabean 对象和 json 字符串 的转换
  2. List 对象和 json 字符串 的转换
  3. map 对象和 json 字符串 的转换

3.应用场景示意图

❄️5. 代码演示

1.代码演示:演示javabean 和 json字符串的转换

java 复制代码
//创建一个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);

解读

(1) strBook 就是 json字符串

(2) Book.class 指定将 json字符串转成 Book对象

(3) 底层是反射机制

2.代码演示:演示把list对象 -> json字符串

java 复制代码
        //1. 演示把list对象 -> json字符串
        List<Book> bookList = new ArrayList<>();
        bookList.add(new Book(200, "天龙八部"));
        bookList.add(new Book(300, "三国演义"));

        //因为把对象,集合转成字符串, 相对比较简单
        //底层只需要遍历, 按照json格式拼接返回即可
        String strBookList = gson.toJson(bookList);
        System.out.println("strBookList= " + strBookList);

因为把对象,集合转成字符串, 相对比较简单

底层只需要遍历, 按照json格式拼接返回即可

3.代码演示:演示把json字符串 -> list对象

(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类

(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型

java 复制代码
  Type type = new TypeToken<List<Book>>() {
        }.getType();
      List<Book> bookList2 = gson.fromJson(strBookList, type);
      System.out.println("bookList2= " + bookList2);

(1) 返回类型的完整路径java.util.List<com.hspedu.json.Book>

(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射

(3) 所以gson 设计者就提供TypeToken, 来搞定.

== 使用TypeToken , 为什么要加 {}==

首先我们看一下TypeToken的源码

java 复制代码
 com.google.gson.reflect
 public class TypeToken<T> {
       final Class<? super T> rawType;
       final Type type;
       final int hashCode;
       protected TypeToken() {
           this.type = getSuperclassTypeParameter(this.getClass());
            this.rawType = Types.getRawType(this.type);
            this.hashCode = this.type.hashCode();
       }

(1) 如果我们 new TypeToken<List<Book>>()

错误提示 'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken'

(2) 因为TypeToken 的无参构造器是protected , 而new TypeToken<List<Book>>()就是调用其无参构造器

(3) 根据java基础, 如果一个方法是protected ,而且不在同一个包,是不能直接访问的, 因此报错

(4) 为什么new TypeToken<List<Book>>(){}使用就可以,这里就涉及到匿名内部类的知识.

(5) 当 new TypeToken<List<Book>>(){} 其实这个类型就是不是 TypeToken 而是一个匿名内部类(子类),继承

(6) 而且这个匿名内部类是有自己的无参构造器(隐式), 根据java基础规则 当执行子类的无参构造器时, 默认super();

4.代码演示:演示把mapt对象 -> json字符串(与list基本一致)

javascript 复制代码
        //把map对象->json字符串
        Map<String, Book> bookMap = new HashMap<>();
        bookMap.put("k1", new Book(400, "射雕英雄传"));
        bookMap.put("k2", new Book(500, "西游记"));

        String strBookMap = gson.toJson(bookMap);
        System.out.println("strBookMap=" + strBookMap);

        // 把json字符串 -> map对象
        // new TypeToken<Map<String, Book>>() {}.getType()=> java.util.Map<java....String,com.hspedu.json.Book>
        Map<String, Book> bookMap2 = gson.fromJson(strBookMap,
                new TypeToken<Map<String, Book>>() {
                }.getType());

🌍二. 异步请求--Ajax

❄️1. 基本介绍

1.Ajax 是什么

  1. AJAX 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)
  2. Ajax 是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术
    Ajax 经典应用场景
  3. 搜索引擎根据用户输入关键字,自动提示检索关键字
  4. 动态加载数据,按需取得数据【树形菜单、联动菜单...】
  5. 改善用户体验。【输入内容前提示、带进度条文件上传...】
  6. 电子商务应用。 【购物车、邮件订阅...】
  7. 访问第三方服务。【访问搜索服务、rss 阅读器】
  8. 页面局部刷新

2.Ajax 原理示意图

❄️2. JavaScript 原生 Ajax 请求

1 Ajax 文档

首先给大家推荐一下Ajax的在线文档
https://www.w3school.com.cn/js/js_ajax_intro.asp

2.通过下面的问题来引出Ajax

点击验证用户名, 使用 ajax 方式, 服务端验证该用户名是否已经占用了, 如果该用户已经占用, 以 json 格式返回该用户信息

javascript 复制代码
    <script type="text/javascript">
        window.onload = function () { //页面加载后执行function
           var checkButton = document.getElementById("checkButton");
            //给checkButton绑定onclick
           checkButton.onclick = function () {
                //1. 创建XMLHttpRequest对象(!!!) [ajax引擎对象]
                var xhr = new XMLHttpRequest();
                //   获取用户填写的用户名
                var uname = document.getElementById("uname").value;
                //2. 准备发送指定数据 open, send            
                //(1)"GET" 请求方式可以 GET/POST
                //(2)"/ajax/checkUserServlet?username=" + uname 就是 url
                //(3)true , 表示异步发送
          xhr.open("GET", "/ajax/checkUserServlet?uname=" + uname, true);
          //在send函数调用前,给XMLHttpRequest 绑定一个事件onreadystatechange
          //该事件表示,可以去指定一个函数,当数据变化,会触发onreadystatechange
          // 每当 xhr对象readyState 改变时,就会触发 onreadystatechange 事件
           xhr.onreadystatechange = function () {
           //如果请求已完成,且响应已就绪, 并且状态码是200
           if (xhr.readyState == 4 && xhr.status == 200) {
           //把返回的jon数据,显示在div
           document.getElementById("div1").innerHTML = xhr.responseText;
                 //console.log("xhr=", xhr)
                 var responseText = xhr.responseText;
                 //console.log("返回的信息=" + responseText);      
                //3. 真正的发送ajax请求[http请求]
                // 老韩再说明如果你POST 请求,再send("发送的数据")
                xhr.send();
            }
        }
    </script>

3 原生 Ajax 请求问题分析

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

❄️3. JQuery 的 Ajax 请求

JQuery Ajax 操作方法

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

2.$.ajax 方法

  1. $.ajax 常用参数
    url: 请求的地址
    type : 请求的方式 get 或 post
    data :发送到服务器的数据。将自动转换为请求字符串格式
    success: 成功的回调函数
    error: 失败后的回调函数
    dataType: 返回的数据类型 常用 json 或 text
  2. 说明:完整的参数参看手册

3.$.get 请求和$.post 请求

  1. $.get$.post 常用参数
    url: 请求的 URL 地址
    data: 请求发送到服务器的数据
    success: 成功时回调函数
    type: 返回内容格式,xml, html, script, json, text
  2. 说明:$.get $.post 底层还是使用$.ajax()方法来实现异步请求

4.$.getJSON

  1. $.getJSON 常用参数
    url: 请求发送的哪个 URL
    data: 请求发送到服务器的数据
    success: 请求成功时运行的函数
  2. 说明:$.getJSON 底层使用$.ajax()方法来实现异步请求

🌍三. 线程数据共享和安全 -ThreadLocal

❄️1. ThreadLocal基本介绍

1.什么是 ThreadLocal

  1. ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
  2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 源码!
  3. ThreadLocal 可以像 Map 一样存取数据,key 为当前线程, get 方法
  4. 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个 ThreadLocal 对象实例
  5. 每个 ThreadLocal 对象实例定义的时候,一般为 static 类型
  6. ThreadLocal 中保存数据,在线程销毁后,会自动释放
  7. 类图

ThreadLocal<Object> threadLocal = new ThreadLocal<>();
threadLocal.set(dog);

如果希望在同一个线程共享多个对象/数据,就在创建一个 ThreadLocal 对象

//threadLocal2.set(pig);

❄️2. 源码分析

1.set 源码分析 只要明白这个机制,后面的 set get 全部通透

java 复制代码
public void set(T value) {
 //获取当前线程
Thread t = Thread.currentThread();
//获取当前线程的 ThreadLocal.ThreadLocalMap 属性 threadLocals , 类型是 ThreadLocal 的静态内部类
//threadLocals 有 一 个 属 性 Entry[], 类 型
ThreadLocal.ThreadLocalMap.Entry
 //k-> ThreadLocal 对象 v-> 值
ThreadLocalMap map = getMap(t);
 if (map != null)
map.set(this, value);//存放这里的 this 就是 ThreadLocal, 可以debug 源码,一目了然
else
createMap(t, value);//创建
 }

说明:

1.ThreadLocalMap 对象是和当前 Thread 对象的绑定的属性

2.ThreadLocalMap 对象含有 Entry\[\] table; 这个 Entry(K,V)

3.这个 key 就是 ThreadLocal 对象, V 就是你要在放入的对象,比如 dog

4.当执行了 了 threadLocal.set(dog) 后,内存布局图为 看图

2.Debug 源码图,非常重要


这里涉及到的弱引用,涉及到知识点很多,暂不深入.

结尾:

随着对JSON与Ajax技术的深入探讨,我们不仅揭开了数据交换与异步请求的神秘面纱,也领略了它们在现代Web开发中的巨大作用。这两者的结合,不仅提高了数据处理的效率,也优化了用户的交互体验。

希望通过本文,你能更加熟练地运用JSON与Ajax,为构建更加出色的Web应用贡献力量。让我们一起在技术的道路上,不断前行,共创辉煌。

相关推荐
IT乐手26 分钟前
佛德角逼平西班牙,国足还有啥借口?
前端
JustHappy1 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
星栈1 小时前
Dioxus 的响应式系统:`Signal`、`Memo`、`Effect` 和异步状态到底该怎么分工
前端·前端框架
yingyima1 小时前
Java 正则表达式:比你想象的更强大
前端
yuanyxh4 小时前
macOS 应用 - 纯对话生成
前端·macos·ai编程
大家的林语冰4 小时前
ES5 凉凉,Babel 8 正式发布,默认不再编译为 ES5 和 CJS......
前端·javascript·前端工程化
光影少年5 小时前
react批量更新、同步/异步更新场景
前端·react.js·掘金·金石计划
假如让我当三天老蒯6 小时前
模块化:ES Module 与 CommonJS 的区别
前端·面试
用户40950115773176 小时前
Private Forge v2.0 发布:12大前端业务场景技能系统
前端
weedsfly6 小时前
异步编程全景与事件循环——彻底搞懂 JS 执行机制
前端·javascript