1. 程式人生 > >Ajax基礎(詳講+案例)

Ajax基礎(詳講+案例)

(一)初步認識ajax:中文又稱作“啊甲思”,英語是:asynchronous javascript and xml (翻譯為 js跟xml的非同步),其實底層還是js。其中最大最大最大的特點就是頁面的不重新整理
1. AJAX=HMTL+CSS+JS+DOM+XHR 等多種技術的一個總和
2. 傳統的一個web是一個請求—>等待響應—>請求—->等待響應的過程。這叫做同步
3. 現代Web應用是以請求->請求->請求->響應->響應->響應->…,叫非同步請求/操作

可以列舉幾個ajax使用的例子加深印象:
1. 傳統的登錄檔單時,驗證使用者名稱是否唯一。需要點選註冊之後才會到資料庫驗證。而使用ajax時,可在文字框失去焦點的時候就去資料庫驗證。更符合現在web需求
2. 無重新整理的分頁。
3. 百度搜索框輸入文字時,未提交就有提示的效果。看下面插圖…..等等應用
總結來說:也就是,當你需要區域性請求伺服器而不是全域性請求伺服器的時候,就可以考慮一下ajax


這裡寫圖片描述

(二)ajax的使用
這裡我特別個人推薦是:看手冊學習。截個圖
這裡寫圖片描述
1:建立ajax

//包括IE7以上版本的瀏覽器
var xhr = new XMLHttpRequest();
//IE(6/7/8)方式 ,這裡大小寫不敏感
var xhr = new ActiveXObject(“Microsoft.XMLHTTP”);  //最原始方式
var xhr = new ActiveXObject(“Msxml2.XMLHTTP”);    //升級
var xhr = new ActiveXObject(“Msxml2.XMLHTTP.3.0”);  //升級
var xhr = new ActiveXObject(“Msxml2.XMLHTTP.5
.0”); //升級 var xhr = new ActiveXObject(“Msxml2.XMLHTTP.6.0”); //最高版本方式 //因此個人是這樣建立的 function createXHR(){ var xhr = null; try{ xhr = new ActiveXObject("microsoft.xmlhttp"); }catch(e){ try{ xhr = new XMLHttpRequest(); }catch
(e){ window.alert("你的瀏覽器太差"); } } return xhr; }

2:開發步驟

  1. 建立一個 ajax物件 。方法在上面
  2. 利用open方法準備傳送一個請求。xhr.open(“get/post(請求方式)”,”請求的網址路徑”,false/true同步或者非同步)
  3. 利用send方法確實傳送了這個請求。如果是get請求的話,那麼xhr.send(null),如果是post請求的話,xhr.send(“引數”)
  4. 接受返回的資訊。利用狀態監聽。雖然這裡是第四步驟,但是習慣把這個寫在第二布的位置
    這裡寫圖片描述

(三)直接上案例咯
1:動態返回時間 java程式碼哦

<body>
        <input type="button" value="ajax體驗,請點選我"/>  
    <hr/>
    <div>
        <!-- 顯示結果 -->
    </div>
    <script type="text/javascript">

        var inputElement = document.getElementsByTagName("input")[0];

        inputElement.onclick=function(){

            //建立AJAX引擎物件
            var xhr = createXHR();

            //為AJAX引擎物件設定狀態改變事件[0-4共5個]
            xhr.onreadystatechange = function(){

                //如果請求和響應已經完成
                if(xhr.readyState==4){

                    //響應是否正確
                    if(xhr.status==200){

                        //取得AJAX引擎的響應結果
                        var msg = xhr.responseText;

                        //查詢<div>標籤
                        var divElement = document.getElementsByTagName("div")[0];

                        //將內容寫入<div>標籤內
                        divElement.innerHTML = msg;

                    }

                }
            }
            //準備傳送非同步請求到服務端
            xhr.open("get","/ajax/AjaxServlet");

            //真正傳送非同步請求
            xhr.send(null);


        }
        //根據不同瀏覽器建立AJAX引擎物件
        function createXHR(){
            var xhr = null;
            //如果是IE
            if(window.ActiveXObject){
                xhr = new ActiveXObject("microsoft.xmlhttp");
            //如果非IE
            }else{
                xhr = new XMLHttpRequest();
            }
            return xhr;
        }
    </script>

AjaxServlet
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("AjaxServlet::doGet()");
        String msg = new Date().toLocaleString();
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write(msg);
    }

2://Get方式 + 動態檢查使用者名稱是否合法

Get方式說明:
①在url地址後邊以請求字串(傳遞的get引數資訊)形式傳遞資料。
② 對中文、=、&等特殊符號處理
=、&符號在瀏覽器裡邊會與請求字串的關鍵符號有混淆,避免歧義產生需要對其進行編碼.
在php裡邊可以函式函式 urlencode()/urldecode()對特殊符號進行編碼、反編碼處理
(url_encode()可以把中文轉變為瀏覽器可以識別的資訊。轉變之後的資訊具體為%號後接兩個十六進位制數)
在javascript裡邊可以通過encodeURIComponent ()對特殊符號等資訊進行編碼。

這裡寫圖片描述
特別注意一點是:這裡採用的以字串的形式接受返回的資料,說以msg = xhr.responseText。下面的post就是以xml的方式返回

<body>
    輸入使用者名稱:<input type="text"/>游標移出後,立即查檢結果
    <hr/>
    <div>
        <!-- 顯示結果 -->
    </div>
    <script type="text/javascript">
        document.getElementsByTagName("input")[0].onblur=function(){
            //取得使用者輸入的使用者名稱
            var username = this.value;
            //對中文編碼
            username = encodeURI(username);
            //建立AJAX引警物件
            var xhr = createXHR();
            //設定函式監聽
            xhr.onreadystatechange = function(){
                if(xhr.readyState==4){
                    if(xhr.status==200){
                        var msg = xhr.responseText;
                        var divElement = document.getElementsByTagName("div")[0];
                        divElement.innerHTML = "<img src='"+msg+"'/>";
                    }
                }               
            }
            //準備以GET方式傳送請求
            xhr.open("get","/ajax/GetServlet?time="+new Date().getTime()+"&username="+username);
            //真正傳送請求
            xhr.send(null);     
        }
        function createXHR(){
            var xhr = null;
            try{
                xhr = new ActiveXObject("microsoft.xmlhttp");
            }catch(e){
                try{
                    xhr = new XMLHttpRequest();
                }catch(e){
                    window.alert("你的瀏覽器太差");
                }
            }
            return xhr;
        }
    </script>
  </body>

GetServlet、

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("GetServlet::doGet()");
        String username = request.getParameter("username");
        byte[] buf = username.getBytes("ISO8859-1");
        username = new String(buf,"UTF-8");
        String msg = null;
        if(username.equals("趙君")){
            //msg = "<font color='red'>該使用者已存在</font>";
            msg = "images/MsgError.gif";
        }else{
            //msg = "<font color='green'>可以註冊</font>";
            msg = "images/MsgSent.gif";
        }
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write(msg);
    }


3:Post方式 + 動態檢查使用者名稱是否合法


Post方式說明
① 給伺服器傳遞資料需要呼叫send(請求字串資料)方法
② 呼叫方法setRequestHeader()把傳遞的資料組織為xml格式(模仿form表單給伺服器傳遞資料)
③ 傳遞的中文資訊無需編碼,特殊符號像 &、=等 需要編碼
④ 該方式請求的同時也可以傳遞get引數資訊,同樣使用$_GET接收該資訊
5.對於POST請求,一定要設定請求頭,程式碼如下:
xhr.setRequestHeader(“content-type”,”application/x-www-form-urlencoded”);
在open()之後,在send()之前這裡採用的以xml的形式接受返回的資料

特別注意一點是:,說以msg = xhr.responseXml。上面的get以text方式返回。也就是responseTest。。好好體會一下接下來接收資料的方式不一樣

<body>
    輸入使用者名稱:<input type="text"/>單擊檢查按鈕後,立即查檢結果
    <input type="button" value="檢查"/>
    <hr/>
    <div>
        <!-- 顯示結果 -->
    </div>
    <script type="text/javascript">
        document.getElementsByTagName("input")[1].onclick=function(){
            //取得使用者輸入的使用者名稱
            var username = document.getElementsByTagName("input")[0].value;
            //對中文編碼
            username = encodeURI(username);
            //建立AJAX引警物件
            var xhr = createXHR();
            //設定函式監聽
            xhr.onreadystatechange = function(){
                if(xhr.readyState==4){
                    if(xhr.status==200){
                        //以字串形式接收
                        //var msg = xhr.responseText;

                        //以XML形式接收
                        var xmlDocument = xhr.responseXML;
                        var resElement = xmlDocument.getElementsByTagName("res")[0];
                        var msg = resElement.firstChild.nodeValue;          
                        var divElement = document.getElementsByTagName("div")[0];
                        divElement.innerHTML = "<img src='"+msg+"'/>";
                    }
                }
            }

            //準備以POST方式傳送請求
            xhr.open("post","/ajax/PostServlet?time="+new Date().getTime());

            //設定請求頭,只有是POST方式下,才設定該請求頭
            xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");

            //真正傳送請求
            xhr.send("username="+username);
        }
        function createXHR(){
            var xhr = null;
            try{
                xhr = new ActiveXObject("microsoft.xmlhttp");
            }catch(e){
                try{
                    xhr = new XMLHttpRequest();
                }catch(e){
                    window.alert("你的瀏覽器太差");
                }
            }
            return xhr;
        }
    </script>
  </body>


  PostServlet

  public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("PostServlet::doPost()");
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        System.out.println("使用者名稱:" + username);
        String msg = null;
        if(username.equals("趙君")){
            msg = "images/MsgError.gif";
        }else{
            msg = "images/MsgSent.gif";
        }
        response.setContentType("text/xml;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        pw.write("<root>");
            pw.write("<res>");
                pw.write(msg);
            pw.write("</res>");
        pw.write("</root>");

    }

(四)get方式 + post方式總結

兩者的不同
① 給伺服器傳遞資料量,get最多是2k
post原則沒有限制,php.ini對其限制為8M
② 安全方面,post傳遞資料較安全
③ 傳遞資料的形式不一樣
get方式在url地址後邊以請求字串形式傳遞引數
http://網址/index.php?name=tom&age=23&addr=beijing
藍色部分就是請求字串,就是一些“名-值”對,中間使用&符號連線。
post方式是把form表單的資料給請求出來以xml形式傳遞給伺服器


(五)AJAX的缺點:
a)瀏覽器支援不統一
b)無頁面刷時,所以瀏覽器的”前進”和”後退”按鈕失效
c)一些瀏媒體支援不完善

(由上面兩個例子看出,如果是xml返回格式的話,不僅僅說在response中寫xml麻煩,而且還有在接受資料解析xml也麻煩。後面介紹用json格式返回資料)。下一篇介紹經典的多級選單聯動的原始碼