使用原生JS发送ajax异步请求

Ajax

Ajax: Asynchronous javaScript and xml (异步的JavaScript和xml技术)。当我们向服务器发起请求的时候,服务器不会像浏览器响应整个页面,而是只有局部刷新。它是一个异步请求。

请求:
同步请求:只有当一次请求完全结束以后才能够发起另一次请求。
异步请求:不需要其他请求结束就可以向服务器发起请求。

Ajax的优点:
1、ajax是异步请求,浏览器页面只需要进行局部刷新,效率非常的高。

不足的地方:
1、因为ajax是异步请求,所以会导致请求服务器的次数大大增加,增加服务器的负担。
2、因为ajax使用的是JavaScript来接收服务器响应的数据。而JavaScript对浏览器的兼容性不太好。所以有时候对不同的浏览器进行区别对待。但是该问题可以通过jquery来解决。

ajax的入门程序

1. 编写服务端代码:
image.png

Servlet中的内容:

@WebServlet(name = "AjaxDemo1", value = "/AjaxDemo1")
public class AjaxDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 编码问题
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        // 获取请求参数
        String username = request.getParameter("name");

        // 输出请求参数
        System.out.println(username);

        // 响应内容
        response.getWriter().print("ajax入门小程序");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 服务器向客户端响应ajax请求的时候, 可以响应text,html,xml,json数据格式
         */
        doPost(request, response);
    }
}
2. 编写客户端代码

Ajax请求服务器需要依赖一个非常核心的类XMLHttpRequest, 通过该对象向服务端发送异步请求,并且还可以接收服务端相应的数据。
如何创建该对象:

  1. new XMLHttpRequest()针对现在的主流浏览器 和IE7 以上版本的浏览器
  2. new ActiveXObject(Msxml2.XMLHTTP); 针对IE6浏览器。
  3. new ActiveXobject(Microsoft.XMLHTTP); 针对IE5.5之前的版本

如果上面三种方式都无法创建 ajax对象 ,那么你当前浏览器无法使用ajax技术。
创建ajax对象的JS工具函数:
createXMLHttp.js

// ajax的四个步骤
// 创建XMLHttpRequest对象
function createXmlHttp() {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("浏览器太老,不能使用ajax");
            }
        }
    }

    return xmlHttp;
}

具体代码:

<%--
  User: menglanyingfei
  Date: 2018/1/28
  Time: 15:22
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>ajax01</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.js"></script>
    <script type="text/javascript" src="../js/createXMLHttp.js"></script>
</head>
<body>
    <div></div>
    <button>异步请求</button>


</body>
<script type="text/javascript">
    $("button").click(function () {
       // 1. 创建XMLHttpRequest对象
       var xmlHttp = createXmlHttp();
       // 2. 调用open方法获取跟服务器的连接
        /*
            method: 请求方式  get post
            url:请求路径
            async:表示同步请求还是异步请求  true:异步
            */
        xmlHttp.open("GET",
            "${pageContext.request.contextPath}/AjaxDemo1?name=中文", true);

        // 3. 调用send方法, 向服务器发起请求
        // 如果是post请求, 那么需要在send方法中带请求参数
        // 如果是get请求, 那么参数为null
        xmlHttp.send(null);
        // 4. 注册一个监听器
        /*
            不断地去监听请求的过程返回的一个状态码

            在这个时候我们只需要关注readyState == 4的情况,这个时候说明服务器完成了响应
            我们还需要关注另外一个状态码  status是服务器响应过来的, 需要status == 200
         */
        xmlHttp.onreadystatechange = function () {
//            alert(xmlHttp.readyState);
            if (xmlHttp.readyState==4&&xmlHttp.status == 200) {
                //此时说明响应完毕  我们可以通过xml.responseText 来获取服务器的响应内容(文本内容)
                $("div").html(xmlHttp.responseText);
            }
        };
    });
</script>
</html>



校验用户名是否已经存在,采用post提交

以前的做法: 需要提交一个表单。同步请求
现在的做法: ajax请求 异步请求

服务端代码:


image.png
用户名:<input type="text" name="username" /><span></span>
    <script type="text/javascript">
        $("input").focus(function(){
            $("span").text("");
            $(this).val("");
        });
        $("input").blur(function(){
            //获取文本框中值
            var username = $(this).val();
            //创建ajax对象
            var xmlHttp = createXmlHttp();
            //调用open
            xmlHttp.open("POST", "${pageContext.request.contextPath}/AjaxDemo", true);
            //如果是post那么需要设置请求头
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            //调用send方法 将请求参数作为send方法的参数值传递过去,参数格式字符串
            xmlHttp.send("username="+username);
            //注册一个监听器
            xmlHttp.onreadystatechange = function(){
                if (xmlHttp.readyState==4&&xmlHttp.status==200) {
                    var text = xmlHttp.responseText;
                    $("span").text(text).css("color","red");
                }   
            }
        });
</script>

使用post提交的时候需要注意的问题:
1.在send方法中一定要传入请求参数
2.使用post提交要设置请求头 ("context-type", "application/w-xxx-form-urlencoded");

ajax接收服务端相应的xml片段(了解)

编写服务端的代码:


image.png
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 编码问题, 由于向客户端响应的xml, 所有下面的代码改成text/xml
        response.setContentType("text/xml;charset=utf-8");
        // 向客户端响应xml片段, 细心, 这里是id='001'
        String xmlStr = "<students>" +
                            "<student id='001'>" +
                                "<name>小李</name>" +
                                "<sex>男</sex>" +
                            "</student>" +
                        "</students>";

        response.getWriter().print(xmlStr);
    }

客户端代码:

<%--
  User: menglanyingfei
  Date: 2018/1/28
  Time: 15:22
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>ajax01</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.js"></script>
</head>
<body>
    <div></div>

    <button>获取学生信息</button>

</body>
<script type="text/javascript">

    $("button").click(function () {
        var xmlHttp = new XMLHttpRequest();
        //alert(xmlHttp);
        xmlHttp.open("get",
            "${pageContext.request.contextPath}/AjaxDemo2", true);
        xmlHttp.send(null);

        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                // 通过responseXML属性获取服务端响应过来的xml片段
                var xmlDoc = xmlHttp.responseXML;
                //alert(xmlDoc);
                // xmlDoc就是服务端响应的document对象
                var stuEle = xmlDoc.getElementsByTagName("student")[0];
                // 获取该元素的id属性值
                var id = stuEle.getAttribute("id");
                // 获取<name>和<age>中的文本内容
                var nameEle = stuEle.getElementsByTagName("name")[0];
                // 获取文本内容
                var name = nameEle.innerHTML;
                //alert(name);
                var sexEle = stuEle.getElementsByTagName("sex")[0];
                var sex = sexEle.innerHTML;

                $("div").html(id + ":" + name + ":" + sex);
            }
        }
    })
</script>
</html>




注意的问题: 服务器相应xml是 要设置响应头: text/xml

补充的问题:
ajax可以直接向xml文件发送请求。xml文件会整个响应给客户端,通过XMLHttpRequest的responseXML属性接收服务端相应的xml数据。直接将该xml文件转换成dom对象,然后可以通过dom对象的方法来解析该xml文件


image.png

student.xml:

<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student id='001'>
        <name>Java</name>
        <sex>男</sex>
    </student>
</students>

客户端代码:

<%--
  User: menglanyingfei
  Date: 2018/1/28
  Time: 15:22
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>ajax01</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.js"></script>
</head>
<body>
    <div></div>

    <button>获取学生信息</button>

</body>
<script type="text/javascript">

    $("button").click(function () {
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("get", "${pageContext.request.contextPath}/student.xml", true);
        xmlHttp.send(null);
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                // 通过responseXML属性获取服务端响应过来的xml片段
                var xmlDoc = xmlHttp.responseXML;
                // xmlDoc就是服务端响应的document对象
                var stuEle = xmlDoc.getElementsByTagName("student")[0];
                // 获取该元素的id属性值
                var id = stuEle.getAttribute("id");
                // 获取<name>和<age>中的文本内容
                var nameEle = stuEle.getElementsByTagName("name")[0];
                // 获取文本内容
                var name = nameEle.innerHTML;
                var sexEle = stuEle.getElementsByTagName("sex")[0];
                var sex = sexEle.innerHTML;

                $("div").html(id + ":" + name + ":" + sex);
            }
        }
    })
</script>
</html>



完整代码地址

image.png

https://github.com/menglanyingfei/front-end-Learning/tree/master/ajax%26json/ajax-day01

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容