Ajax中與服務器的通信【發送請求與處理響應】


一、發送請求

Ajax中通過XMLHttpRequest對象發送異步方式的后台請求時。通常有兩種方式的請求,一種是GET請求,另一種是POST請求。發送請求一般要經過4個步驟分別是:

(1)初始化XMLHttpRequest對象

(2)為XMLHt指定一個返回結果的回調函數,用於返回結果的處理

(3)創建一個與服務器的連接。指定發送的請求是GET還是POST且是否采用異步方式發送請求

(4)向服務器發送請求。

 

 1 <script type="text/javascript">
 2     
 3     function checkBrowerType(){
 4         //第一步:初始化XMLHttpRequest對象
 5         var http_request = false;
 6         if(window.XMLHttpRequest){                  //非IE瀏覽器; 在調用window.ActiveXObject將返回一個對象,或是null(如果返回一個對象則為true,返回null則為false)
 7             http_request = new XMLHttpRequest();    //創建XMLHttpRequest對象
 8             
 9         }else if(window.ActiveXObject){
10             try{
11                 http_request = new ActiveXObject("Msxml2.XMLHTTP");    //創建XMLHttpRequest對象
12             }catch(e){
13                 try{
14                     http_request = new ActiveXObject("Microsoft.XMLHTTP");    //創建XMLHttpRequest對象
15                 }catch(e){
16                     
17                 }
18             }            
19         }
20         if(!http_request){
21             alert("不能創建XMLHttpRequest對象實例");
22             return false;
23         }
24         //第二步:設置回調函數
25         http_request.onreadystatechange = getResult;    //調用返回處理函數
26         /*
27             注意:如果XMLHttpRequest對象的onreadystatechange屬性指定回調函數時,
28             不能指定要傳遞的參數。如果要指定參數可以使用以下方法:
29             http_request.onreadystatechange = function(){
30             getResult(param)
31         };
32         */
33         
34         //第三步:創建一個與服務器的連接,(請求采用GET或POST請求方式,以及是否采用異步方式)
35         http_request.open("GET",url,true);
36         //第四步:向服務器發送請求
37         http_request.send(null);
38     }
39     /*編寫回調函數getResult()*/
40     function getResult(){
41         
42     }
43 </script>
查看代碼

小技巧:在建立與服務器的連接時,指定open(“method”,“url” ,async)中的url參數時,最好將一個時間戳追加到該url參數后面,這樣可以防止因瀏覽器緩存結果而不能實時得到最新的結果。例如:可以這樣指定url參數:String url="deal.jsp?nocache="+new Date().getTime();

 

二、處理服務器的響應

在處理服務器響應時需要通過XMLHttpRequest對象的onreadystatechange屬性指定一個回調函數,用來處理服務器響應。在這個回調函數中,首先需要判斷服務器的請求狀態,保證請求已經完成;然后根據服務器的HTTP狀態碼,判斷服務器對請求響應是否成功,如果成功,則獲取服務器的響應反饋給客戶。

XMLHttpRequest中提供了兩種訪問服務器響應的屬性:一個是responseText屬性,返回字符串響應;另一個是responseXML屬性,返回XML響應。

(1)處理字符串響應

例如:

1 function getResult(){
2     if(http_request.readyState == 4){    //判斷請求狀態
3         if(http_request.status == 200){    //請求成功,開始處理返回結果
4             alert(http_request.responseText);    //顯示判斷結果
5         }else{
6             alert("請求的頁面有錯誤!");
7         }
8     }
9 }

(2)處理XML響應

如果在服務器端需要生成特別負責的響應,則就要應用XML響應。

例:保存圖書信息到XML文檔中,並且使用回調函數將XML中的信息讀取出來。

①XML中的圖書信息,代碼如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <mr>
 3     <books>
 4         <book>
 5             <title>Java Web程序開發</title>
 6             <publisher>人民郵電出版社</publisher>
 7         </book>
 8         <book>
 9             <title>Java從入門到精通</title>
10             <publisher>人民郵電出版社</publisher>
11         </book>
12     </books>
13 </mr>

②在回調函數中遍歷保存圖書信息的XML文檔,並將其顯示到頁面中,代碼如下:

 1 <script type="text/javascript">
 2         function getResult(){
 3             //判斷請求狀態
 4             if(http_request.readyState == 4){    
 5                 //請求成功,開始處理響應
 6                 if(http_request.status == 200){
 7                     var xmldoc = http_request.responseXML;
 8                     var str = "";
 9                     for(int i=0;i<xmldoc.getElementsByTagName("book").length;i++){
10                         var book = xmldoc.getElementsByTagName("book").item(i);
11                         str = str + "《"+book.getElementsByTagName("title")[0].firstChild.data + "》 由“"
12                             +book.getElementByTagName("publisher")[0].firstChild.data + "” 出版<br>";
13                     }
14                     document.getElementById("book").innerHTML = str;    //顯示圖書信息
15                 }else{
16                     alert("請求的頁面有錯誤!");
17                 }    
18                 
19             }
20         }
21 </script>
22 <div id="book"></div>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM