在Web客戶端使用xmlhttp對象,可以十分方便的和服務(wù)器交換數(shù)據(jù),我們可以獲取和發(fā)送任何類型的數(shù)據(jù),甚至二進制數(shù)據(jù)到服務(wù)器上。xmlhttp技術(shù)同時也是目前大多數(shù)無刷新頁面使用的和服務(wù)器交換數(shù)據(jù)的方式,這種方式比以往的隱藏iframe的方法要方便和經(jīng)濟的多。
??? 同時讓我們高興得是xmlhttp并不是IE特有的東西,雖然目前還不是
W3C的標準,不過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 | 指定當就緒狀態(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 | 取消當前 HTTP 請求 | getAllResponseHeaders | 從響應(yīng)信息中檢索所有的標頭字段 | getResponseHeader | 從響應(yīng)信息正文中獲得一個 HTTP 標頭值 | open(method, url, boolAsync, bstrUser, bstrPassword) | 打開一個與 HTTP 服務(wù)器的連接 | send(varBody) | 設(shè)定一個請求的標頭字段 | 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 | 一個布爾標識,說明請求是否為異步的。如果是異步通信方式,客戶端就不等待服務(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就這么簡單,復雜的是服務(wù)器端數(shù)據(jù)的組織方式,而且需要開發(fā)人員同時熟悉Client和Server端的開發(fā),才能事半功倍。可是好像說了半天這個玩意兒和xml沒有什么關(guān)系啊,怎么叫xmlhttp呢?我們注意到response的數(shù)據(jù)類型中有一個responseXML,不過它解析返回的XMLDocument屬于XMLDOM的內(nèi)容了,和使用xmlhttp來和服務(wù)器通訊的關(guān)系并不大,以后再來細說。