第1讲:XMLHttpRequest详解(ajax基础)

news2024/11/25 23:30:13

XMLHTTPRequest对象

        XMLHTTPRequest对象,是基于XML的HTTP请求。XMLHTTPRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通讯。自从浏览器提供了XMLHTTPRequest这个接口之后,ajax操作就此诞生。

AJAX = Asynchronous JavaScript and XML,翻译为:异步的 JavaScript 和 XML。ajax就是基于浏览器提供的XMLHttpRequest对象来实现的。传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。自从有了ajax之后,我们就可以实现异步的加载网页。

XML 指可扩展标记语言(eXtensible Markup Language)。我们在浏览器中使用XMLHTTPRequest对象在服务器之间通信,传输的数据是使用XML的方式,但最终还是会被转换成json数据格式来被我们使用。

创建XMLHttpRequest实例

<script type="text/javascript">
    var xmlhttp;
    //创建XMLHttpRequest对象
    function createHttpRequest(){
        try{
            // 新版IE
            return  new ActiveXObject("Msxml2.XMLHTTP");
        }catch (e){

        }
        try{
            // ie5/6,老版Opera
            return new ActiveXObject("Microsoft.XMLHTTP");
        }catch (e){

        }
        try{
            // ie7+等现代浏览器
            return new XMLHttpRequest();
        }catch (e){

        }
        alert("该浏览器不支持ajax技术");
        return null;
    }
</script>

接收返回结果

    //接受返回结果

    function callback(){
        //alert(xmlhttp.readyState + ":" + xmlhttp.status);
        if(xmlhttp.readyState == 4){ //发送完成
            if(xmlhttp.status == 200) { //响应成功
                alert(xmlhttp.responseText);
            }else{
                //报错
                alert(xmlhttp.status);
            }

        }

    }

readyState属性返回请求状态。

 

状态对照表
状态描述
0UNSENT代理被创建,但尚未调用 open() 方法。请求初始化
1OPENEDopen() 方法已经被调用。在这个状态中,可以通过 setRequestHeader() 方法来设置请求的头部, 可以调用 send() 方法来发起请求。服务器连接已建立
2HEADERS_RECEIVED    send() 方法已经被调用,并且头部和状态已经可获得。请求已接收
3LOADING下载中; responseText 属性已经包含部分数据。响应体部分正在被接收。如果 responseType 属性是“text”或空字符串, responseText 将会在载入的过程中拥有部分响应数据。请求处理中
4DONE下载操作已完成。请求操作已经完成。这意味着数据传输已经彻底完成或失败。

 

在IE中,状态有着不同的名称,并不是 UNSENT,OPENED , HEADERS_RECEIVED , LOADING 和 DONE, 而是 READYSTATE_UNINITIALIZED (0),READYSTATE_LOADING (1) , READYSTATE_LOADED (2) , READYSTATE_INTERACTIVE (3) 和 READYSTATE_COMPLETE (4)

status属性返回响应状态

返回了XMLHttpRequest 响应中的数字状态码。status 的值是一个无符号短整型,http状态码。在请求完成前,status的值为0。值得注意的是,如果 XMLHttpRequest 出错,浏览器返回的 status 也为0,成功状态为200,如果出错返回的状态码根据错误情况定,如404找不到资源,500内部错误等。

XMLHttpRequest.statusText


只读属性 XMLHttpRequest.statusText 返回了XMLHttpRequest 请求中由服务器返回的一个DOMString 类型的文本信息,这则信息中也包含了响应的数字状态码。不同于使用一个数字来指示的状态码XMLHTTPRequest.status,这个属性包含了返回状态对应的文本信息,例如"OK"或是"Not Found"。如果请求的状态readyState的值为"UNSENT"或者"OPENED",则这个属性的值将会是一个空字符串。如果服务器未明确指定一个状态文本信息,则statusText的值将会被自动赋值为"OK"。

XMLHttpRequest.response


返回响应的正文支持以下几种值

responseText:服务器返回的文本数据,如果返回是JSON数据,使用JSON.parse方法解析
responseXML:服务器返回的XML格式的数据

XMLHttpRequest.ontimeout


代表着一个请求在被自动终止前所消耗的毫秒数。默认值为 0,意味着没有超时。超时并不应该用在一个 document environment 中的同步 XMLHttpRequests  请求中,否则将会抛出一个 InvalidAccessError 类型的错误。当超时发生, timeout 事件将会被触发。在IE中,超时属性可能只能在调用 open() 方法之后且在调用 send() 方法之前设置。不能在拥有的window中,给同步请求使用超时。

xmlhttp.timeout = 2000; // 超时时间,单位是毫秒

xmlhttp.ontimeout = function(event){
  alert('请求超时!');

FormData对象

AJAX操作往往用来传递表单数据。为了方便表单处理,HTML 5新增了一个FormData对象,可以模拟表单

//首先,新建一个FormData对象。
var formData = new FormData();

//然后,为它添加表单项。
formData.append('username', '张三');
formData.append('password', 123456);

//最后,直接传送这个FormData对象。这与提交网页表单的效果,完全一样。
xmlhttp.send(formData);

上传文件 

新版XMLHttpRequest对象,不仅可以发送文本信息,还可以上传文件

假定files是一个"选择文件"的表单元素(input[type="file"]),我们将它装入FormData对象。

var formData = new FormData();

for (var i = 0; i < files.length;i++) {
  formData.append('files[]', files[i]);
}

xhr.send(formData);

跨域资源共享(CORS)

新版本的XMLHttpRequest对象,可以向不同域名的服务器发出HTTP请求。这叫做跨域资源共享。使用"跨域资源共享"的前提,是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"。如果能够满足上面的条件,则代码的写法与不跨域的请求完全一样。

流程图

完整应用

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script type="text/javascript">
    var xmlhttp;
    //创建XMLHttpRequest对象
    function createHttpRequest(){
        try{
            return  new ActiveXObject("Msxml2.XMLHTTP");
        }catch (e){

        }
        try{
            return new ActiveXObject("Microsoft.XMLHTTP");
        }catch (e){

        }
        try{
            return new XMLHttpRequest();
        }catch (e){

        }
        alert("该浏览器不支持ajax技术");
        return null;
    }
    //接受返回结果

    function callback(){
        //alert(xmlhttp.readyState + ":" + xmlhttp.status);
        if(xmlhttp.readyState == 4){ //发送完成
            if(xmlhttp.status == 200) { //响应成功
                alert(xmlhttp.responseText);
            }else{
                //报错
                alert(xmlhttp.status);
            }

        }

    }
    //发送函数
    function send(){
        //创建对象
        xmlhttp = createHttpRequest();
        //绑定事件,后台返回的数据,通过callback方法处理
        xmlhttp.onreadystatechange = callback;
        //获取控件的值
        var num = document.getElementById("num").value;
        var url = "http://localhost:8080/ajaxProj/ajaxServlet?num=" + num;
        /*
        * open函数:
        *   参数1:提交方法(post|get)
        *   参数2:提交地址url
        *   参数3:是否同步(true|false);
        * True   异步调用
        * False  非异步
        * */
        xmlhttp.open("get",url,false);
        //xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        //发送请求
        xmlhttp.send();
    }

</script>
<body>
    <h2 align="center">创建XMLHttpRequest对象</h2>
    <hr>
    <input type="button" value="创建XMLHttp" onclick="createHttpRequest()">
    <hr>
    <input type="text" name="num" id="num" value="10">
    <input type="button" value="发送请求到ajaxServlet" onclick="send()">
</body>
</html>

//后端Servlet代码


package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "AjaxServlet",value = "/ajaxServlet")
public class AjaxServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        String num = request.getParameter("num");
        System.out.println("num=" + num);
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("接收成功num的值:" + num);
        out.close();


    }
}

运行结果

 

 

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

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

相关文章

Exploit/CVE-2010-0738

打开JBoss的潘多拉魔盒&#xff1a;JBoss高危漏洞分析 *本文中涉及到的相关漏洞已报送厂商并得到修复&#xff0c;本文仅限技术研究与讨论&#xff0c;严禁用于非法用途&#xff0c;否则产生的一切后果自行承担。 前言 JBoss是一个基于J2EE的开放源代码应用服务器&#xff0…

盖雅工场联合福达企业资源系統 (DynaSys) 成功举办 SAP SuccessFactors Day 活动

2023年5月31日&#xff0c;由DynaSys主办、盖雅工场协办的SAP SuccessFactors Day活动在香港半岛酒店成功举行。本次活动旨在为在港企业分享员工体验和劳动力管理解决方案&#xff0c;并以行业标杆案例为指引&#xff0c;帮助企业客户在全球市场中更好地制定人力资源管理策略。…

Linux下socket网络编程实战思考

socket网络编程是每个服务端开发人员必会技能&#xff0c;但是目前市面上各种web服务器容器&#xff0c;屏蔽了很多底层实现&#xff0c;导致很多socket通信细节被屏蔽&#xff0c;本文结合在linux下C语言socket通信说明一下网络通信的一些注意点。 目录 1.多进程模型tcp服务…

Windows11安装mysql8.0.32步骤

1、下载mysql安装包 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 2、添加配置文件 mysql安装文件目录下新建一个文件名&#xff1a;my.inimy.ini文件中复制如下内容&#xff1a; [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 ---这里输入你安装…

Linux中的C/C++语言调试工具 GDB

Linux中的C/C语言调试工具 GDB GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的调试器&#xff0c;用于调试和分析程序的执行过程。它是GNU项目的一部分&#xff0c;可以在多个操作系统上使用&#xff0c;包括Linux、Unix和Windows。 GDB主要用于调试编译后的可执行…

大模型扎堆「赶考」,语文还是国产AI行,文言文能力超过95%考生

量子位 | 公众号 QbitAI ChatGPT诞生后的第一场全国高考&#xff0c;考生忙&#xff0c;大模型们也很忙。 这不&#xff0c;高考还没结束&#xff0c;AI挑战高考题就成了刷屏热搜话题&#xff0c;各家大模型都被拉出来写起了高考作文&#xff0c;甚至是参与整场考试。 &#…

【MySQL事务】保证数据完整性的利器

1、事务的认识 事务&#xff1a;事务就是将多个SQL给打包在一起&#xff0c;组成一个整体。组成这个整体的各个SQL&#xff0c;要么全部成功&#xff0c;要么全部失败。 举例说明&#xff1a; 情人节到了&#xff0c;滑稽老铁打算给他女朋友小美发给红包&#xff0c;但是他又害…

msvcp140.dll重新安装的解决方法(一键安装方法)

msvcp140.dll电脑文件中的dll文件&#xff0c;即动态链接库文件&#xff0c;若计算机中丢失了某个dll文件&#xff0c;就会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错&#xff0c;其安装方法&#xff1a;1、打开浏览器输入“【dll修复程序…

[Diffusion] Speed is all your need

论文简要总结 刚读了下speed is all you need这个论文, https://arxiv.org/pdf/2304.11267.pdf 只是用的SD1.4没有对网络进行改造。 只做了4个改动 1 是对norm采用了groupnorm (GPU shader加速) 2 采用了GELU (GPU shader加速) 3 采用了两种attention优化&#xff0c;是partiti…

一个简单的MCU内存管理模块(附源码)

现在非常多的的MCU性能都还不错&#xff0c;同时用户也会去扩展一些外部RAM&#xff0c;那么如何高效便捷的管理这些内存是一个重要话题。 今天给大家分享一份源码&#xff1a;基于无操作系统的STM32单片机开发&#xff0c;功能强大&#xff0c;可申请到地址空间连续的不同大小…

如何应对公民开发者的挑战?低代码流程自动化助你打造高效系统

如今&#xff0c;企业越来越倾向于采用公民开发作为提升流程自动化和数字化转型的手段。这种方法让非程序员&#xff08;如客户和员工&#xff09;&#xff0c;有机会为特定任务创建自己的应用程序。它还使公司能够快速调整以适应客户偏好或业务需求。 尽管这种方法有很多好处&…

Prometheus+Grafana普罗米修斯搭建+监控MySQL

PrometheusGrafana普罗米修斯搭建监控MySQL 一&#xff0c;Prometheus 1.什么是Prometheus&#xff1f; ​ Prometheus 是 Cloud Native Computing Foundation 的一个监控系统项目, 集采集、监控、报警等特点于一体。 ​ Prometheus主要受启发于Google的Brogmon监控系统&…

数字化转型浪潮下,汽车零部件企业如何逐鹿突围?

一、汽车行业当下趋势 数据来源&#xff1a;汽车工业协会 1.乘用车及新能源车市场&#xff1a;2023年1-4月&#xff0c;乘用车销量同比增长6.8%&#xff0c;新能源车销量同比增长35.8%。 2.行业趋势&#xff1a;汽车行业生存压力大&#xff0c;4月中国汽车经销商库存系数下降…

中国科学院稀土研究院-PLC采集项目案例

1.项目背景 中国科学院稀土研究院&#xff08;江西稀土研究院&#xff09;隶属中国科学院。 作为中国国内唯一专注于稀土科技创新的国立科研机构&#xff0c;中国科学院稀土研究院将面向国家战略和产业发展重大需求&#xff0c;围绕稀土绿色、高效、均衡、高值化利用的核心科学…

【Spring MVC】没有Spring MVC,Spring Boot表现得毫无用处? ? ?走进Spring MVC,学习热部署自动运行程序 ! ! !

前言: 大家好,我是良辰丫,从今天开始,我们就要进入Spring MVC的学习了,前面的文章中我们的很多注解都没有讲解,是不是看的脑瓜嗡嗡的,哈哈,没关系,在我们Spring MVC中我们就要详细讲解那些注解了,请跟随良辰的脚步,gogogo! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x…

希望之星、黄昏之星、三只乌鸦……怎么用 DolphinDB 快速计算 K 线?

K 线技术分析是股票投资中很常用的一种分析方法&#xff0c;主要通过历史价格图表中的数据来预测未来市场趋势。一根 K 线包括四个价格&#xff1a;开盘价、收盘价、最高价和最低价&#xff0c;通常简称为 OHLC。K 线按照周期一般可以分为日、周、月、年&#xff0c;以及五分钟…

Selenium自动化落地实践

01、自动化测试流程图 02、主要过程描述 1、自动化测试的切入点 开展自动化测试的时间点很关键&#xff0c;需要在系统已经过多版本的系统测试&#xff0c;达到稳定之后。 2、可行性分析 在进行项目自动化测试之前&#xff0c;第一步就是要确认其可行性&#xff0c;是否可以…

为何唐宋诗词鼎盛,而到了明清变成了小说

我国是一个历史悠久的国家&#xff0c;在漫长的历史长河中&#xff0c;随着朝代的更替&#xff0c;很多事也发生了有趣的变化。 例如唐宋时期盛行的是诗词&#xff0c;而到了明清时代&#xff0c;小说又开始盛行了起来&#xff0c;那么造成这种文风改变的原因是什么呢&#xf…

2023安博会进行时!英码科技1个重磅+4大看点隆重亮相

2023年6月7日&#xff0c;第十六届&#xff08;2023&#xff09;中国国际社会公共安全产品博览会&#xff08;以下简称&#xff1a;安博会&#xff09;在北京首钢会展中心盛大开幕&#xff01;本届安博会以“自主创新数智融合”为主题&#xff0c;共设置了7大主题展馆&#xff…

linux开发:Linux下查看端口占用

前段时间有学生问到&#xff0c;怎么查看已经被占用的端口&#xff1f;下面我就统一给大家解释一下。 提到端口&#xff0c;那首先来回顾端口定义&#xff0c;为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理&#xff0c;使用端口号来区别&#xff1b;我们知道TCP…