跳到主要内容JavaWeb 开发实战:JSON 数据交换与 Ajax 异步请求技术解析 | 极客日志Java大前端java
JavaWeb 开发实战:JSON 数据交换与 Ajax 异步请求技术解析
JSON 作为轻量级数据交换格式,广泛应用于前后端通信。 JSON 语法规范及对象字符串转换方法,结合 Java Gson 库演示实体类与集合的序列化实践。针对异步请求,对比原生 XMLHttpRequest 与 jQuery 封装的差异,分析其底层原理与应用场景。此外,深入探讨 ThreadLocal 在线程隔离与数据安全中的机制,通过源码剖析 set/get 流程,帮助开发者构建高效稳定的 Web 应用架构。
开源信徒27 浏览 JavaWeb 开发实战:JSON 数据交换与 Ajax 异步请求技术解析
一、数据交换——JSON
1. JSON 简介
JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式。它独立于编程语言,无论是 Java、PHP、Go 还是其他后端技术,都能轻松处理。JSON 具有自我描述性,结构清晰,易于阅读和理解,已成为 Web 开发中数据传输的事实标准。

2. JSON 快速入门
定义格式
在 JavaScript 中,JSON 通常表示为对象或数组:
var myJson = {
"k1": value,
"k2": "value",
"k3": [],
"k4": {},
"k5": [{}, {}]
};
核心规则
- 键值对:使用冒号
: 分隔,名称必须是双引号包裹的字符串。
- 分隔符:并列元素之间用逗号
, 分隔。
- 集合:对象用大括号
{},数组用方括号 []。
- 数据类型:支持 string, number, object, array, true, false, null。
案例演示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>json 快速入门案例</>
json 快速入门案例
title
<script type="text/javascript">
var myJson = {
"key1": "教育",
"key2": 123,
"key3": [1, "hello", 2.3],
"key4": {"age": 12, "name": "jack"},
"key5": [
{"k1": 10, "k2": "milan"},
{"k3": 30, "k4": "smith"}
]
};
console.log("key1= " + myJson.key1);
console.log("key3[1]= " + myJson.key3[1]);
console.log("name= " + myJson.key4.name);
console.log("myJson.key5[0].k2= " + myJson.key5[0].k2);
</script>
</head>
<body>
<h1>
</h1>
</body>
</html>
3. JSON 对象与字符串转换
在实际开发中,我们经常需要在 JSON 对象和字符串之间进行转换。
JSON.stringify(json): 将 JSON 对象序列化为字符串。
JSON.parse(jsonString): 将 JSON 字符串反序列化为对象。
var jsonObj = {"name": "韩顺平教育", age: 10};
var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr);
var jsonObj2 = JSON.parse(jsonStr);
console.log(jsonObj2);
JSON.stringify 不会修改原对象,返回的是新字符串。
JSON.parse 也不会修改原字符串,返回的是新对象。
- 定义 JSON 对象时,键名建议使用双引号
",虽然 JS 允许单引号,但在序列化后统一为双引号。
- 解析字符串转对象时,必须确保字符串符合 JSON 规范(如键名必须双引号),否则报错。
4. JSON 在 Java 中使用
Java 本身没有内置的 JSON 解析库,通常引入第三方包,最常用的是 Google 提供的 Gson。
应用场景
- JavaBean 对象与 JSON 字符串互转
- List 集合与 JSON 字符串互转
- Map 集合与 JSON 字符串互转
代码演示
Book book = new Book(100, "零基础学 Java");
String strBook = gson.toJson(book);
System.out.println("strBook=" + strBook);
这里 toJson 方法利用反射机制遍历对象属性生成 JSON 字符串。
Book book2 = gson.fromJson(strBook, Book.class);
System.out.println("book2=" + book2);
通过指定目标类 Book.class,Gson 会自动映射字段。
3. 集合转换 (List)
对于泛型集合,直接传 Class 会丢失类型信息,需要使用 TypeToken。
List<Book> bookList = new ArrayList<>();
bookList.add(new Book(200, "天龙八部"));
bookList.add(new Book(300, "三国演义"));
String strBookList = gson.toJson(bookList);
Type type = new TypeToken<List<Book>>(){}.getType();
List<Book> bookList2 = gson.fromJson(strBookList, type);
为什么加 {}?
TypeToken 的构造器是 protected 的,不能直接实例化。通过匿名内部类 new TypeToken<>(){} ,我们创建了一个子类,其无参构造器可以访问父类的 protected 成员,从而获取完整的泛型类型信息。
4. Map 转换
逻辑与 List 类似,同样需要 TypeToken 来保留泛型参数。
Map<String, Book> bookMap = new HashMap<>();
bookMap.put("k1", new Book(400, "射雕英雄传"));
String strBookMap = gson.toJson(bookMap);
Map<String, Book> bookMap2 = gson.fromJson(strBookMap,
new TypeToken<Map<String, Book>>(){}.getType());
二、异步请求——Ajax
1. 基本介绍
AJAX(Asynchronous Javascript And XML)是一种无需刷新整个页面即可更新部分网页内容的技术。它通过浏览器与服务器异步通信,显著提升了用户体验。
- 搜索框自动提示
- 动态加载树形菜单
- 表单局部验证
- 购物车实时更新
2. JavaScript 原生 Ajax 请求
原生 Ajax 基于 XMLHttpRequest 对象。虽然功能强大,但代码繁琐且需处理浏览器兼容性问题。
window.onload = function() {
var checkButton = document.getElementById("checkButton");
checkButton.onclick = function() {
var xhr = new XMLHttpRequest();
var uname = document.getElementById("uname").value;
xhr.open("GET", "/ajax/checkUserServlet?uname=" + uname, true);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
document.getElementById("div1").innerHTML = xhr.responseText;
}
};
xhr.send();
};
};
问题分析: 原生写法步骤多,状态码判断容易遗漏,维护成本高。实际工作中更倾向于使用封装好的库。
3. jQuery 的 Ajax 请求
jQuery 简化了 Ajax 操作,提供了更简洁的 API。
$.ajax(options): 通用配置,可设置 url, type, data, success, error 等。
$.get(url, data, callback): 简化的 GET 请求。
$.post(url, data, callback): 简化的 POST 请求。
$.getJSON(url, data, callback): 专门用于获取 JSON 数据。
底层实现上,这些方法最终都调用了 $.ajax(),只是预设了默认参数。使用 jQuery 能大幅减少样板代码,让开发者专注于业务逻辑。
三、线程数据共享与安全 - ThreadLocal
1. 基本介绍
在多线程环境下,如何保证线程间的数据隔离是一个关键问题。ThreadLocal 提供了一种解决方案,它为每个使用该变量的线程提供独立的变量副本。
- 线程隔离:每个线程只能访问自己的数据,互不干扰。
- 生命周期:数据随线程销毁而释放。
- 使用方式:类似于 Map,Key 是当前线程,Value 是存储的对象。
ThreadLocal<Object> threadLocal = new ThreadLocal<>();
threadLocal.set(dog);
如果需要为同一线程存储多个对象,需创建多个 ThreadLocal 实例。
2. 源码分析
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap 是 Thread 的内部类,每个 Thread 对象都有一个 threadLocals 属性指向它。
Entry 是 ThreadLocalMap 中的节点,Key 是 ThreadLocal 对象本身(弱引用),Value 是存储的值。
- 当调用
threadLocal.set(dog) 时,实际上是往当前线程的 ThreadLocalMap 中存入了一组 (ThreadLocal 对象,dog)。
这种设计确保了即使多个线程共用同一个 ThreadLocal 实例,它们存取的数据也是完全隔离的,非常适合用于管理用户上下文、数据库连接等场景。
通过以上讲解,我们深入理解了 JSON 作为数据载体的灵活性,掌握了 Ajax 实现前后端交互的核心流程,并剖析了 ThreadLocal 保障线程安全的底层原理。这些技术是现代 Web 应用开发的基石,熟练掌握它们将有助于构建更高效、稳定的系统架构。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online