找到一篇對于xmlhttp的文章
發(fā)表時間:2023-08-07 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]XMLHTTP: 網(wǎng)站超級粘合劑 簡介許多ASP開發(fā)者都希望在自己的網(wǎng)站中能夠使用到微軟提供的支持XML的新功能。其中,有些人發(fā)現(xiàn)可以使用XML來裝飾網(wǎng)站,但是,如果僅僅是只使用XMLDOM的話,...
XMLHTTP: 網(wǎng)站超級粘合劑
簡介
許多ASP開發(fā)者都希望在自己的網(wǎng)站中能夠使用到微軟提供的支持XML
的新功能。其中,有些人發(fā)現(xiàn)可以使用XML來裝飾網(wǎng)站,但是,如果僅僅
是只使用XMLDOM的話,你就會失去其他一些更重要的東西。畢竟,XML是用來
作為一種網(wǎng)上數(shù)據(jù)表現(xiàn)和數(shù)據(jù)交換的形象出現(xiàn)的。盡管使用XML可以非常滿意
地描繪你的數(shù)據(jù),但是開發(fā)者卻不得不使用CGI來進(jìn)行瀏覽器和服務(wù)器之間的
數(shù)據(jù)交換,除非你在瀏覽器端和客戶端都使用XML文檔。
當(dāng)然CGI從傳達(dá)信息的角度來說是能夠完全勝任的,但是如果要是和XML來
一起使用的話就讓XML失去了很多自己的用處。幸運(yùn)的是,微軟提供了一種更加
有效的方法來傳輸XML,雖然該方法在很大程度上并不被人所重視。
在微軟提供的MSXML解釋器包中有一系列的對象,也許沒有人會重視其中的
XMLHTTPConnection對象。簡而言之,它允許你打開一個到服務(wù)器上的HTTP連接,
發(fā)送一些數(shù)據(jù)和取回一些數(shù)據(jù)。并且所有的這一切都是在很少的幾段腳本中就能夠?qū)崿F(xiàn)。
使用XMLHTTP對象通常是進(jìn)行XML數(shù)據(jù)交換,但其他格式的數(shù)據(jù)也是允許的。
在商業(yè)程序中的運(yùn)用
這種交換類型的標(biāo)準(zhǔn)模式是客戶端發(fā)送一個XML格式的文本字符串到服務(wù)端,
然后服務(wù)端將這個字符串裝載入一個XMLDOM對象中并且解釋它,然后返回一段
HTML給客戶端,或則是另外一段XML代碼給客戶端讓客戶端的瀏覽器自己解釋。
在這種方式下,對于信息的傳遞來說是非常有效的形式,尤其是當(dāng)你使用
DHTML允許你根據(jù)返回信息動態(tài)顯示時。
舉例如下(只能夠運(yùn)行在客戶端和服務(wù)端都安裝有IE5的情況下)
<%
if (Request.ServerVariables("REQUEST_METHOD") == "POST" )
{
var req= Server.CreateObject("Microsoft.XMLDOM");
req.async=false;
req.load(Request);
if (req.documentElement.nodeName=="timesheet")
{
//對數(shù)據(jù)隨便進(jìn)行一些處理。。。
.....
Response.write("<h1>Timesheet Updated!</h1><b>"+req.documentElement.text+"</b>");
}
}
else
{%>
<div id="divDisplay">The response will be put in here</div>
<input type="button" onclick="sendData();" value="Send it!">
<script>
function sendData(){
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.Open("POST", "http://www.yoursite.com/thispage.asp", false);
xmlhttp.Send("<timesheet>An impossibly useless timesheet fragment</timesheet>");
divDisplay.innerHTML=xmlhttp.responseText;
}
</script>
<% } %>
在上面的代碼中,其中客戶端的腳本將建立一個適當(dāng)?shù)腃OM對象,打開一個在網(wǎng)站
www.yoursite.com的連接(使用了HTTP的POST方法,同步方式),使用Send方法發(fā)送
一個XML片段,然后根據(jù)服務(wù)器上的響應(yīng)填充divDisplay區(qū)域(這里使用了DHTML)。
具體的執(zhí)行過程是,在服務(wù)器上,Request對象被轉(zhuǎn)載入一個XML文檔然后被解釋器解釋。
服務(wù)器響應(yīng)XMLHTTP連接的方式和響應(yīng)其他任何方式的HTTP連接是一樣的,也是使用了
Response對象。注意的是XMLHTTP本身并不檢查request或則response的有效性,也就是說
Request或則Response中的數(shù)據(jù)可是并不需要一定是XML文檔。
“聰明,”你也許會說!暗菫槭裁次覀儾皇褂肅GI來代替它呢?”呵呵,我們要注意
這樣一件事,就是如果使用這種方式進(jìn)行客戶端--服務(wù)端的交互時整個頁面并沒有被刷新。
我們都知道,如果要是通過CGI來做任何事情都必將導(dǎo)致瀏覽器接收一個完整的新頁面,而
這尤其影響網(wǎng)站上的訪問者,因?yàn)樗麄儾坏貌话阉械臅r間都用來等候整個頁面下載完畢。
同樣,CGI對于網(wǎng)站服務(wù)器來說也是一個負(fù)擔(dān),因?yàn)樗坏貌话褜氋F的處理器循環(huán)周期和帶寬
消耗在新頁面的所有部分。如果這樣的操作只是一次或則兩次倒無所謂,但是如果是對任何
一個電子商務(wù)網(wǎng)站或則一個基于Web的電子郵件系統(tǒng),這將意味著大量的同樣的基本頁面信息
被重復(fù)一次又一次的裝載。
同樣,如果是通過CGI在網(wǎng)站運(yùn)用程序中使用XML,服務(wù)端一般都將不得不根據(jù)數(shù)據(jù)來建立
XML的文檔,然后才能夠?qū)@些文檔進(jìn)行自己需要的處理。在這種方式下,服務(wù)器將花費(fèi)
大量的精力在處理如何建構(gòu)這些XML文檔上,尤其是當(dāng)需要傳送的數(shù)據(jù)量很大時。
所以如果是讓客戶端的瀏覽器來建立這個XML文檔,并且在建立完畢后通過XMLHTTP將最后的
產(chǎn)品傳遞給服務(wù)器,這將大大減輕服務(wù)端的代碼量和負(fù)擔(dān)。
這種類型的問題的一個例子是給服務(wù)器上的XML文檔增加數(shù)據(jù)。如果是使用CGI的話,那么
就需要頻繁的查詢一個CGI的form,然后才能夠構(gòu)建一個加入XML文檔的XML節(jié)點(diǎn)。而如果是使用
XMLHTTP需要做的僅僅是把這個XML節(jié)點(diǎn)傳遞給服務(wù)端就可以了。
上面說討論的是XMLHTTP基本部分,有關(guān)它的詳細(xì)例子你可以在Microsoft Developers
Network中找到例子 。雖然使用這種通訊方式可以大有作為,我在我自己的運(yùn)用中僅僅只是
使用到了很少的一部分,也許任何一個聰明的開發(fā)者都能夠發(fā)現(xiàn)更多的運(yùn)用事例。
使用XMLHTTP而不是CGI(即使是我們心愛的ASP)能夠讓我編寫更多野心勃勃的網(wǎng)站運(yùn)用
程序,因?yàn)楝F(xiàn)在我們所關(guān)心的簡單到只是我們需要發(fā)送的數(shù)據(jù)而已。從而使用很少的代碼
就能夠?qū)崿F(xiàn)非常復(fù)雜的功能,而CGI對于用戶每一個可能的操作都需要我們來完完整整地
生成一個新的頁面。
但是由于目前并不是所有的瀏覽器都支持MSXML,許多使用ASP編寫的為了非企業(yè)內(nèi)部
目的的運(yùn)用程序需要支持CGI的交互。但是欣慰的是,編寫一個同時支持CGI和XMLHTTP數(shù)據(jù)
的頁面并不是很困難,并且將CGI的數(shù)據(jù)載入XML文檔中花費(fèi)的工作量也不是很大。
最簡單的方式來判斷數(shù)據(jù)是CGI的數(shù)據(jù)還是XML的數(shù)據(jù)就是判斷數(shù)據(jù)的MIME類型.
XMLHTTP的MIME是一個空字符串,除非你特定了其他的MIME類型 (可以到這個連接
查看不同的MIME類型http://msdn.microsoft.com/xml/reference/scriptref/XMLHttpRequest_object.asp).
而許多CGI的MIME類型是"application/x-www-form-urlencoded"
下面就是一個來判斷的代碼片段:
<%
if (Request.ServerVariables("REQUEST_METHOD") == "POST" )
{
if (Request.ServerVariables("CONTENT_TYPE")=="application/x-www-form-urlencoded")
{//如果是常規(guī)數(shù)據(jù),讓CGI來處理
Response.write(Request.form("stuff"));
}
else
{//如果是XMLHTTP連接,將Request對象轉(zhuǎn)載入XML解釋器
var req= Server.CreateObject("Microsoft.XMLDOM");
req.resolveExternals=false;
req.validateOnParse=false;
req.async=false;
req.load(Request);
Response.write(req.documentElement.selectSingleNode("stuff").text);
}
}
else{ %>
這是一種簡單明了的在同一個ASP頁面中即可以處理CGI也可以處理XMLHTTP數(shù)據(jù)的方法。
并且它也提供了一種能夠兼容在客戶端安裝了IE5.0以及使用其他其他瀏覽器瀏覽網(wǎng)站的模式。
或則也可以采取另外一種方法,就是我對所有的網(wǎng)站運(yùn)用程序還是采用以前的CGI接口,
但是在其他類型的客戶端運(yùn)用程序使用XMLHTTP方法,例如Microsoft Office運(yùn)用程序。
XMLHTTP的功能并不僅僅局限在瀏覽器上,我在Microsoft Office的VBA開發(fā)程序中使用XMLHTTP
取得了巨大的成功。現(xiàn)在我假設(shè)我被要求使用XML技術(shù)在更新我公司服務(wù)器上的Excel電子表
格中的數(shù)據(jù)。Excel能夠?qū)TML表格直接轉(zhuǎn)載到自己的表格中,但是它不能夠處理格式復(fù)雜的
頁面,例如本頁。數(shù)據(jù)除非使用了非常巧妙的技巧根本沒法插入電子表格。
我的解決方法是編寫了一個ASP頁面來操縱通過XMLHTTP從Excel中傳遞過來的數(shù)據(jù)。
通過一個VBA的宏給服務(wù)器發(fā)送一個請求,然后將響應(yīng)載入XML文檔,通過解釋器解釋后再
插入Excel的電子表格中。這將是一個無痕的解決方案,簡單的一個按鈕也許會讓你的老板、
同事或任何其他人的關(guān)系大有改觀。
下面是我實(shí)現(xiàn)上述方法的一個代碼片段。它使用XMLHTTP將服務(wù)器中的信息載入,然后將
其插入電子表格中。
Public Sub UpdateSheet()
Dim xmlhttp
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
Call xmlhttp.Open("POST", "http://www.yourserver.com/yourpage.asp", False)
Call xmlhttp.send("<reqtimesheet user='jimbob'/>")
Dim xmldoc
Set xmldoc = CreateObject("Microsoft.XMLDOM")
xmldoc.async = False
xmldoc.loadxml(xmlhttp.responsexml)
Worksheets("TimeSheet").Range("A1").Value = xmldoc.documentelement.getAttribute("firstname")
Worksheets("TimeSheet").Range("B1").Value = xmldoc.documentelement.getAttribute("lastname")
Worksheets("TimeSheet").Range("C37").Value = xmldoc.documentelement.selectSingleNode("totalhours").Text
End Sub
這個VBA的宏相當(dāng)?shù)暮唵。給服務(wù)器發(fā)送一個請求,然后將服務(wù)器上的響應(yīng)插入
XML文檔,然后更新Excel中cell中的內(nèi)容。當(dāng)然,我們可以使用這個技術(shù)做其他更多的運(yùn)用。
例如從一個Office運(yùn)用程序中上載數(shù)據(jù)到服務(wù)器上的XML文檔中(XML應(yīng)該是你首選的格式,
而不是Office 2000中提供的愚蠢的OfficeXML實(shí)現(xiàn)).或則把XML/ASP作為一個你數(shù)據(jù)庫的shell
這樣,你的運(yùn)用程序?qū)τ跀?shù)據(jù)庫就有了一個簡潔、統(tǒng)一的接口,而對數(shù)據(jù)庫結(jié)構(gòu)的
改動就不必要改動你所有的客戶端代碼了。
我發(fā)現(xiàn)XMLHTTP對象在我的編程中非常的有用。我一般使用Visual Basic, Delphi, 和 Visual J++編寫程序,在這個過程中,我經(jīng)常發(fā)現(xiàn)這些語言各自對在線程序處理的方法非常地不同,
他們各自有自己的對網(wǎng)絡(luò)程序的處理機(jī)制,但是如果你要是在處理網(wǎng)絡(luò)程序時都使用統(tǒng)一
的XMLHTTP連接方式,那么連接服務(wù)器的代碼將非常小,甚至更優(yōu)化,這是一種對所有的
語言都統(tǒng)一的接口。