数据交换和异步请求(JSONAjax))

目录

  • 一.JSON介绍
    • 1.JSON的特点
    • 2.JSON的结构
    • 3.JSON的值
    • JSON示例
    • 4.JSON与字符串对象转换
    • 5.注意事项
  • 二.JSON在Java中的使用
    • 1.Javabean to json
    • 2.List to json
    • 3.Map to JSON
    • TypeToken底层解析
  • 三.Ajax介绍
    • 1.介绍
    • 2.Ajax经典应用场景
  • 四.Ajax原理示意图
    • 1. 传统web应用
    • 2.Ajax方法
  • 五.Ajax实例
    • JavaScript原生Ajax请求方法
      • 实例代码
      • 原生Ajax问题分析
    • JQuery的Ajax请求方法
      • 常用方法
      • 实例代码

一.JSON介绍

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机制造商协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。

1.JSON的特点

  • 易于人阅读和编写:JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
  • 易于机器解析和生成:有效地提升网络传输效率。
  • 轻量级的数据交换格式:相对于XML格式的数据,JSON格式的数据体积小、传输效率高。

2.JSON的结构

JSON建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
值的有序列表(An ordered list of values)。
在多数语言中,它被理解为数组(array)。

3.JSON的值

在JSON中,值(value)可以是:

  • 字符串(在双引号中)
  • 数字(整数或浮点数)
  • 对象(在花括号中)
  • 数组(在方括号中)
  • true/false/null

JSON示例

{  "name": "John",  "age": 30,  "car": null,  "hobbies": ["reading", "cinema", "swimming"],  "spouse": {  "name": "Jane",  "age": 28  }  
}
//这个JSON对象表示一个人,他有名字、年龄、没有车、有一些爱好,以及一个配偶对象,
//配偶对象也有自己的名字和年龄。

4.JSON与字符串对象转换

  1. JSON.stringify(json)功能: 将一个json对象转换成为 json 字符串
  2. JSON.parse( jsonString )功能: 将一个 json字符串转换成为 json

实例

// 一个 json 对象
var jsonObj = {"name": "leon", 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);

5.注意事项

  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 对象的.

二.JSON在Java中的使用

Java中使用JSON需要导入第三方包gson.jar
Gson是谷歌提供的用来在Java对象和json数组之间转化的Java类库

1.Javabean to json

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;}@Overridepublic String toString() {return "Book{" +"id=" + id +", name='" + name + '\'' +'}';}
}//创建一个gson对象,做完一个工具对象使用Gson gson = new Gson();//演示javabean 和 json字符串的转换Book book = new Book(0824, "Java之父科比");//1. 演示把javebean -> json字符串String strBook = gson.toJson(book);System.out.println("strBook=" + strBook);//2. json字符串->javabean//(1) strBook 就是 json字符串//(2) Book.class 指定将 json字符串转成 Book对象//(3) 底层是反射机制Book book2 = gson.fromJson(strBook, Book.class);System.out.println("book2=" + book2);

2.List to 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);Type type = new TypeToken<List<Book>>() {}.getType();List<Book> bookList2 = gson.fromJson(strBookList, type);System.out.println("bookList2= " + bookList2);

3.Map to 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);//   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());System.out.println("bookMap2=" + bookMap2);

TypeToken底层解析

(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类
(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型
 com.google.gson.reflectpublic 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) 返回类型的完整路径java.util.List<com.javalearn.Book>(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射(3) 所以gson 设计者就提供TypeToken, 来搞定.为什么要加 {}?(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();

三.Ajax介绍

1.介绍

Ajax是一种用于创建交互式网页应用程序的技术。Ajax全称为Asynchronous JavaScript and XML(异步JavaScript和XML),它利用JavaScript、XML、HTML和CSS等技术,通过在后台与服务器进行数据交换,实现网页的局部刷新,从而实现页面的动态加载和更新,提升用户体验。

2.Ajax经典应用场景

  1. 搜索引擎根据用户输入关键字,自动提示检索关键字
  2. 动态加载数据,按需取得数据【树形菜单、联动菜单…】
  3. 改善用户体验。【输入内容前提示、带进度条文件上传…】
  4. 电子商务应用。 【购物车、邮件订阅…】
  5. 访问第三方服务。【访问搜索服务、rss 阅读器】

四.Ajax原理示意图

1. 传统web应用

在这里插入图片描述

2.Ajax方法

在这里插入图片描述

五.Ajax实例

JavaScript原生Ajax请求方法

实例代码

js

 window.onload = function () { //页面加载后执行functionvar checkButton = document.getElementById("checkButton");//给checkButton绑定onclickcheckButton.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 (){if(xhr.status==200&&xhr.readyState==4){console.log(xhr.responseText)if(xhr.responseText!=""){document.getElementById("div1").innerText=xhr.responseTextdocument.getElementById("myres").value="用户名 "+uname+" 已存在"}else{document.getElementById("myres").value="用户名 "+uname+" 可用"}}}//3. 真正的发送ajax请求[http请求]//如果你POST 请求,再send("发送的数据")xhr.send();}}

html

<body>
<h1>register</h1>
<form action="/Ajax/checkUserServlet" method="post">name:<input type="text" name="username" id="uname"><input type="button" id="checkButton" value="验证用户名"><input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>pwd :<input type="password" name="password"><br/><br/>email:<input type="text" name="email"><br/><br/><input type="submit" value="用户注册">
</form>
<h1>Json data</h1>
<div id="div1"></div>
</body>

servlet

	package servlet; /*** Date:2024/4/28  22:15* Description:TODO** @author Leon* @version 1.0*/import com.google.gson.Gson;
import entity.User;
import service.UserService;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;public class CheckUserServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//System.out.println("CheckUserServlet 被调用....");UserService userService = new UserService();Gson gson = new Gson();//接收ajax提交的数据String uname = request.getParameter("uname");System.out.println("uname= " + uname);response.setContentType("text/html;charset=utf-8");User user = userService.getUserByName(uname);if (user != null) {//说明用户名存在..,返回该user的json格式数据字符串String strUser = gson.toJson(user);response.getWriter().write(strUser);} else {response.getWriter().write("");}假定用户名为 king , 就不可用, 其它用户名可以//if("king".equals(uname)) {//不能使用king用户名//    //后面这个信息,是从DB获取//    //User king = new User(100, "king", "666", "king@sohu.com");////    //从DB获取//    User king = userService.getUserByName("king");//    //把 king 转成 json字符串//    String strKing = new Gson().toJson(king);//    //返回//    response.getWriter().write(strKing);//} else {//    //如果用户名可以用,返回""//    response.getWriter().write("");//}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

原生Ajax问题分析

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

JQuery的Ajax请求方法

常用方法

  1. $.ajax 常用参数
    url: 请求的地址
    type : 请求的方式 get 或 post
    data : 发送到服务器的数据。将自动转换为请求字符串格式
    success: 成功的回调函数
    error: 失败后的回调函数
    dataType: 返回的数据类型 常用 json 或 text
  2. $.get 和 $.post 常用参数
    url: 请求的 URL 地址
    data: 请求发送到服务器的数据
    success: 成功时回调函数
    type: 返回内容格式,xml, html, script, json, text
  3. $.getJSON 常用参数
    url: 请求发送的哪个 URL
    data: 请求发送到服务器的数据
    success: 请求成功时运行的函数

底层都是$.ajax方法

实例代码

js

$(function () {$("#checkButton").click(function () {// $.ajax({//   url:"/Ajax/checkUserServletPlus",//   type:"POST",//   data:{//     uname:$("#uname").val(),//     date: new Date()//   },//   error:function (){//     console.log("error")//   },//   success:function (data,status,xhr){//     console.log("success")////     console.log("data="+data)//     console.log("status="+status)//     console.log("xhr="+ xhr)//     $("#div1").html(JSON.stringify(data))//     if(data.id==-1){//       $("#myres").val("该用户未注册")//     }else{//       $("#myres").val("该用户已存在")//     }//   },//   dataType:"json"// })// $.get(//     "/Ajax/checkUserServletPlus",//     {//         uname: $("#uname").val(),//         date: new Date()//     }, function (data, status, xhr) {//         $("#div1").html(JSON.stringify(data))//         if (data.id == -1) {//             $("#myres").val("该用户未注册")//         } else {//             $("#myres").val("该用户已存在")//         }//     },//     "json"// )// $.post(//     "/Ajax/checkUserServletPlus",//     {//         uname: $("#uname").val(),//         date: new Date()//     }, function (data, status, xhr) {//         $("#div1").html(JSON.stringify(data))//         if (data.id == -1) {//             $("#myres").val("该用户未注册")//         } else {//             $("#myres").val("该用户已存在")//         }//     },//     "json"// )$.getJSON("/Ajax/checkUserServletPlus",{uname: $("#uname").val(),date: new Date()}, function (data, status, xhr) {$("#div1").html(JSON.stringify(data))if (data.id == -1) {$("#myres").val("该用户未注册")} else {$("#myres").val("该用户已存在")}})})})

html

<h1>register</h1>
<form action="/Ajax/checkUserServletPlus" method="post">name:<input type="text" name="username" id="uname"><input type="button" id="checkButton" value="验证用户名"><input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>pwd :<input type="password" name="password"><br/><br/>email:<input type="text" name="email"><br/><br/><input type="submit" value="用户注册">
</form>
<h1>Json data</h1>
<div id="div1"></div>

servlet

package servlet; /*** Date:2024/4/29  21:17* Description:TODO** @author Leon* @version 1.0*/import com.google.gson.Gson;
import entity.User;
import service.UserService;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;public class CheckUserServletPlus extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {UserService userService = new UserService();Gson gson = new Gson();//接收ajax提交的数据String uname = request.getParameter("uname");System.out.println("uname= " + uname);response.setContentType("text/json;charset=utf-8");User user = userService.getUserByName(uname);if (user != null) {//说明用户名存在..,返回该user的json格式数据字符串String strUser = gson.toJson(user);response.getWriter().write(strUser);} else {User nullU = new User(-1, "", "", "");response.getWriter().write(gson.toJson(nullU));}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平面模型上提取凸凹多边形------pcl

平面模型上提取凸凹多边形 pcl::PointCloud<pcl::PointXYZ>::Ptr PclTool::ExtractConvexConcavePolygons(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);p…

java10基础(this super关键字 重写 final关键字 多态 抽象类)

目录 一. this和super关键字 1. this关键字 2. super关键字 二. 重写 三. final关键字 四. 多态 五. 抽象类 1. 抽象方法 2. 抽象类 3. 面向抽象设计 一. this和super关键字 1. this关键字 this 当前对象的引用 this.属性 this.方法名() this() -- 调用构造函数 …

Vue阶段练习:初始化渲染、获取焦点、记账清单

阶段练习主要承接Vue 生命周期-CSDN博客 &#xff0c;学习完该部分内容后&#xff0c;进行自我检测&#xff0c;每个练习主要分为效果显示、需求分析、静态代码、完整代码、总结 四个部分&#xff0c;效果显示和准备代码已给出&#xff0c;我们需要完成“完整代码”部分。 练习…

技术速递|使用 .NET 为 Microsoft AI 构建可扩展网关

作者&#xff1a;Kara Saucerman 排版&#xff1a;Alan Wang Microsoft AI 团队构建了全面的内容、服务、平台和技术&#xff0c;以便消费者在任何设备上、任何地方获取他们想要的信息&#xff0c;并为企业改善客户和员工的体验。我们的团队支持多种体验&#xff0c;包括 Bing、…

Java 线程池 ( Thread Pool )的简单介绍

想象一下&#xff0c;你正指挥着一支超级英雄团队&#xff0c;面对蜂拥而至的敌人&#xff08;任务&#xff09;&#xff0c;不是每次都召唤新英雄&#xff08;创建线程&#xff09;&#xff0c;而是精心调配现有成员&#xff0c;高效应对。这就是Java线程池的魔力&#xff0c;…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot&#xff0b;vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

探索GitHub上的GPTs项目:泄露和被破解的GPT提示

GPTs项目是一个在GitHub上由用户linexjlin发起的开源项目&#xff0c;专注于提供泄露的GPT&#xff08;生成式预训练转换器&#xff09;提示。这些提示用于指导和优化AI模型的输出&#xff0c;进而提升代码生成的质量和效率。项目页面提供了丰富的功能和资源&#xff0c;旨在帮…

3D渲染是什么?渲染100邀请码1a12

3D渲染是把3D模型转换为2D图像或动画的过程&#xff0c;涉及到多方面知识&#xff0c;这篇文章我们就来了解下。 1、3D渲染的原理 3D渲染的原理是模拟光线在三维空间中的传播和反射&#xff0c;根据物体在空间中的分布&#xff0c;计算出每个像素的颜色和亮度等数值&#xff…

如果insightface/instantID安装失败怎么办(关于InsightFaceLoader_Zho节点的报错)

可能性有很多&#xff0c;但是今天帮朋友解决问题的时候又收集了一种新的思路。 首先&#xff0c;可以先按照这篇文章里边提到的方法去安装&#xff1a; 【全网最详细】ComfyUI下&#xff0c;Insightface安装指南-聚梦小课堂_insightface如何安装-CSDN博客 其次&#xff0c;…

在Java中如何有效地处理内存泄露

在Java中&#xff0c;处理内存泄露有多种方法&#xff0c;以下是其中三种常见的方法及其原理和适用场景&#xff1a; ## 1. 合理使用垃圾回收机制 Java中的垃圾回收机制&#xff08;Garbage Collection&#xff0c;GC&#xff09;是一种自动化的内存管理技术&#xff0c;它可以…

2005-2021年全国各地级市生态环境注意力/环保注意力数据(根据政府报告文本词频统计)

2005-2021年全国各地级市生态环境注意力/环保注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 2005-2021年全国各地级市生态环境注意力/环保注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 1、时间&#xff1a;2005-2021年 2、范围&#xff1a;2…

嵌入式开发常见概念简介

目录 0. 《STM32单片机自学教程》专栏总纲 API Handle(句柄) 0. 《STM32单片机自学教程》专栏总纲 本文作为专栏《STM32单片机自学教程》专栏其中的一部分&#xff0c;返回专栏总纲&#xff0c;阅读所有文章,点击Link: STM32单片机自学教程-[目录总纲]_stm32 学习-CSD…

Linux变量的认识及环境变量配置详解

文章目录 1、变量的划分2、局部变量3、全局变量4、环境变量4.1、概述4.2、配置临时环境变量4.3、配置永久环境变量4.3.1、用户级配置文件1&#xff09;配置方法一&#xff1a;~/.bashrc文件2&#xff09;配置方法二&#xff1a;~/.profile文件3&#xff09;配置方法三&#xff…

Python读取ASC文件并转换成Excel文件(坐标)

import pandas as pd# 读取asc文件&#xff0c;指定空格为分隔符 df pd.read_csv(out_view2.asc, sep , headerNone)# 去掉空列 df df.dropna(howall, axis1)# 将数据保存到Excel文件 df.to_excel(out_view2.xlsx, indexFalse, headerFalse)效果图

用户管理中心——数据库设计用户注册逻辑设计

用户管理中心——数据库设计&用户注册逻辑设计 规整项目目录1. 数据库自动生成器的使用实现基本的数据库操作&#xff08;操作user表&#xff09; 2. 注册逻辑的设计(1) 写注册逻辑(2) 实现(3) 测试代码 3. 遇到的问题 规整项目目录 utils–存放工具类&#xff0c;比如加密…

【工作记录】openjdk-22基础镜像的构建

背景 近期使用到的框架底层都用的是springboot3.0&#xff0c;要求jdk版本在17甚至更高。 于是决定制作一个基于openjdk22的基础镜像&#xff0c;本文对这一过程进行记录。 作为记录的同时也希望能够帮助到需要的朋友。 期望效果 容器内可以正常使用java相关命令且版本是2…

Redis 入坑基本指南

引言 本指南将帮助您了解如何安装、配置和基本使用 Redis。Redis 是一款开源的高性能键值存储系统&#xff0c;可用于缓存、数据库、消息中间件等多种用途。 1. 安装 Redis a. 下载 Redis&#xff1a; 可以从 Redis 官方网站&#xff08;https://redis.io&#xff09;下载最…

jenkins目录下的vue3项目——pnpm install后运行报错——奇葩问题解决

昨天到今天&#xff0c;同事那边遇到一个问题&#xff0c;就是关于vue3vite的项目&#xff0c;在执行了自动打包后&#xff0c;运行代码会提示报错的问题。 报错信息如下&#xff1a; 具体错误信息如下&#xff1a; ERROR 11:28:14 [vite] Pre-transform error: Cannot find …

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似…

一机游领航旅游智慧化浪潮:借助前沿智能设备,革新旅游服务效率,构建高效便捷、生态友好的旅游服务新纪元,开启智慧旅游新时代

目录 一、引言 二、一机游的定义与特点 &#xff08;一&#xff09;一机游的定义 &#xff08;二&#xff09;一机游的特点 三、智能设备在旅游服务中的应用 &#xff08;一&#xff09;旅游前的信息查询与预订支付 &#xff08;二&#xff09;旅游中的导航导览与互动体…