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

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();


    }
}

运行结果

 

本人从事软件项目开发20多年,2005年开始从事Java工程师系列课程的教学工作,录制50多门精品视频课程,包含java基础,jspweb开发,SSH,SSM,SpringBoot,SpringCloud,人工智能,在线支付等众多商业项目,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂

讲师课堂链接:https://edu.csdn.net/lecturer/893

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本系列的作者是一位 Ajax 专家,他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 —— 使高效的 Web 开发成为现实。他还揭开了 Ajax 核心概念的神秘面纱,包括 XMLHttpRequest 对象。 五年前,如果不知道 XML,您就是一只无人重视的丑小鸭。十八个月前,Ruby 成了关注的中心,不知道 Ruby 的程序员只能坐冷板凳了。今天,如果想跟上最新的技术时尚,那您的目标就是 Ajax。 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何新信息都能在这里找到。 但是,Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,而且不像学习一种全新的语言那样困难。 目录 第 1 部分: Ajax 简介 3 1.1 老技术,新技巧 4 1.2 XMLHttpRequest 对象 4 1.3 获取 Request 对象 6 1.4 Ajax 世界中的请求/响应 8 1.5 连接 Web 表单 10 第 2 部分: 使用 JavaScriptAjax 发出异步请求 11 1.1 XMLHttpRequest 简介 12 1.2 用 XMLHttpRequest 发送请求 18 1.3 处理服务器响应 22 第 3 部分: Ajax 中的高级请求和响应 28 1.1 深入了解 HTTP 就绪状态 29 1.2 显微镜下的响应数据 33 1.3 深入了解 HTTP 状态代码 36 1.4 其他请求类型 40 第 4 部分: 利用 DOM 进行 Web 响应 44 1.1 Web 程序员和标记 44 1.2 进一步了解 Web 浏览器 46 1.3 对象的值 49 1.4 DOM 简介 52 第 5 部分: 操纵 DOM 55 1.1 跨浏览器、跨语言 55 1.2 节点的概念 56 1.3 节点的属性 56 1.4 节点方法 58 1.5 API 设计问题 63 1.6 通用节点类型 63 1.7 文档节点 64 1.8 元素节点 64 1.9 属性节点 66 1.10 文本节点 67 1.11 什么节点类型? 67 第 6 部分: 建立基于 DOM 的 Web 应用程序 69 1.1 从一个示例应用程序开始 70 1.2 修改图片,麻烦的办法 74 1.3 替换图片,简单的办法 78 1.4 替换图片,(真正)简单的办法 80 1.5 事件处理程序 83 第 7 部分: 在请求和响应中使用 XML 85 1.6 XML:到底用没用? 85 1.7 使用 XML(真正) 86 1.8 从客户机到服务器的 XML 87 1.9 发送 XML:好还是不好? 91 第 8 部分:在请求和响应中使用 XML 92 1.1 服务器(有时)不能响应太多的请求 92 1.2 从服务器接收 XML 94 1.3 解释 XML 的其他可选方法 99 第 9 部分: 使用 Google Ajax Search API 100 1.1 使用公共 API 101 1.2 使用 Google Ajax Search API 的准备工作 101 1.3 Google 的 API 文档 104 1.4 最简单的 Google 搜索 Web 应用程序 104 1.5 Ajax 在哪里? 109 1.6 深度探索 Google 的 Ajax Search API 111 第 10 部分: 使用 JSON 进行数据传输 111 1.1 选择的意义 112 1.2 JSON 基础 113 1.3 在 JavaScript 中使用 JSON 114 第 11 部分: 借鉴最优秀的 Ajax 应用程序 117 1.1 Google 地图 117 1.2 TaDaList 119 1.3 Campfire 122 1.4 YourMinis 123 1.5 其他 Web 2.0 站点 126 第 11 部分:将 Ajax 带入 Eclipse 的 Ajax Toolkit Framework 的两个工具 127 1.1 Eclipse ATF 127 1.2 Dojo 128 1.3 Zimbra Ajax Toolkit 130 1.4 initiative 在前进 132 第 12 部分:面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 133 1.5 更好的购物车 133 1.6 Ajax 往返过程 134 1.7 分派 XMLHttpRequest 135 1.8 servlet 请求处理 137 1.9 用 JavaScript 进行响应处理 139 1.10 使用 Ajax 的挑战 141 第 13 部分:面向 Java 开发人员的 Ajax: Ajax 的 Java 对象序列化 143 1.11 从 Java 类产生 XML 144 1.12 自行进行序列化 144 1.13 XML 绑定框架 146 1.14 页面模板系统 148 1.15 不用 XML 的响应数据 149 1.16 JavaScript 对象标注 150 1.17 比较序列化技术 153 第 14部分:面向 Java 开发人员的 Ajax 结合 Direct Web Remoting 使用 Ajax 154 1.1 DWR 是什么? 155 1.2 关于示例 155 1.3 实现目录 156 1.4 测试部署 157 1.5 调用远程对象 158 1.6 实现购物车 160 1.7 调用远程的 Cart 方法 163 1.8 DWR 的利弊 165 第 15部分:面向 Java 开发人员的 Ajax: 探索 Google Web Toolkit 166 1.1 从简单的开始 167 1.2 构建 Weather Reporter 应用程序 168 1.3 用 GWT Shell 进行客户端调试 174 1.4 与服务器端组件进行通信 175 1.5 从客户机调用服务 178 1.6 服务器端验证的需要 179 1.7 用 JSNI 调用本机 JavaScript 181 1.8 为什么使用 GWT? 183

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSDN专家-赖老师(软件之家)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值