AJAX入门

AJAX介绍

【1】AJAX简介

全称:Asynchronous IavaScript And XML(异步的JavaScript和XML)

AJAX就是通过JavaScript向服务器发送请求,并接收响应,然后我们在通过DOM修改页面。

XML指的是服务器响应的数据的格式。

目前AJAX 已经很少使用XML作为响应的格式。因为XML的解析性能及传输性能较差。AJAX可以响应txt、xml、json格式的数据。

【2】同步和异步

同步:当我们通过浏览器向服务器发送一个请求时,浏览器会刷新整个页面。

异步:当我们向服务器发送请求时,不是刷新整个页面,而是只刷新网页的一部分。

【3】XMLHttpRequest对象

我们AJAX的所有操作都是围绕着XMLHttpRequest对象进行。
在XMLHttpRequest对象中封装发送给服务器请求报文,同时在服务器发回响应时,响应信息也会在对象中封装。
如何获取XMLHttpRequest对象var xhr = new XMLHttpRequest();

【4】使用步骤

第一步:创建XMLHttpRequest对象;

大部分比较新的浏览器都支持的方式(IE7以上)
var xhr = new XMLHttpRequest();
IE6以下的浏览器
var xhr = new ActiveXObject(“Msxml2.XMLHTTP”);
IE5.5以下的浏览器
var xhr = new ActiveXObject(“Microsoft.XMLHTTP”);

通用的获取XMLHttpRequest对象的方法:

//写一个获取XHR的方法
            function getXMLHttpRequest(){
                try{
                    //大部分浏览器都支持的方式
                    return new XMLHttpRequest();
                }catch(e){
                    try{
                        //IE6以下浏览器支持的方式
                        return new ActiveXObject("Msxml2.XMLHTTP");
                    }catch(e){
                        try{
                            //IE5以下的浏览器
                            return new ActiveXObject("Microsoft.XMLHTTP");
                        }catch(e){
                            alert("你是火星来的吧!你的浏览器不支持AJAX!");
                        }

                    }

                }
            }

第二步:设置请求信息(请求地址,请求方式,请求参数)

xhr.open(请求方式,请求地址);
在发送post请求时,还需要设置一个请求头,如下:

xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

第三步:发送请求

xhr.send(请求体);
get请求没有请求体,所以send中可以传null或什么都不传。
post请求需要通过send来设置请求参数。

第四步:接收响应信息

//xhr绑定一个onreadystatechange响应函数,这个函数会在readyState属性发生改变时调用
            xhr.onreadystatechange = function(){
                //判断当前readyState是否为4 , 且响应状态码为200
                if(xhr.readyState==4 && xhr.status==200){
                    //读取响应信息,做相关操作。
                    //如果信息为纯文本
                    var text=xhr.responseText;      
                    //如果信息为XML
                    var xml=xhr.responseXML;
                }
            };

第五步:响应数据的格式
响应的格式有三种:txt、xml、json.


前端请求处理与后端请求处理

前端请求处理:就是在第二步设置请求信息时,请求地址为一个xml格式的文件或json格式的文件地址。
后端请求处理:设置请求信息时,请求地址为一个servlet的地址,在后台处理数据。

前端请求示例:
这里写图片描述
后端请求示例:

<title>省市联动效果</title>
<script type="text/javascript">
/**
 * 1.在文档加载完毕时发送请求,得到所有省份名称显示在province中
 2.在选择了新的省份时,发送请求,得到XML文档
 3.解析xml文档,得到其中所有的<city>,在得到每个<city>元素的内容,即市名,使用市名生成<option>,插入到<select>中
 */
 function createXmlHttpRequest(){
        try{
            return new XMLHttpRequest();//大多数浏览器
        }catch(e){
             try{
                return ActvieXObject("Msxml2.XmlHTTP");//IE6.0      
            }catch(e){
                return ActvieXObject("Microsoft.XMLHTTP");//IE5.0
            } 
        }
    }
 window.onload=function(){
     /**
     ajax四步,请求ProvinceServlet,得到所有省份名称
     使用每个省份名称创建一个<option>元素,添加到<select name=province>中
     */
     var xmlHttp=createXmlHttpRequest();
     xmlHttp.open("GET","/shengshiliandong/ProvinceServlet",true);
    //3.发送请求
        xmlHttp.send(null);//get没有请求体,但也要给出null,不然Firefox可能会不能发送
        //4.给异步对象的onreadystatechange事件注册监听器
        xmlHttp.onreadystatechange=function(){
            //双重判断:服务器响应结束和响应成功
            if(xmlHttp.readyState==4 && xmlHttp.status==200){
                //获取服务器的响应结束
                var text=xmlHttp.responseText;
                //使用,分割他,得到数组
                var arr=text.split(",");
                //循环遍历每个省份名称,
                for( var i=0;i<arr.length;i++){
                    var op=document.createElement("option");//创建一个指定名称元素
                    op.value=arr[i];
                    var textNode=document.createTextNode(arr[i]);//创建文本节点
                    op.appendChild(textNode);//把文本子节点添加到op元素中,指定其显示值
                    document.getElementById("p").appendChild(op);
                }
            }
        }
 }
</script>
</head>
<body>
<h2 align="center">演示省市联动</h2>
<select name="province" id="p">
    <option>===请选择省===</option>
</select>

<select name="city">
    <option>===请选择市===</option>
</select>
</body>

后端处理代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        /**
         * 响应所有省的名称
         */
        //1.Document对象
        //创建解析器对象
        //调用解析器的读方法,传递一个流对象,得到Document
        try {
            SAXReader reader=new SAXReader();
            InputStream input=this.getClass().getResourceAsStream("/china.xml");            
            Document doc=reader.read(input);
            /**
             * 查询所有province的name属性,得到一堆的属性对象
             * 循环遍历,把所有的属性连接成一个字符串,发送给客户端
             */
            List<Attribute> arrList = doc.selectNodes("//province/@name");
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<arrList.size();i++){
                sb.append(arrList.get(i).getValue());//把每个属性的值存放到sb中
                if(i<arrList.size()-1){
                    sb.append(",");
                }
            }
            response.getWriter().print(sb);
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

通过jQuery实现AJAX

[1] post()方法
$.post(url, [data], [callback], [type])

参数:
url:发送AJAX的请求地址,字符串。
data:发送给服务器的请求参数,JSON格式。
callback:当前需要获取服务器发送的响应时,我们可以通过该回调函数。
jQuery会将响应信息以回调函数的参数的形式返回
type:响应信息的类型,字符串。一般两个常用值text、json

[2] get()方法
- get方法和post方法使用方式基本一致。

[3] getJSON()方法
getJSON(url, [data], [callback])
getJSON方法和get方法类似,只不过该方法默认的响应类型为JSON,不需要再手动指定。
注意:

使用get和getJSON都会有缓存问题,并且使用get方法不能传送较多的数据。
post方法不会有缓存的问题,所以我们开发时使用post方法较多。
不要忘记导jquery文件。

示例代码:

<script src="/AJAXTest/js/jquery.min.js"></script>
<script>
    $(function(){
        $("#btn1").click(function(){
            var url="${pageContext.request.contextPath}/AServlet";
            var json={"username":"zhangsan","age":20};
            function callback(data){
                /* var div1=document.getElementById("div1");
                div1.innerHTML+=data;  */
                /* $("#div1").html(data); */
                 var a=data.split(",");
                $("#username").val(a[0]);
                $("#password").val(a[1]);
            }
            $.get(url,json,callback);
        });
    });
</script>
原文地址:https://www.cnblogs.com/mazhitao/p/7435482.html