在Web客戶端使用xmlhttp對象,可以十分方便的和服務(wù)器交換數(shù)據(jù),我們可以獲取和發(fā)送任何類型的數(shù)據(jù),甚至二進制數(shù)據(jù)到服務(wù)器上。xmlhttp技術(shù)同時也是目前大多數(shù)無刷新頁面使用的和服務(wù)器交換數(shù)據(jù)的方式,這種方式比以往的隱藏iframe的方法要方便和經(jīng)濟的多。
同時讓我們高興得是xmlhttp并不是IE特有的東西,雖然目前還不是
W3C的標(biāo)準(zhǔn),不過IE, Netscape/Mozilla, 和Safari都支持。在IE中我們使用new ActiveXObject('MSXML2.XMLHTTP')或者new ActiveXObject("Microsoft.XMLHTTP")來獲得的xmlhttp對象實例,使用前者還是后者和客戶端機器安裝的MSXML版本有關(guān)。在Netscape/Mozilla和Safari中,使用new XMLHttpRequest()來獲得xmlhttp對象實例。比如在IE中,我們通常這樣使用:
var xmlhttp = null;
try
{
xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
}
catch(e)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e2){}
}
使用xmlhttp對象其實是并不是什么困難的事,它一共就6個方法8個屬性。不過它最主要的是提供了兩種執(zhí)行模式:同步模式和異步模式。同步模式可以比較精確的控制程序流程,可是如果服務(wù)器的Response太慢,browser會有死掉失去相應(yīng)的問題;而使用異步模式由于是事件觸發(fā)方式控制流程,會給程序運行帶來一些不可與預(yù)計的問題,因為你不知道客戶端等待服務(wù)器Response的過程中,用戶會在browser里做什么操作
。
下面是一個同步方式獲取服務(wù)器數(shù)據(jù)的簡單示例:
function GetRemoteData(url)
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
try
{
xmlhttp.open('GET', url, false);
if ( xmlhttp.status == 200 )
{
return xmlhttp.responseText;
}
throw '';
}
catch(e)
{
return '';
}
}
XMLHTTP對象的屬性和方法列表(來自IXMLHTTPRequest接口):
| Name | Type | Description | onreadystatechange | N/A | 指定當(dāng)就緒狀態(tài)發(fā)生改變時調(diào)用的事件處理函數(shù),僅用于異步操作 | readyState | Long | 異步操作的狀態(tài):未初始化(0),正在加載(1),已加載(2),交互(3),已完成(4) | responseBody | Variant | 將響應(yīng)信息正文作為unsigned byte數(shù)組返回 | responseStream | Variant | 將響應(yīng)信息正文作為一個ADO Stream對象返回 | responseText | String | 將響應(yīng)信息正文作為一個文本字符串返回 | responseXML | Object | 通過XMLDom將響應(yīng)信息正文解析為XMLDocument對象 | status | Long | 服務(wù)器返回的HTTP狀態(tài)碼 | statusText | String | 服務(wù)器HTTP響應(yīng)行狀態(tài) | |
| Name | Desciption | abort | 取消當(dāng)前 HTTP 請求 | getAllResponseHeaders | 從響應(yīng)信息中檢索所有的標(biāo)頭字段 | getResponseHeader | 從響應(yīng)信息正文中獲得一個 HTTP 標(biāo)頭值 | open(method, url, boolAsync, bstrUser, bstrPassword) | 打開一個與 HTTP 服務(wù)器的連接 | send(varBody) | 設(shè)定一個請求的標(biāo)頭字段 | setRequestHeader(bstrHeader, bstrValue) | 向 HTTP 服務(wù)器發(fā)送請求。可包含正文。 | |
這里面顯然就open方法比較麻煩,帶了一大堆參數(shù),它們的含義分別是:
| Parameter | Description | method | HTTP的通信方式,比如GET, HEAD, POST, PUT, DELETE, CONNECT等 | url | 接收數(shù)據(jù)的服務(wù)器的URL地址,URL可帶QueryString | boolAsync | 一個布爾標(biāo)識,說明請求是否為異步的。如果是異步通信方式,客戶端就不等待服務(wù)器的響應(yīng);如果是同步方式,客戶機會等到服務(wù)器返回消息后才去執(zhí)行其它操作 | bstrUser | 用戶ID,用于服務(wù)器身份驗證 | bstrPassword | 用戶密碼,用于服務(wù)器身份驗證 | |
異步通訊的示例:
xmlhttp.open("GET", "default.aspx", true);
xmlhttp.onreadystatechange = function()
{
if ( xmlhttp.readyState==4 )
{
alert(xmlhttp.responseText);
}
}
xmlhttp.send(null);
其實使用xmlhttp就這么簡單,復(fù)雜的是服務(wù)器端數(shù)據(jù)的組織方式,而且需要開發(fā)人員同時熟悉Client和Server端的開發(fā),才能事半功倍??墒呛孟裾f了半天這個玩意兒和xml沒有什么關(guān)系啊,怎么叫xmlhttp呢?我們注意到response的數(shù)據(jù)類型中有一個responseXML,不過它解析返回的XMLDocument屬于XMLDOM的內(nèi)容了,和使用xmlhttp來和服務(wù)器通訊的關(guān)系并不大,以后再來細說。