异步交互技术Ajax

目录

一、同步交互和异步交互

二、Ajax 

1.概述

2.如何实现ajax请求

三、异步传输数据乱码的问题

regist.html页面代码

 服务端代码处理


一、同步交互和异步交互

同步交互:在同步交互中,参与的各方在同一时间进行交流。请求一项操作后,发起方必须等待响应才能继续进行下一步操作

异步交互:在异步交互中,参与的各方可以在不同的时间进行交流。发起方发送请求后,可以继续进行其他操作,而不必等待响应。

二、Ajax 

1.概述

Ajax是如何实现异步交互的?

  • AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

  • AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

  • AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

  • AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行。

  • XMLHttpRequest 只是实现 Ajax 的一种方式。

简单来说,我们之前发的请求通过类似 form表单标签,a标签 这种方式,现在通过 运行js代码动态决定什么时候发送什么样的请求

通过运行JS代码发送的请求浏览器可以不用跳转页面 ,我们可以在JS代码中决定是否要跳转页面

通过运行JS代码发送的请求,接收到返回结果后,我们可以将结果通过dom编程渲染到页面的某些元素上,实现局部更新

2.如何实现ajax请求

 原生javascript方式进行ajax(了解):

<script>function loadXMLDoc(){// 创建XMLHttpRequest对象var request=new XMLHttpRequest();// 设置回调函数处理响应结果// request.readyState  1 2 3 4(只需要知道4表示收到服务器的响应)// request.status		响应状态码响应行状态码request.onreadystatechange=function(){if (request.readyState==4 && request.status==200){document.getElementById("myDiv").innerHTML=request.responseText;}}// 设置请求方式和请求的资源路径request.open("GET","/try/ajax/ajax_info.txt",true);// 发送请求request.send();}
</script> 

三、异步传输数据乱码的问题

由于Ajax由原生js接收响应数据解码的问题,可能会出现乱码的现象,一般标准的规定是将传输的数据用JSON数据串传输。 

比如下面的场景,一个注册页面,姓名的验证问题

前端页面要将后端响应的数据(JSON串)转发为JSON对象

后端要将数据存到一个对象,将对象转发为JSON串响应回去

regist.html页面代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.ht{text-align: center;color: cadetblue;font-family: 幼圆;}.tab{width: 500px;border: 5px solid cadetblue;margin: 0px auto;border-radius: 5px;font-family: 幼圆;}.ltr td{border: 1px solid  powderblue;}.ipt{border: 0px;width: 50%;}.btn1{border: 2px solid powderblue;border-radius: 4px;width:60px;background-color: antiquewhite;}.msg {color: gold;}.buttonContainer{text-align: center;}</style><script>// 校验用户名的方法function checkUsername(){// 定义正则var usernameReg=/^[a-zA-Z0-9]{5,10}$/var username =document.getElementById("usernameInput").valuevar usernameMsgSpan =document.getElementById("usernameMsg")if(!usernameReg.test(username)){usernameMsgSpan.innerText="不合法"return false}// 发送ajax请求校验用户名是否被占用var request;if(window.XMLHttpRequest){request= new XMLHttpRequest();}else{request= new ActiveXObject("Microsoft.XMLHTTP");}request.onreadystatechange= function (){// request.readyState == 4 代表请求结束,已经接收到响应结果// request.status== 200  表示后端响应状态码是200if(request.readyState == 4  && request.status== 200){// 后端的响应的JSON字符串转换为前端的对象var response =JSON.parse(request.responseText)console.log(response)//  判断业务码是否是200if (response.code != 200){usernameMsgSpan.innerText="已占用"return false}}}// 设置请求方式,请求资源路径,是否为异步请求request.open("GET",'/user/checkUsernameUsed?username='+username,true)// 发送请求request.send();// 前面校验都通过// usernameMsgSpan.innerText="OK"// return true}// 校验密码的方法function checkUserPwd(){// 定义正则var passwordReg=/^[0-9]{6}$/var userPwd =document.getElementById("userPwdInput").valuevar userPwdMsgSpan =document.getElementById("userPwdMsg")if(!passwordReg.test(userPwd)){userPwdMsgSpan.innerText="不合法"return false}userPwdMsgSpan.innerText="OK"return true}// 校验密码的方法function checkReUserPwd(){// 定义正则var passwordReg=/^[0-9]{6}$/var userPwd =document.getElementById("userPwdInput").valuevar reUserPwd =document.getElementById("reUserPwdInput").valuevar reUserPwdMsgSpan =document.getElementById("reUserPwdMsg")if(!passwordReg.test(userPwd)){reUserPwdMsgSpan.innerText="不合法"return false}if(userPwd != reUserPwd){reUserPwdMsgSpan.innerText="不一致"return false}reUserPwdMsgSpan.innerText="OK"return true}//表单提交时统一校验function checkForm(){return checkUsername() && checkUserPwd() && checkReUserPwd()}</script>
</head>
<body>
<h1 class="ht">欢迎使用日程管理系统</h1>
<h3 class="ht">请注册</h3>
<form method="post" action="/user/regist" onsubmit="return checkForm()"><table class="tab" cellspacing="0px"><tr class="ltr"><td>请输入账号</td><td><input class="ipt" id="usernameInput" type="text" name="username" onblur="checkUsername()"><span id="usernameMsg" class="msg"></span></td></tr><tr class="ltr"><td>请输入密码</td><td><input class="ipt" id="userPwdInput" type="password" name="userPwd" onblur="checkUserPwd()"><span id="userPwdMsg" class="msg"></span></td></tr><tr class="ltr"><td>确认密码</td><td><input class="ipt" id="reUserPwdInput" type="password" onblur="checkReUserPwd()"><span id="reUserPwdMsg" class="msg"></span></td></tr><tr class="ltr"><td colspan="2" class="buttonContainer"><input class="btn1" type="submit" value="注册"><input class="btn1" type="reset" value="重置"><button class="btn1"><a  href="/login.html">去登录</a></button></td></tr></table>
</form>
</body>
</html>

 服务端代码处理

添加公共的JSON数据响应格式类

package com.atguigu.schedule.common;/*** 业务含义和状态码对应关系的枚举**/
public enum ResultCodeEnum {SUCCESS(200,"success"),USERNAME_ERROR(501,"usernameError"),PASSWORD_ERROR(503,"passwordError"),NOTLOGIN(504,"notLogin"),USERNAME_USED(505,"userNameUsed");private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code = code;this.message = message;}public Integer getCode() {return code;}public String getMessage() {return message;}
}

 

package com.atguigu.schedule.common;/*** 全局统一响应的JSON格式处理类**/
public class Result<T> {// 返回码private Integer code;// 返回消息private String message;// 返回数据private T data;public Result(){}// 返回数据protected static <T> Result<T> build(T data) {Result<T> result = new Result<T>();if (data != null)result.setData(data);return result;}public static <T> Result<T> build(T body, Integer code, String message) {Result<T> result = build(body);result.setCode(code);result.setMessage(message);return result;}public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {Result<T> result = build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}/*** 操作成功* @param data  baseCategory1List* @param <T>* @return*/public static<T> Result<T> ok(T data){Result<T> result = build(data);return build(data, ResultCodeEnum.SUCCESS);}public Result<T> message(String msg){this.setMessage(msg);return this;}public Result<T> code(Integer code){this.setCode(code);return this;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}

增加Jackson依赖

添加WEBUtil工具类  (后面SpringMVC框架会提供方法)

package com.atguigu.schedule.util;import com.atguigu.schedule.common.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;public class WebUtil {private static ObjectMapper objectMapper;// 初始化objectMapperstatic{objectMapper=new ObjectMapper();// 设置JSON和Object转换时的时间日期格式objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));}// 从请求中获取JSON串并转换为Objectpublic static <T> T readJson(HttpServletRequest request,Class<T> clazz){T t =null;BufferedReader reader = null;try {reader = request.getReader();StringBuffer buffer =new StringBuffer();String line =null;while((line = reader.readLine())!= null){buffer.append(line);}t= objectMapper.readValue(buffer.toString(),clazz);} catch (IOException e) {throw new RuntimeException(e);}return t;}// 将Result对象转换成JSON串并放入响应对象public static void writeJson(HttpServletResponse response, Result result){response.setContentType("application/json;charset=UTF-8");try {String json = objectMapper.writeValueAsString(result);response.getWriter().write(json);} catch (IOException e) {throw new RuntimeException(e);}}
}

用户名校验业务接口代码  

  /** * SysUserController下,注册时校验用户名是否被占用的业务接口* @param req* @param resp* @throws ServletException* @throws IOException*/protected void checkUsernameUsed(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");SysUser registUser = userService.findByUsername(username);//封装结果对象Result result=null;if(null ==registUser){// 未占用,创建一个code为200的对象result= Result.ok(null);}else{// 占用, 创建一个结果为505的对象result= Result.build(null, ResultCodeEnum.USERNAME_USED);}// 将result对象转换成JSON并响应给客户端WebUtil.writeJson(resp,result);}

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

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

相关文章

这样理解嵌入式术语

1.裸机开发&#xff1a;n个人拉屎&#xff0c;先进去一个拉完&#xff0c;下一个再来&#xff1b; 2.看门狗&#xff1a;如果有人拉完屎还占着茅坑刷视频&#xff0c;把他拖出去 3.中断系统&#xff1a;n个人拉屎&#xff0c;先进去的拉完&#xff0c;下一个再来。如果有拉肚…

陪跑案例 | 德国营养师吴迪:从胖妹逆袭塑形导师!公开首场发售秘籍

有目标&#xff0c;有心力的老师&#xff0c;一旦找对方法和团队&#xff0c;能够化解99%的问题。 今天&#xff0c;创客匠人【陪跑案例故事】专栏推出第四期内容&#xff0c;为大家介绍【梦想身型健康学院】平台创始人吴迪老师的陪跑故事。 吴迪老师是梦想身型训练营创始人、德…

海外媒体投稿:5个软文代发推广入门技巧

1. 软文代发概述 软文代发是一种通过第三方渠道发布软文的推广方式。它可以帮助小白快速上手推广&#xff0c;提高品牌知名度、产品销量等。软文代发不仅能够吸引更多的目标用户&#xff0c;还能提高网站的流量和转化率&#xff0c;从而带来更多的商机。 2. 明确目标受众和需求…

【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】

0 ref属性&#xff08;组件间通信&#xff09; # 1 ref属性放在普通标签上<input type"text" v-model"name" ref"myinput">通过 this.$refs[myinput] 拿到的是 原生dom对象操作dom对象&#xff1a;改值&#xff0c;换属性。。。# 2 ref属…

Java项目集成RocketMQ

文章目录 1.调整MQ的配置1.进入bin目录2.关闭broker和namesrv3.查看进程确认关闭4.编辑配置文件broker.conf&#xff0c;配置brokerIP15.开放端口109116.重新启动1.进入bin目录2.启动mqnamesrv和mqbroker1.启动 NameServer 并将输出重定向到 mqnamesrv.log2.**启动 Broker 并将…

YouTube最好用的翻译插件

相信很多同学和我一样&#xff0c;想看YouTube视频时发现基本上都说英文&#xff0c;以我的英文水平&#x1f923;去观看真是一言难尽&#xff0c;所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译&#xff0c;结果还真让我找到了一个不错的Youtube翻译插件&#xff0c;它…

【数据结构】队列的实现

0. 前言 上期博客给大家讲解了 栈 以及 栈的实现&#xff0c;今天再给大家讲一个特殊的顺序表结构&#xff0c;那就是队列&#xff01; 下面就进入正题&#xff01;一起学习一下吧&#xff01; 1. 队列 1.1 队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&…

多媒体技术及应用课程思政网站

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括多媒体技术及应用课程思政网站的网络应用&#xff0c;在外国多媒体技术及应用课程思政已经是很普遍的方式&#xff0c;不过国内的多媒体技术及应用课程思政可能还处于起…

WPF Mvvm

了解MVVM 什么是MVVM&#xff1a;一种设计模式 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人…

网络招商是什么意思,主要干什么工作?

互联网时代&#xff0c;网络招商&#xff0c;已经是企业不可缺少的一部分&#xff0c;这篇文章&#xff0c;详细为大家分享&#xff0c;网络招商的意思&#xff0c;以及主要工作内容&#xff01; 一、网络招商意思 就是利用互联网进行招商的一种方式&#xff0c;借助互联网的…

【深度学习】直观理解AUROC

文章目录 前言如何计算直观解释常用计算方式 前言 AUROC常用于衡量二分类分类器的性能&#xff0c;本文旨在详解该指标计算过程 如何计算 设想我们有一个分类器&#xff0c;对数据做二分类。我们设输入数据为 x x x, 预测标签为 y y y, ground-truth标签为 y ^ \hat{y} y…

docker 拉取镜像 error pulling image configuration: download failed ****

问题&#xff1a; 在安装docker后拉取镜像的时候 出现error pulling image configuration: download failed ****异常 原因&#xff1a; 由于镜像源配置的问题引起的镜像拉取异常 解决 由于网络或者其他原因导致拉取镜像请求失败&#xff0c;报错&#xff1a; error pulli…

Oracle 用户-表空间-表之间关系常用SQL

问题&#xff1a; 当某一个表数据量特别大&#xff0c;突然插入数据一直失败&#xff0c;可能是表空间不足&#xff0c;需要查看表的使用率 用户-表空间-表之间关系&#xff1a;用户可以有多个表空间&#xff0c;表空间可以有多个表&#xff0c;表只能拥有一个表空间和用户 1.…

爱心动画代码HTML5

这段代码是一个HTML5 Canvas动画&#xff0c;它通过JavaScript创建了一个动态的爱心效果。页面初始化时&#xff0c;首先定义了一些基本设置&#xff0c;如粒子数量、持续时间、速度等。然后&#xff0c;定义了Point和Particle类&#xff0c;用于处理粒子的位置和运动。接着&am…

C语言数据类型和变量

数据类型介绍 数据类型介绍 C语言提供了丰富的数据类型来描述生活中的各种数据。 使用整型类型来描述整数&#xff0c;使用字符类型来描述字符&#xff0c;使用浮点型类型来描述小数。 所谓“类型”&#xff0c;就是相似的数据所拥有的共同特征&#xff0c;编译器只有知道了数…

软件测试经典面试题,助你面试加分

Hi&#xff0c;大家好&#xff0c;进入金九银十&#xff0c;很多小伙伴有被动跳槽的打算&#xff0c;所以更新一些经典的软件测试面试题&#xff0c;希望能帮到大家&#xff01; 时间紧迫的情况下&#xff0c;如何做好测试工作&#xff1f; 对需求要明确&#xff0c;对需求的优…

iPhone如何全选删除照片:一步到位的清理指南

随着时间的推移&#xff0c;iPhone中的照片会迅速累积&#xff0c;最终可能占据大量的存储空间。无论是为了释放空间&#xff0c;还是整理照片库&#xff0c;iPhone如何全选删除照片成为许多用户的需求。然而&#xff0c;iPhone原生的“照片”应用并没有直接提供“全选删除”功…

汽车租赁管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

SAIA触摸屏维修PCD7.D457VNCG03 SAIA-burgess

瑞士SAIA触摸屏维修SAIA-burgess思博控制器维修PCD7全系列。 触摸屏维修常见故障&#xff1a;黑屏、指示灯无任何显示&#xff0c;触摸屏上电无反应&#xff0c; 上电蓝屏、白屏&#xff0c;通电几分钟后屏幕变为蓝屏&#xff0c;主板故障&#xff0c;通讯时有时无&#xff0c…

LiveQing视频点播流媒体RTMP推流服务用户手册-概览:CPU使用、内存使用、在线人数、流量统计、带宽使用(Mbps)、存储使用、实时存储(MB/s)

LiveQing视频点播流媒体RTMP推流服务用户手册-概览:CPU使用、内存使用、在线人数、流量统计、带宽使用&#xff08;Mbps&#xff09;、存储使用、实时存储&#xff08;MB/s&#xff09; 1、概览1.1、CPU使用1.2、内存使用1.3、在线人数1.4、流量统计1.5、带宽使用(Mbps)1.6、存…