Ajax学习(二)

Ajax技术的核心是XMLHttpRequest对象(简称XHR),可以通过使用XHR对象获取到服务器的数据,然后再通过DOM将数据插入到页面中呈现。虽然名字中包含XML,但Ajax通讯与数据格式无关,所以我们的数据格式可以是XML或JSON等格式。

XMLHttpRequest对象用于在后台与服务器交换数据,具体作用如下:

在不重新加载页面的情况下更新网页
在页面已加载后从服务器请求数据
在页面已加载后从服务器接收数据
在后台向服务器发送数据

XMLHttpRequest是一个JavaScript对象,它是由微软设计,并且被Mozilla、Apple和Google采纳,W3C正在标准化它。它提供了一种简单的方法来检索URL中的数据。

我们要创建一个XMLHttpRequest实例,只需new一个就OK了
对于IE6不支持原始的XHR对象,则我们要写一个兼容性版本:


        if (window.XMLHttpRequest) {

            xhr = new XMLHttpRequest();

        } else {

            try {

                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {

                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }

在创建XHR对象后,接着我们要调用一个初始化方法open(),它接受五个参数具体定义如下:

void open(
   DOMString method, //"GET", "POST", "PUT", "DELETE"
   DOMString url,
   optional boolean async,
   optional DOMString user,
   optional DOMString password
);

通过上面的定义我们知道open()方法的签名包含五个参数,其中有参数method和url地址是必填的,假设我们针对var url = “checkUnameJson”发送POST请求获取数据,具体定义如下:

var method = "POST";
        var url = "checkUnameJson";
        // 相当于输入连接   1
        xhr.open(method, url,true);

参数1有get和post两个取值

参数2表示什么就不用说了

重点说下第3个参数:boolean的取值

当该boolean值为true时,服务器请求是异步进行的,也就是脚本执行send()方法后不等待

服务器的执行结果,而是继续执行脚本代码;

当该boolean值为false时,服务器请求是同步进行的,也就是脚本执行send()方法后等待

服务器的执行结果的返回,若在等待过程中超时,则不再等待,继续执行后面的脚本代码
对于POST请求来说以下代码必须写上:

xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded")

通过上述代码会启动一个针对myxhrtest.aspx的GET请求,这里有两点要注意:一是URL相对于执行代码的当前页面(使用绝对路径);二是调用open()方法并不会真正发送请求,而只是启动一个请求准备发送。要真正发送请求要使用send()方法,send()方法接受一个参数,即要作为请求主体发送的数据,如果不需要通过请求主体发送数据,我们必须传递一个null值。在调用send()之后,请求就会被分派到服务器,完整Ajax请求代码如下:

    var method = "POST";
        var url = "checkUnameJson";
        // 相当于输入连接   1
        xhr.open(method, url,true);

        xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded")
        //发送  回车    2
        xhr.send("uname=" + document.getElementById("name").value);

在发送请求之后,我们需要检查请求是否执行成功,首先可以通过status属性判断,一般来说,可以将HTTP状态代码为200作为成功标志。这时,响应主体内容会保存到responseText中。此外,状态代码为304表示请求的资源并没有被修改,可以直接使用浏览器缓存的数据,Ajax的同步请求代码如下:

    if (xhr.addEventListener) {
            xhr.addEventListener("readystatechange", function() {


                if (xhr.readyState == 4) {
                    //当返回状态 200时 读取内容
                    if (xhr.status == 200) {
                        document.getElementById("divtext").innerHTML = xhr.responseText;
                    }
                }
            });
        } else {


            xhr.onreadystatechange = function() {


                if (xhr.readyState == 4) {
                    //当返回状态 200时 读取内容
                    if (xhr.status == 200) {
                        document.getElementById("divtext").innerHTML = xhr.responseText;
                    }
                }
            }
        }

        var method = "GET";
        var url = "hello.txt";
        // 相当于输入连接   1
        xhr.open(method, url);

        //发送  回车    2
        xhr.send();

如果我们发送异步请求,那么在请求过程中javascript代码会继续执行,这时可以通过readyState属性判断请求的状态,当readyState = 4时,表示收到全部响应数据,属性值的定义如下:
这里写图片描述

现在我们对Ajax的请求实现有了初步的了解,接下来我们将通过具体的例子说明Ajax请求的应用场合和局限。

在日常网络生活中,我们在注册页面进行注册时,有时输入用户名当鼠标离开输入框时,页面会立即显示该用户名是否可以,这些就是使用了ajax实现的,现在让我们模拟以下它的实现过程
首先写个注册页面

<form action="" >
    姓名:<input type="text" name="uname" id="name" onblur="checkName()">
    <span id="sp"></span>
    <br>
    密码:<input type="password" name="pwd"><br>
    <input type="submit" value="注册">

    </form>

完整的ajax请求:

<script type="text/javascript">
    var xhr;
    function checkName() {

        if (window.XMLHttpRequest) {

            xhr = new XMLHttpRequest();

        } else {

            try {

                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {

                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }

        if (xhr.addEventListener) {
            xhr.addEventListener("readystatechange", common);
        } else {

            xhr.onreadystatechange = common;
        }

        var method = "POST";
        var url = "checkUnameJson";
        // 相当于输入连接   1
        xhr.open(method, url,true);

        xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded")
        //发送  回车    2
        xhr.send("uname=" + document.getElementById("name").value);

        function common() {

            if (xhr.readyState == 4) {
                //当返回状态 200时 读取内容
                if (xhr.status == 200) {
        //返回值是json格式的字符串 以下代码是把json格式的字符串转成json
                    var strJson = xhr.responseText;
                    var jsonObj = JSON.parse(strJson);
                    //  alert(jsonObj)
                    console.log(strJson);
                    if (jsonObj.result) {
                        document.getElementById("sp").innerHTML = "不可用";
                    } else {
                        document.getElementById("sp").innerHTML = "可用";
                    }

                }
            }

        }

    }
</script>

为求方便 我们在servlet中采用list模拟数据库中的用户表:

@WebServlet("/ajax/checkUnameJson")
public class CheckNameJsonServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private List<String> names = new ArrayList<>();

    public CheckNameJsonServlet() {
        super();
        names.add("z3");
        names.add("l4");
        names.add("lgh");

    }


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

        request.setCharacterEncoding("utf-8");

        //设置浏览器使用什么编码去解码 
        response.setContentType("application/json;charset=utf-8");
        //告诉tomcat响应体以utf-8编码 如果设置了上面的响应头 则不再起作用
        //response.setCharacterEncoding("utf-8");
        String name = request.getParameter("uname");

        boolean flag = names.contains(name);

        if(flag){
            response.getWriter().write("{\"result\":true}");
        }else{
            response.getWriter().write("{\"result\":false}");

        }
    }


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

        doGet(request, response);
    }

}

运行
这里写图片描述
输入字符“lgh”结果:
这里写图片描述
输入字符“hello”结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值