深入解析与实践:Ajax异步请求在Web开发中的应用指南

一、概述

1、定义

​ Ajax(Asynchronous JavaScript and XML)异步请求是现代Web开发中不可或缺的技术组件,它允许网页在不刷新整个页面的情况下从服务器获取并更新数据,从而实现动态、流畅的交互体验。

2、异步和同步

浏览器访问服务器的方式

  • 同步访问: 客户端必须等待服务器端的响应,在等待过程中不能进行其他操作。
  • 异步访问: 客户端不需要等待服务的响应,在等待期间,浏览器可以进行其他操作。

3、Ajax的好处

  • 减轻服务器负担,按需要获得数据。
  • 无刷新更新页面,减少用户的实际和心理的等待时间。
  • 只更新部分页面,有效利用带宽
  • 主流浏览器都支持Ajax

4、应用场景

​ 该技术广泛应用于各类Web应用,如用户登录验证、动态加载内容、实时数据更新等场景。

二、原生ajax

1、工作原理

​ 利用XMLHttpRequest发起HTTP请求,包括GET、POST等各种方法,以及处理响应数据,使用ajax接收响应,使用jS进行页面刷新。

2、代码示例

  1. 界面代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %><!DOCTYPE html>
    <html>
    <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>new jsp</title><%--导入远程jQuery依赖--%><script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script><script>//原生JS方式发送 Ajax请求function run() {//1.核心对象var xmlhttp;//2.判断浏览器类型if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safarixmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}//3.建立连接xmlhttp.open("GET","/origin_ajax?username=tom",true);//4.发送请求xmlhttp.send();//5.获取响应结果xmlhttp.onreadystatechange=function() {//readyState==4 请求已完成,且响应已就绪if (xmlhttp.readyState==4 && xmlhttp.status==200){var text =xmlhttp.responseText;alert("响应结果: " + text);}}}</script>
    </head>
    <body><input type="button" value="原生JS发送异步请求" οnclick="run()"><br>
    异步请求不影响文本框 <input type="text"><br></body>
    </html>
    
  2. servlet代码

    package com.example.ajax_demo02;import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;@WebServlet(name = "OriginAjaxServlet", urlPatterns = "/origin_ajax")
    public class OriginAjaxServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、获取请求参数String username = request.getParameter("username");System.out.println(username);//模拟请求处理延迟try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//2、响应response.getWriter().write(username);}
    }
  3. 测试结果

    在这里插入图片描述

    如图,发送ajax请求,并不会重刷界面。

原生ajax缺点

  • 若使用JS原生的AJAX技术,为了实现简单功能,就需要书写大量复杂代码。
  • JS的AJAX代码,浏览器兼容性比较差。

三、jQuery框架的ajax

1、JQuery框架的ajax简介

jquery是一个优秀的js框架,对js原生的ajax进行了封装,封装后的ajax的操作方法更简洁,功能更强大.开发中经常使用的方式有三种:POST、GET、AJAX

2、get请求代码示例

  1. 界面代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>ajax的get请求</title>
    </head><script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script>function run() {var url = "${pageContext.request.contextPath}/origin_ajax";var data = {username:"lucky"};$.get(url, data, function (param) {alert("get请求的响应:" + param);}, "text")}</script><body><input type="button" value="get异步请求" οnclick="run()">
    </body>
    </html>
  2. servlet代码不变

  3. 测试结果

    在这里插入图片描述

3、post请求代码示例

  1. 界面代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>ajax的post请求</title>
    </head><script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script>function run() {var url = "${pageContext.request.contextPath}/origin_ajax";var data = {username:"lucky"};$.post(url, data, function (param) {alert("post请求的响应:" + param);}, "text")}</script><body><input type="button" value="post异步请求" οnclick="run()">
    </body>
    </html>
  2. servlet代码不变

  3. 测试结果

    在这里插入图片描述

4、ajax请求代码示例

  1. 界面代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>ajax的ajax请求</title>
    </head><script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script>function run() {$.ajax({url:"${pageContext.request.contextPath}/origin_ajax",async:true, //是否异步data:{username:"zhangsan"},type:"GET", //请求方式dataType:"text", //返回数据的数据类型success:function (param) {alert("响应成功!" + param);},error:function () {alert("响应失败!")}});}</script><body><input type="button" value="ajax异步请求" οnclick="run()">
    </body>
    </html>
  2. servlet代码不变

  3. 测试结果

    在这里插入图片描述

5、验证用户名重复案例

  1. 需求

    • 当用户注册时 编辑用户名,编辑完成后,若查到用户名已被使用,需要在界面显示提示,此需求适用于异步处理。
  2. 界面代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>ajax的ajax请求</title>
    </head><script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script>$(function () {$("#username").blur(function () {//获取用户名var name = $(this).val();//判断用户名不为空和空串if(name != null && name != ""){//向后台发送请求,验证用户名$.ajax({url:"${pageContext.request.contextPath}/checkName",type:"GET",data:{username:name},dataType:"json",success:function (data) {if(data.flag){//设置span的内容体$("#spanMsg").html("<font color='red'>" +data.msg+"</font>");}else if(!data.flag){$("#spanMsg").html("<font color='green'>" +data.msg+"</font>");}},error:function () {alert("请求处理失败!");}});}})});</script><body>
    <form action="#" method="post">用户名: <input type="text" id="username" name="username" placeholder="请输入用户名"><span id="spanMsg" style="color: red"></span> <br>密码:<input type="text" id="password" name="password" placeholder="请输入密码">
    </form>
    </body>
    </html>
  3. servlet代码

    package com.example.ajax_demo02;import com.alibaba.fastjson.JSON;import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    import java.util.HashMap;@WebServlet(name = "CheckNameServlet", value = "/checkName")
    public class CheckNameServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置编码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//获取用户名String username = req.getParameter("username");//Map封装数据HashMap<String,Object> map = new HashMap<>();//判断用户是否存在if("tom".equals(username)){//用户名存在map.put("flag",true);map.put("msg","用户名已经被占用!");//响应JSON格式的数据String data = JSON.toJSONString(map);resp.getWriter().print(data);}else{//用户名不存在map.put("flag",false);map.put("msg","用户名可以使用!");String data = JSON.toJSONString(map);resp.getWriter().print(data);}}
    }
  4. 测试结果

    在这里插入图片描述

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

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

相关文章

计数排序(线性时间排序)

背景 1954年由 Harold H. Seward 提出 基本思想&#xff1a; 假设&#xff1a;计数排序假设n个输入元素中的每一个都是介于0到k之间的整数 举例&#xff1a;10 个年龄不同的人&#xff0c;统计出有 8 个人的年龄比 A 小&#xff0c;那 A 的年龄就排在第 9 位,用这个方法可以…

本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程连接

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

通讯录管理系统

文章目录 1.系统需求2.创建项目3.菜单功能4.退出功能实现5.添加联系人5.1设计联系人结构体5.2设计通讯录结构体5.3main函数中创建通讯录 6.显示联系人6.1封装显示联系人函数6.2测试显示联系人功能 7.删除联系人7.1封装检测联系人是否存在7.2封装删除联系人函数7.3测试删除联系人…

学习【Git项目管理工具】这一篇就够了

目录 1. Git概述2. Git代码托管服务3. Git常用命令3-1. Git全局配置设置用户信息查看配置信息 3-2. 获取Git仓库本地初始化仓库克隆远程仓库 3-3. 基本概念工作区文件状态 3-4. 本地仓库操作git reset 操作 3-5. 远程仓库操作查看远程仓库添加远程仓库推送远程仓库拉取远程仓库…

实战之-Redis商户查询缓存

一、什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震器",防止过高…

AWTK 开源智能串口屏方案视频介绍

强大的界面设计器 AWStudio。 基于 AWTK 实现强大的 GUI 功能&#xff08;多窗口、输入法、动画和各种控件&#xff09;。 基于 AWTK-MVVM 实现低代码开发&#xff08;编写绑定规则即可实现常见应用程序&#xff09;。 支持在 PC 上模拟运行&#xff0c;并提供 MCU 模拟器模…

SRC实战 | EDU通用漏洞分享

本文由掌控安全学院 - 叴龙 投稿 又是没事干的一天&#xff0c;写一下之前挖的两个通用漏洞。 1.信息搜集 首先就是信息搜集&#xff0c;挖edu没账号怎么办呢&#xff1f;sg不行&#xff0c;咱就找能自己注册的站。 Hunter&#xff1a;web.title”XX大学”&&web.bod…

2024 Google material-design-icons助力你创建更好的Material风格应用

2024 Google material-design-icons助力你创建更好的Material风格应用 Material Icons / Material Symbols 这是谷歌推出的两个不同的官方图标集&#xff0c;它们使用相同的基础设计。Material Icons是经典的图标集&#xff0c;而Material Symbols是在2022年4月引入的&#x…

Linux自动化构建工具——make和Makefile使用详解

一、初步认识make和Makefile 我们首先需要知道的是&#xff0c;make是一个命令&#xff0c;Makefile是一个文件&#xff0c;Makefile中包含了依赖关系和依赖方法。 从上面的文件以及指令中我们可以看到&#xff0c;我们可以在Makefile文件中写入依赖关系以及对应的依赖方法&…

设计模式⑦ :简单化

文章目录 一、前言二、Facade 模式1. 介绍2. 应用3. 总结 三、Mediator 模式1. 介绍2. 应用3. 总结 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书"系列。本系列大部分内容…

配置redis挂载

1. 暂停和删除redis 2.创建文件夹 /usr/local/software/redis/6379/conf/ /usr/local/software/redis/6379/data/ 把redis-conf文件上传到conf文件夹中 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4.运…

Go后端开发 -- 反射reflect 结构体标签

Go后端开发 – 反射reflect && 结构体标签 文章目录 Go后端开发 -- 反射reflect && 结构体标签一、反射reflect1.编程语言中反射的概念2.interface 和反射3.变量内置的pair结构4.reflect的基本功能TypeOf和ValueOf5.从relfect.Value中获取接口interface的信息6…

C++ 设计模式之 中介者模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是中介者模式 &#xff08;第16种模式&#xff09; 中介者模式&#xff08;Medi…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

TQ8WS-acid,Tide Quencher 8WS-酸,可用来研究荧光物质的激发态

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher8WS acid&#xff0c;TQ8WS acid&#xff0c;Tide Quencher 8WS 酸 &#xff0c;TQ8WS 酸&#xff0c;Tide Quencher 8WS-酸&#xff0c;TQ8WS-酸 一、基本信息 产品简介&#xff1a;The fluorescence…

牛客.KY11二叉树遍历、 LeetCode104.二叉树的最大深度 ,110平衡二叉树

二叉树实操小练习~这里对二叉树的遍历要有一定的理解&#xff0c;如果还不熟悉的小伙伴可以看看我的这篇博客&#xff1a;数据结构——二叉树&#xff08;先序、中序、后序及层次四种遍历&#xff08;C语言版&#xff09;&#xff09;超详细~ (✧∇✧) Q_Q-CSDN博客 牛客.KY11二…

文档翻译网站有哪些?这些工具高效翻译

文档翻译网站有哪些&#xff1f;随着全球化的加速&#xff0c;跨语言沟通变得越来越重要。然而&#xff0c;语言差异常常成为我们与世界各地人们交流的障碍。为了解决这个问题&#xff0c;文档翻译软件应运而生。今天&#xff0c;我们就来介绍一些受欢迎的文档翻译软件&#xf…

【Docker】安装nacos以及实现负载均衡

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 一.nacos单个部署 1.镜像拉取 …

4.C++类和对象

深拷贝和浅拷贝的简单理解&#xff1a;