zoukankan      html  css  js  c++  java
  • JavaScript笔记——使用AJax

    在使用过JQuery之后,再来看JavaScript的Ajax实现就会觉得很麻烦,不过,最近使用到了,就记录一下吧

    在JavaScript中Ajax的实现可以分为四步:

    第一步 得到XMLHttpRequest对象

    得到XMLHttpRequest

    • 大多数浏览器都支持:var xmlHttp = new XMLHttpRequest();
    • IE6.0:var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    • IE5.5以更早版本的IE:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

     编写创建XMLHttpRequest对象的函数

    function createXMLHttpRequest() {
            try {
                return new XMLHttpRequest();
            } catch (e) {
                try {
                    return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
                } catch (e) {
                    try {
                        return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本    
                    } catch (e) {
                        alert("浏览器不支持");
                        throw e;
                    }
                }
            }
        };

    第二步 打开与服务器的链接

    xmlHttp.open():用来打开与服务器的连接,它需要三个参数:

    • 请求方式:可以是GET或POST
    • 请求的URL:指定服务器端资源,例如一个Servlet
    • 请求是否为异步:如果为true表示发送异步请求,否则同步请求
     xmlHttp.open("GET", "/AServlet", true);

    第三步 发送请求(分为GET和POST方式)

    xmlHttp.send(null):如果不给可能会造成部份浏览器无法发送,参数:就是请求体内容!如果是GET请求,必须给出null

    第四步 给XMLHttpRequest对象的onreadystatechange事件注册监听器,以监听服务器响应

    在xmlHttp对象的一个事件上注册监听器:onreadystatechange
    xmlHttp对象一共有5个状态:

    • 0状态:刚创建,还没有调用open()方法;
    • 1状态:请求开始:调用了open()方法,但还没有调用send()方法
    • 2状态:调用完了send()方法了;
    • 3状态:服务器已经开始响应,但不表示响应结束了!
    • 4状态:服务器响应结束!(通常我们只关心这个状态!!!)

    得到xmlHttp对象的状态:
    var state = xmlHttp.readyState;//可能是0、1、2、3、4
    得到服务器响应的状态码
    var status = xmlHttp.status;//例如为200、404、500
    得到服务器响应的内容

    • var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
    • var content = xmlHttp.responseXML;//得到服务器的响应的xml响应的内容,它是Document对象了
      xmlHttp.onreadystatechange = function() {//xmlHttp的5种状态都会调用本方法
          if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断:判断是否为4状态,而且还要判断是否为200
              // 获取服务器的响应内容
          var text = xmlHttp.responseText;
          }
      };

    示例代码

    准备工作:在页面(jsp)中写两句HTML,一个按钮,一个段落

        <input type="button" value="点击" id="btn"/>
        <h1 id="h1"></h1>

    先来看看GET方式的Ajax:

    <script type="text/javascript">
        function createXMLHttpRequest() {
            try {
                return new XMLHttpRequest();
            } catch (e) {
                try {
                    return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
                } catch (e) {
                    try {
                        return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本    
                    } catch (e) {
                        alert("浏览器不支持");
                        throw e;
                    }
                }
            }
        };
        window.onload = function() {
            var btn=document.getElementById("btn");
            btn.onclick=function(){    
                //第一步:得到XMLHttpRequest对象
                var xmlHttp = createXMLHttpRequest();
                //第二步:打开与服务器的连接
                xmlHttp.open("GET", "${pageContext.request.contextPath}/AServlet",true);
                //第三步:发送请求(GET方式必须指定null)
                xmlHttp.send(null);
                //第四步:给异步对象的onreadystatechange事件注册监听器
                xmlHttp.onreadystatechange = function() {
                    //双重判断:状态4 响应码200
                    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                        //获得服务器的响应
                        var text = xmlHttp.responseText;
                        //处理h1元素
                        var h1 = document.getElementById("h1");
                        h1.innerHTML = text;
                    }
                };
            };
        };
    </script>

    获得XMLHttpRequest对象方式会有浏览器差异,所以createXMLHttpRequest()方法处理一下,在这里我使用的是Servlet

    AServlet如下:

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class AServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Hello Ajax");
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().print("Hello Ajax");
        }
        
        public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            System.out.println("POST(:)Hello Ajax");
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().print("POST(:)Hello Ajax"+req.getParameter("userName"));
        }
    }

    Servlet完成的工作还算简单,值得说的是必须给response指定请求头 setContentType()

    POST方式的Ajax提交方式:

    <script type="text/javascript">
        function createXMLHttpRequest() {
            try {
                return new XMLHttpRequest();
            } catch (e) {
                try {
                    return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
                } catch (e) {
                    try {
                        return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本    
                    } catch (e) {
                        alert("浏览器不支持");
                        throw e;
                    }
                }
            }
        };
        window.onload = function() {
            var btn=document.getElementById("btn");
            btn.onclick=function(){    
                //第一步:得到XMLHttpRequest对象
                var xmlHttp = createXMLHttpRequest();
                //第二步:打开与服务器的连接
                xmlHttp.open("POST", "${pageContext.request.contextPath}/AServlet",true);
                //POST方式需要处理请求头
                xmlHttp.setRequestHeader("content-type","application/x-www-form-urlencoded");
                //第三步:发送请求
                xmlHttp.send("userName=lz");
                //第四步:给异步对象的onreadystatechange事件注册监听器
                xmlHttp.onreadystatechange = function() {
                    //双重判断:状态4 响应码200
                    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                        //获得服务器的响应
                        var text = xmlHttp.responseText;
                        //处理h1元素
                        var h1 = document.getElementById("h1");
                        h1.innerHTML = text;
                    }
                };
            };
        };
    </script>

    与GET方式不同的之处在于POST需要处理请求头,使用send()方法时需要给出需要的参数,就是这两点不同吧

    封装Ajax

    因为JavaScript的Ajax处理较为麻烦且固定,在这里完成一个简单封装,类似于JQuery中的$.ajax()方法的实现

    ajaxUtils.js :

    //处理浏览器差异,获得XMLHttpRequest
    function createXMLHttpRequest(){
        try{
            return new XMLHttpRequest();     //大多数浏览器
        }catch (e) {
            try {
                return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
            } catch (e) {
                try {
                    return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本    
                } catch (e) {
                    alert("浏览器不支持");
                    throw e;
                }
            }
        }
    }
    
    /*
     * option对象有如下属性
     */
             /*请求方式method,*/ 
            /*请求的url url,*/  
            /*是否异步 asyn,*/ 
            /*请求体 params, */
            /*回调方法 callback,*/
            /*服务器响应数据转换成什么类型 type*/
            /*url和callback没有默认值,必须指定*/
    function ajax(option){
        /**
         * 1.得到XMLHttpRequest
         */
         var xmlHttp=createXMLHttpRequest();
         /**
          * 2.打开连接
          */
          if(!option.method){   //默认为GET请求
              option.method="GET";
          }
          if(option.asyn==undefined){  //默认为异步
              option.asyn=true;
          }
          xmlHttp.open(option.method, option.url, option.asyn);
          /**
           * 3.判断是否为POST
           */
           if("POST" == option.method) {
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        }
        /**
         * 4.发送请求
         */
         xmlHttp.send(option.params);
         /**
          * 5.注册监听
          */
          xmlHttp.onreadystatechange=function(){
              if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断
                var data;
                // 获取服务器的响应数据,进行转换!
                if(!option.type) {//如果type没有赋值,那么默认为文本
                    data = xmlHttp.responseText;
                } else if(option.type == "xml") {
                    data = xmlHttp.responseXML;
                } else if(option.type == "text") {
                    data = xmlHttp.responseText;
                } else if(option.type == "json") {
                    var text = xmlHttp.responseText;
                    data = eval("(" + text + ")");
                }
                
                // 调用回调方法
                option.callback(data);
            }
          };
    };

    我们直接在页面中使用ajax()方法即可,注意 url和callback没有默认值,必须指定

    页面中使用:

    <script type="text/javascript" src="${pageContext.request.contextPath}/js/ajaxUtils.js"></script>
    <script type="text/javascript">
      window.onload=function(){
          var btn=document.getElementById("btn");
          btn.onclick=function(){
              ajax({
                  url:"${pageContext.request.contextPath}/AServlet",
                  callback:function(data){
                      document.getElementById("h1").innerHTML=data;
                  }
              });
          };
      };
    </script>

    data就是服务器返回的数据

  • 相关阅读:
    喵哈哈村的魔法考试 Round #19 (Div.2) B 快速加
    hdu5676 ztr loves lucky numbers DFS
    hdu 5950 Recursive sequence 矩阵快速幂
    AI大语音(三)—傅里叶变换家族
    AI大语音(二)——语音预处理
    AI大语音(一)——语音识别基础
    第二章:声学模型之EM算法
    量子力学2
    量子力学1
    C#学习系列(一)——C#和C++的区别
  • 原文地址:https://www.cnblogs.com/lz2017/p/7107536.html
Copyright © 2011-2022 走看看