深入解析与实践: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, Safari
            xmlhttp=new XMLHttpRequest();
          }
          else
          {// code for IE6, IE5
            xmlhttp=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 {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        @Override
        protected 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 {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        @Override
        protected 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. 测试结果

    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标文献分析方法

如何正确选题&#xff1f; 不仅仅是题目&#xff0c;而是研究工作的起步选题步骤&#xff1f; 发现问题选择方向调查研究分析论证确定选题 中国知网 深度学习方向词 1检索&#xff1a;深度学习 医疗影像 1 发表时间要最新 2 显示50个&#xff0c;全选 3 导出文献格式Ref 4 导…

无法打开浏览器开发者工具的可能解决方法

网页地址: https://jx.xyflv.cc/?url视频地址url 我在抖音里面抓了一个视频地址, 获取到响应的json数据, 找到里面的视频地址信息 这个网站很好用: https://www.jsont.run/ 可以使用js语法对json对象操作, 找到所有视频的url地址 打开网页: https://jx.xyflv.cc/?urlhttps:…

最推荐的视频播放器——PotPlayer

PotPlayer&#xff0c;是The KMPlayer的原作者姜勇囍进入Daum公司后的新一代作品&#xff0c;目前仍有更新。由于采用Delphi编译程式的KMPlayer有一些弊端&#xff0c;姜勇囍为改进播放器本身的一些效能而重新用VC进行构架。 除了支持3D视频外&#xff0c;PotPlayer还覆盖支持…

MetaGPT-打卡-day2,MetaGPT框架组件学习

文章目录 Agent组件实现一个单动作的Agent实现一个多动作的Agent技术文档生成助手其他尝试 今天是第二天的打卡~昨天是关于一些概念的大杂烩&#xff0c;今天的话&#xff0c;就来到了Hello World环节。 从单个Agnet到多个Agent&#xff0c;再到组合更复杂的工作流来解决问题。…

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测。 2.自带数据…

均线和布林线这样的关系,WeTrade众汇实例这样使用

在后台经常有交易者咨询:“我可以用加权平均线或指数代替移动平均线吗?”理论上&#xff0c;任何平均值都适合绘制BB。在回答这个问题之前&#xff0c;为了稳妥起见&#xff0c;WeTrade众汇通过对各种均线对比分析&#xff0c;却得出这样结论:经典均线是构建参考点最简单、最准…

element-plus表格判断table中的数据是否换行展示,如果换行展示,替换为....

文章目录 需求分析 需求 element-plus表格判断table中的数据是否换行展示&#xff0c;如果换行展示&#xff0c;替换为… 分析 <style lang"less" scoped>::v-deep(.el-table .cell) {overflow: hidden; // 溢出隐藏text-overflow: ellipsis; // 溢出用省略号…

蓝桥杯(C++ 整数删除 优先队列 )

优先队列&#xff1a; 优先队列具有队列的所有特性&#xff0c;包括队列的基本操作&#xff0c;只是在这基础上添加了内部的一个排序&#xff0c;它本质是一个堆实现的。 1.头文件&定义 #include <queue> #include <functional> //greater<>// 定义 p…

如何使用@font-face

font-face css 提供的font-face可以让开发者自定义项目中的字体。字体可以从远程服务器获取&#xff0c;也可以从本地加载。 font-face {font-family: "Open Sans";src:url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"),url(&qu…

鸿蒙开发实战-OpenHarmony沙箱文件

在openharmony文件管理模块中&#xff0c;按文件所有者分类分为应用文件和用户文件和系统文件。 1&#xff09;沙箱文件。也叫做应用文件&#xff0c;包括应用安装文件、应用资源文件、应用缓存文件 二.文件详解 在使用时首先需要导入包 import fs from “ohos.file.fs”&am…

某马头条——day05

文章定时发布 实现方案对比 实现方案 延迟队列服务实现 按照文档进行项目的导入并准备数据库表导入对应实体类和nacos配置中心 乐观锁集成 redis集成和测试 成功集成通过测试 添加任务 ①&#xff1a;拷贝mybatis-plus生成的文件&#xff0c;mapper ②&#xff1a;创建task类…

C++ 设计模式之观察者模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 前面的文章介绍了创建型模式和结构型模式&#xff0c;今天开始介绍行为型模式。 【简介】什么是…

Google play 应用批量下架的可能原因及应对指南

想必大多数上架马甲包或矩阵式上架的开发者们&#xff0c;都遭遇过应用包批量被下架、账号被封的情况。这很令人苦恼&#xff0c;那造成这种情况的可能原因有哪些呢&#xff1f;以及如何降低这种情况发生&#xff1f; 1、代码问题 通常上架成功后被下架的应用&#xff0c;很可…

PyTorch入门之Tensor综合-含操作/运算、机器学习的关系、稠密张量与稀疏张量的定义等

PyTorch入门之Tensor综合-含操作/运算、机器学习的关系、稠密张量与稀疏张量的定义等 Tensor的理解 数学中有标量、向量和矩阵的概念&#xff0c;它们的维度分别是0、1、2。其中&#xff1a; 标量可以看成的一个数字&#xff0c;1&#xff0c;标量中元素的位置固定。向量可以…

014集:python访问互联网:网络爬虫实例—python基础入门实例

以pycharm环境为例&#xff1a; 首先需要安装各种库(urllib&#xff1a;requests&#xff1a;Openssl-python等) python爬虫中需要用到的库&#xff0c;大致可分为&#xff1a;1、实现 HTTP 请求操作的请求库&#xff1b;2、从网页中提取信息的解析库&#xff1b;3、Python与…

Gin 框架之Cookie与Session

文章目录 一、Cookie和Session的由来二、Cookie简介1. 什么是Cookie2. Cookie规范3. 安全性4. Cookie 关键配置 三、Session简介1. 什么是Session2. Session 安全性3. 如何让客户端携带 sess_id 四、使用 Gin 的 Session 插件4.1 介绍4.2 基本使用 五、 session与store5.1 会话…

【算法】递归

递归 递归初始递归&#xff1a;数列求和递归的应用&#xff1a;任意进制转换递归深度限制递归可视化&#xff1a;分形树递归可视化&#xff1a;谢尔宾斯基Sierpinski三角形递归的应用&#xff1a;汉诺塔递归的应用&#xff1a;探索迷宫 分治策略和递归优化问题兑换最少个数硬币…

蓝桥杯回文日期判断

思想&#xff1a;对于回文数的判断方法&#xff0c;最快的就是取其中一半的字符串长度&#xff0c;为s&#xff0c;然后将其进行翻转为s’ &#xff0c;再把两者进行拼接即可保证是回文数&#xff0c;这样子就解决了枚举所有回文数的问题。 注意点&#xff1a; 要求必须是有效…

机器学习:holdout法(Python)

import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder, StandardScaler # 类别标签编码&#xff0c;标准化处理 from sklearn.decomposition import PCA # 主成分分析 import matplotlib.pyplot as plt from sklearn.model_selection impor…

积分梳状滤波器CIC原理与实现

CIC&#xff08;Cascade Intergrator Comb&#xff09;&#xff1a;级联积分梳状滤波器&#xff0c;是由积分器和梳状滤波器级联而得。滤波器系数为1&#xff0c;无需对系数进行存储&#xff0c;只有加法器、积分器和寄存器&#xff0c;资源消耗少&#xff0c;运算速率高&#…