重学Ajax
摘要:AJAX是一个在前端的应用非常广泛技术,为什么还要谈它呢?么得办法之前学的不全面,再收拾收拾。水平有限,欢迎指正!
AJAX(全称:Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容的技术。Ajax和普通HTTP请求都是用于与服务器进行数据交互的方式,其主要区别:
-
异步性:Ajax请求是异步的,可以在不阻塞页面渲染的情况下发起和处理请求,而普通HTTP请求通常是同步的,发送请求后会阻塞页面的渲染直到收到响应或者超时。
-
数据交换格式:虽然名字中包含 XML,但实际上在Ajax中使用的数据交换格式不限于XML,也可以是JSON、HTML或纯文本等,而普通HTTP请求通常以HTML为主。
-
服务端压力:由于Ajax请求是异步的,可以减少对服务器的压力,而普通HTTP请求可能会因为频繁的页面刷新导致服务器压力过大。
-
用户体验:由于Ajax请求是异步的,可以提供更好的用户体验,用户可以在等待响应时继续与页面交互,而普通HTTP请求会导致页面的停顿和刷新,影响用户体验。
Ajax使用流程
1. 创建XmlHttpRequest对象
XMLHttpRequest是Ajax的核心 ,它是一个构造函数,可以通过new关键字来调用,语法:
var 变量名 = new XMLHttpRequest();
Ajax使用该对象发起请求、接收响应,但 XMLHttpRequest并不是W3C的标准,不同浏览器的创建方式不同。
/*** Chrome、Firefox、IE7+、Opera、Safari等浏览器使用的是XMLHttpRequest* 注意:IE5和IE6不支持该对象,它们使用ActiveXObject*/
// 判断浏览器是否支持该对象
if (window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();
} else { // IE5和IE6使用的是ActiveXObjectxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
2. 配置请求信息
open()方法用于设置请求的方法、URL和是否异步发送请求,语法:
xmlhttp.open(method, url, async); // "请求类型","请求的URL",是否异步
- 请求类型,表示请求的类型,例如GET、POST等;
- 请求的URL,表示请求的地址,可以是相对地址,也可以是绝对地址;
- 是否异步,表示是否采用异步方式,如果为true,表示异步,如果为false,表示同步。
注意:该方法并不会真正发送请求,而只是启动一个请求以备发送,实际的请求发送是通过调用send()方法实现的。
3. 向服务器发送数据
send()方法用于发送请求。它是在调用open()方法之后,设置请求头(可选),并准备好要发送的请求体数据后调用的,常见用法如下:
// 不带参数:适用于GET请求或者不需要在请求体中传递数据的POST请求。
xmlhttp.send();// 传递字符串作为请求体数据:适用于POST请求,并且请求体中需要传递字符串格式的数据。
xmlhttp.send('data=example');// 传递FormData对象:适用于POST请求,可以方便地构建包含键值对的表单数据并传递给服务器。
var formData = new FormData();
formData.append('name', 'John');
formData.append('age', 25);
xmlhttp.send(formData);// 传递JSON字符串作为请求体数据:适用于POST请求,并且请求体中需要传递JSON格式的数据。
xmlhttp.setRequestHeader('Content-Type', 'application/json');
xmlhttp.send(JSON.stringify({ name: 'John', age: 25 }));
4. 处理服务器响应
XMLHttpRequest.onreadystatechange()是一个事件处理函数,当XMLHttpRequest对象的 readyState属性值发生变化时,该函数将被触发,status则为请求响应的状态码。
以下是readyState属性的值说明:
- 0:表示XMLHttpRequest对象正在初始化,尚未发送请求;
- 1:表示请求已经发送,但尚未收到响应;
- 2:表示请求已经发送,并且服务器已经处理请求,正在等待服务器响应;
- 3:表示请求已经发送,并且服务器已经处理请求,并且响应已经就绪,但尚未读取;
- 4:表示请求已经发送,并且服务器已经处理请求,并且响应已经就绪,并且响应的内容已经读取完毕。
xmlhttp.onreadystatechange = function () {// 响应已被接受且服务器处理成功时才执行(响应状态码200)if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {// 获取响应体的文本,做些什么...}
}
需要注意的是onreadystatechange()事件,会在Ajax使用同步方式时失效无法执行, 也就是open()方法第三个参数传入false.

完整Ajax请求发送流程示例:
//1. 创建XMLHttpRequest对象
var xmlhttp; // 用于保存创建好的对象
/**
* XMLHttpRequest是Ajax的核心
* 它是一个构造函数,可以通过new关键字来调用
* Ajax使用该对象发起请求、接收响应
* 语法:var 变量名 = new XMLHttpRequest();
* XMLHttpRequest并不是W3C的标准,不同浏览器的创建方式不同
* 例如:Chrome、Firefox、IE7+、Opera、Safari等浏览器使用的是XMLHttpRequest
* 注意:IE5和IE6不支持该对象,它们使用ActiveXObject
*/
// 判断浏览器是否支持该对象
if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); }
else { // IE5和IE6使用的是ActiveXObjectxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} /**
* 先创建请求,open()方法,指定请求类型和URL
* 语法:xmlhttp.open("请求类型","请求的URL",是否异步) * 参数:请求类型,表示请求的类型,例如GET、POST等
* 请求的URL,表示请求的地址,可以是相对地址,也可以是绝对地址
* 是否异步,表示是否采用异步方式,如果为true,表示异步,如果为false,表示同步
* 例如:xmlhttp.open("GET","/content",true);
* 注意:该方法并不会真正发送请求,而只是启动一个请求以备发送
* 然后调用send()方法,发送请求
*/
// 2. 配置请求信息
xmlhttp.open("GET", "/content");
// 3. 发送Ajaxxmlhttp.send();
// 4. 处理服务器响应
/**
* XMLHttpRequest.onreadystatechange()是一个事件处理函数,当XMLHttpRequest对象的
* readyState属性值发生变化时,该函数将被触发。* 以下是readyState属性的值说明:
* 0:表示XMLHttpRequest对象正在初始化,尚未发送请求。
* 1:表示请求已经发送,但尚未收到响应。
* 2:表示请求已经发送,并且服务器已经处理请求,正在等待服务器响应。
* 3:表示请求已经发送,并且服务器已经处理请求,并且响应已经就绪,但尚未读取。
* 4:表示请求已经发送,并且服务器已经处理请求,并且响应已经就绪,并且响应的内容已经读取完毕。 */
xmlhttp.onreadystatechange = function () {
// 响应已被接受且服务器处理成功时才执行(响应状态码200)
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { // 获取响应体的文本 var t = xmlhttp.responseText; console.log(t); document.getElementById("divContent").innerHTML = document.getElementById("divContent").innerHTML + "
" + t; }
}
Ajax+JSON开发模式
了解下这种开发模式,Ajax提交给后端Tomcat,由具体servlet处理过程是:首先,servlet会将数据从数据库提取出来,组织成数据对象;再处理成JSON字符串,返回给前端进行局部页面的刷新。相对于传统整页刷新的模式,Ajax+JSON这种模式异步通信提升用户体验、JSON轻量级数据格式提高传输效率,JSON几乎可以被所有编程语言解析和处理更加灵活。

关于Java对象序列化为JSON,可以借助Jackson组件大致过程如下。当然也可以使用Ajax组件库Axios,使用简单的API简化了发送Ajax和处理响应的过程。
<!-- 引入依赖 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
</dependency>// Java对象-》josn
// 创建一个ObjectMapper对象,用于将Java对象转换为JSON字符串。
ObjectMapper objectMapper = new ObjectMapper();
// 使用ObjectMapper对象的writeValueAsString()方法将Java对象list转换为JSON字符串。
String json = objectMapper.writeValueAsString(list);
response.setContentType("text/json;charset=utf-8");
response.getWriter().println(json);
Ajax的跨域问题
我们知道浏览器的同源策略,当请求访问的不同的源,服务器会返回一个不带有Access-Control-Allow-Origin字段的响应,浏览器解析时发现缺少了这个字段, 就会报错。既然Access-Control-Allow-Origin字段是判断的依据,通常需要后端支持处理下这个字段。处理过程如下[1]:
// 1. 请求接口添加注解 @CrossOrigin(origins = "*", maxAge = 3600)
// 说明:origins = "*" origins 值为当前请求该接口的域2. 通用配置
/**
* 跨域请求配置
*/
@Configuration
public class CorsConfig { @Beanpublic CorsFilter corsFilter(){UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",buildconfig());return new CorsFilter(source);} private CorsConfiguration buildconfig(){CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");return corsConfiguration;}
}
[1] SpringBoot 优雅解决 ajax 跨域请求 https://juejin.cn/post/6844903954015322126?searchId=2024012821471504A45602B4CC6063A818
相关文章:
重学Ajax
摘要:AJAX是一个在前端的应用非常广泛技术,为什么还要谈它呢?么得办法之前学的不全面,再收拾收拾。水平有限,欢迎指正! AJAX(全称:Asynchronous JavaScript and XML)是一…...
springboot3+vue3支付宝交易案例-结算支付
springboot3vue3支付宝交易案例-结算支付!今天下午整理了一下结算的内容。遇到了很多问题。汇总分享给大家。 第一个问题:支付宝结算后,返回的交易编码,和交易时间,交易状态,都应该使用varchar来存。 第二…...
c语言 ceil() 函数
ceil()是C语言中的一个数学函数,用于向上取整。它的函数原型定义在math.h头文件中。 ceil()函数的作用是返回一个大于或等于给定参数的最小整数值,即将参数向上取整到最接近的整数。返回值的数据类型为double。 以下是ceil()函数的函数原型:…...
virtualBox虚拟机安装ubuntu后的必要配置
1. 使能双向copy 粘贴功能。在device menu的 shared clipboard项, 选bidirectional. 2.启用共享文件夹。 在device 菜单的 shared folder 项配置, (对于日期乱码问题和命令行打不开的问题请见ubuntu18.04安装后时间日期乱码及terminal打不开解决方法_电脑日期变成…...
《Pandas 简易速速上手小册》第6章:Pandas 时间序列分析(2024 最新版)
文章目录 6.1 时间序列数据基础6.1.1 基础知识6.1.2 重点案例:股票市场分析6.1.3 拓展案例一:温度变化分析6.1.4 拓展案例二:电商平台日销售额分析 6.2 日期与时间功能6.2.1 基础知识6.2.2 重点案例:活动日志分析6.2.3 拓展案例一…...
滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)招标公告
滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)招标公告 (招标编号:YDZOH20240158) 项目所在地区:云南省,临沧市,市辖区 一、招标条件 本滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)已由项目审批/核准/备案机关批准,项目资金来源为…...
(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法
Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …...
【Linux】环境基础开发工具的使用之gcc详解(二)
前言:上一篇文章中我们讲解了Linux下的vim和yum的工具的使用,今天我们将在上一次的基础上进一步的讲解开放工具的时候。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:Linux的深度刨析 👈 Ὂ…...
go语言-用channel控制goroutine的退出
用channel控制goroutine的退出 本文简要介绍了,如何用channel控制goroutine的退出的基本方法 for-range主动停止goruitine package mainimport ("fmt""sync""time" )/* Go并发编程模型:主动停止goroutine 方法一&#…...
强大的虚拟机Parallels Desktop 19 mac中文激活
Parallels Desktop是一款功能全面、易于使用的虚拟机软件,它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载:Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力,让用户能够迅…...
单元测试框架深入(一):单元测试框架深入
一、一个简单的例子 1、引入Maven依赖:JUnit框架和Surefire插件 2.在src/test/java目录下新建名字以“Test”结尾的测试类,并用Test注释测试方法 3.运行单元测试用例 或用mvn命令运行单元测试: 二、单元测试基础之单元测试框架:J…...
苏门X学士常识学习
前言 苏轼(1037年—1101年)是北宋的文坛领袖,很喜欢奖掖后进。其门下最有名的是“苏门四学士”,另外还有“苏门六学士”和“苏门后四学士”之说。 一、苏门四学士 苏轼在《与李昭玘书》中说: 轼蒙庇粗遣࿰…...
MD5算法:高效安全的数据完整性保障
摘要:在数字世界中,确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中,Message Digest Algorithm 5(MD5)算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…...
JavaScript基础五对象 内置对象 Math.random()
内置对象-生成任意范围随机数 Math.random() 随机数函数, 返回一个0 - 1之间,并且包括0不包括1的随机小数 [0, 1) 如何生成0-10的随机数呢? Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…...
curl之网络接口
Curl_cftype 连接接口定义 struct Curl_cftype {const char *name; /* name of the filter type */int flags; /* flags of filter type */int log_level; /* log level for such filters */Cu…...
Pytest中doctests的测试方法应用
在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…...
Android 8.1 铃声音量通话音量同步调节
Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈,想要实现铃声音量通话音量同步调节,具体修改参照如下: /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…...
C++——字符串string
C——字符串string C语言中对字符串的表示通常用指针,新手会面临内存泄漏或者段错误等众多问题。 在 C 中, string 类是标准库的一部分,用于表示和操作字符串。它是对传统的 C 风格字符串(以空 字符 ‘\0’ 结尾的字符数组&…...
HBuilder使用[微信小程序开发者工具] 显示 × initialize报错
解决办法 我们先要单独打开 微信开发者工具 点击设置里面的安全,把服务器端口打开 然后再回到我们的HBuilder使用重新打开打开 成功打开...
洛谷P8599 [蓝桥杯 2013 省 B] 带分数
[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式: 100 3 69258 714 100 3 \frac{69258}{714} 100371469258。 还可以表示为: 100 82 3546 197 100 82 \frac{3546}{197} 100821973546。 注意特征:带分…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
