1. 程式人生 > >AJAX:基於js和xml來實現非同步請求

AJAX:基於js和xml來實現非同步請求

要談AJAX,就不得不提同步與非同步的概念了

同步互動:使用者傳送一個請求,在收到伺服器的應答之前,不可以做任何操作。並且在收到應答後,會重新整理整個頁面。在網 絡不好的情況下使用者體驗不好。非同步互動:使用者傳送一個請求,在收到伺服器的應答之前,可以向伺服器傳送新的請求。可以使用js接受伺服器的響應,再 利用js區域性重新整理頁面。同步好還是非同步好:     非同步:使用者體驗好,不能適用於所有場景(例如使用支付軟體付款時,必須等到支付成功才能開始新的支付操作)

    同步:使用者體驗不好,適用於所有場景。

AJAX不是一項新的技術,它是由asynchronous(非同步程式碼塊)、javascript and xml組成,它就是基於js和xml來實現非同步請 求。它可以利用js來非同步訪問伺服器。通常伺服器給瀏覽器響應的是一個完整的頁面,而在AJAX中, 由於是利用js接受響應,區域性重新整理頁面,所以伺服器不用給瀏覽器響應整個頁面了,只返回資料就行了。 例如:你進入一個購物網站,出現了許多商品,你點選了一個按鈕“按銷量排序”,這時後臺給伺服器傳送了一個AJAX請求,伺服器接受請求後只返回了商品銷量的資料(這些資料以xml結構或者json鍵值對錶示)而不是整個頁面,然後由javascript把這些商品的資料顯示在了頁面上。由於json表示的資料除了結構清晰外還更緊湊,在js中很受歡迎。

AJAX應用場景

百度的搜尋框、註冊使用者是,校驗使用者名稱是否被註冊過。

AJAX的優缺點:

優點:非同步互動,提高了使用者體驗;伺服器只響應部分資料,而不是整個頁面,所以降低了伺服器應答的壓力(頻寬)。 缺點:不能應用所有場景(支付);會無端的增加訪問伺服器的次數,給伺服器帶來了接收請求的壓力。

javascript實現AJAX的核心物件是XMLHttpRequest,實現步驟(只需四步)

第一步,獲取XMLHttpRequest物件,直接new一個XMLHttpRequest物件, var xmlHttp = new XMLHttpRequest()(適用於IE7+、firefox、Chrome、Safari和Opera),如果還有其他版本的瀏覽器,則會建立各自對應的物件。

第二步,開啟與伺服器的連線 xmlHttp.open(method,url,async); method:請求方式,可以是GET或POST url:所要訪問的伺服器中資源的路徑 如servlet/AServlet async:是否為非同步傳輸,true表示為非同步傳輸,一般都是true

第三步,傳送請求  xmlHttp-.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//設定請求頭,通知伺服器傳送的資料是請求引數 new XMLHttpRequest().send("xxxxx");//注意,如果不給引數,可能會造成部分瀏覽器無法傳送請求 引數:如果是GET請求,可以是null,因為GET提交引數會拼接在url後面 如果是POST請求,傳入的就是請求引數

第四步,註冊監聽 在XMLHttpRequest物件的一個事件上註冊監聽器: onreadystatechange 一共有五個狀態:(xmlHttp.readyState)                 0狀態: 表示剛建立XMLHttpRequest物件, 還未呼叫open()方法                 1狀態: 表示剛呼叫open()方法, 但是還沒有呼叫send()方法傳送請求                  2狀態: 呼叫完了send()方法了, 請求已經開始                 3狀態: 伺服器已經開始響應, 但是不代表響應結束                  4狀態: 伺服器響應結束!(通常我們只關心這個狀態)

//獲取xmlHttp物件的狀態:
var state = xmlHttp.readyState;//可能得到0, 1, 2, 3, 4 
//獲取伺服器響應的狀態碼
var status = xmlHttp.status;
//獲取伺服器響應的內容
var data = xmlHttp.responseText;//得到伺服器響應的文字格式的資料  
//相當於每次狀態改變時,都會呼叫這個function
xmlHttp.onreadystatechange = function(){
    //當伺服器已經處理完請求之後
    if(xmlHttp.readyState == 4){
        //status是應答狀態碼,200說明伺服器響應完成,而且狀態OK
        if( xmlHttp.status == 200 ){
            //獲取響應資料並執行區域性重新整理的邏輯
            var result = xmlHttp.responseText;
            result = xmlHttp.responseXML;
        }
    }
}

jQuery實現AJAX

1.load方法

$(selector).load(url,data,callback);

selector:選擇器(例如span),將從伺服器獲取到的資料載入到指定的元素中

url:傳送請求的url地址

data:可選,想伺服器傳送的資料 key/value資料 如:

{"username":"張三","psw":"123"}

callback:可選,load方法完成後所執行的函式。

示例:

$("#username_msg").load("<%= request.getContextPath() %>/AjaxCheckUsernameServlet", {"username": username});

2.$.get方法

$.get(url, [data], [callback]);

url:傳送請求的URL地址

data:可選, 向伺服器傳送的資料

callback:可選, 請求成功後所執行的函式

示例:

$.get("<%= request.getContextPath() %>/AjaxCheckUsernameServlet", {"username": username}, function(result){
					$("#username_msg").html("<font style='color:red'>"+result+"</font>");
				});

3.$.ajax方法

$.ajax(url, [data], [async], [callback]);

url:傳送請求的URL地址

data:可選, 傳送至伺服器的key/value資料

async:可選, 預設為true, 表示非同步互動

type:可選, 請求方式 , 預設為"GET"。

success:可選, 請求成功後執行的函式, 函式引數:

result:伺服器返回的資料

示例:

$.ajax({
    "url" : "<%= request.getContextPath() %>/AjaxCheckUsernameServlet",
    "data" : {"username": username},
    "async" : true,
    "type" : "POST",
    "success" : function(result){
    $("#username_msg").html("<font style='color:red'>"+result+"</font>")
			    }
});