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