幾個月以前,一個同事到我這裡來,說他有一個客戶端JavaScript的問題。我不得不向他解釋說,活動服務器頁面(asp)的區段變量不能從客戶端訪問,除非它們通過cookIE或者隱藏的輸入框被傳遞。但是我沒有停止繼續尋找從客戶端訪問ASP區段變量更好方法的工作。
最近在研究如何不需要上傳和下載頁面就能夠從服務器獲取信息時,我讀到了關於xmlHTTP ActiveX對象的內容。從本質上講,這個對象為Internet Explorer和Web服務器通訊並接收回應提供了一種方法。它是MSXML動態加載庫的一部分,其當前的版本是第4版,並能從微軟免費下載。同樣值得重要的是,注意對於微軟Internet Explorer 5.x,MSXML缺省的版本還是第2版。
XMLhttp基礎
你可以使用XMLHTTP對象在服務器上執行一個ASP,等待服務器的回應,然後根據回應來動作。這意味著有了一個Javascript函數和一個專用的動態服務器頁面,就有可能解決從客戶端訪問變量的問題。客戶端需要區段變量的值嗎?沒問題!你要做的全部工作就是調用一個小小的函數。
實現XMLHTTP對象
只要開始試著實現以前沒有嘗試過的概念或特性,我通常會發現把問題分解成邏輯件會更容易一些。在這種情況下,我從服務器端的和客戶端的開始。心裡有這個概念,我命名為test.ASP的服務器端活動服務器頁面看起來就是這個樣的了:
<%@ Language=VBScript%>
<%
Response.Write
session(Request.QueryString("variable"))
%>
這個服務器端代碼段的目的是返回任何和查詢字符串裡同鍵相關聯的ASP區段變量的值。
由於請求是從客戶端發起的,而且有一個對象正在被使用,所以客戶端這一部分會更詳細。創建XMLHTTP對象、設置對象的屬性、調用對象的發送方法,以及根據對象返回的信息進行動作,這些都是有必要的。Listing A是執行這些任務的JavaScript。
要進一步檢查XMLHTTP的可能性,就有必要往回走一步,這是因為利用URL把查詢信息從客戶端送到服務器端是有局限性的。URL最大長度限定為2,048字節。這2KB的最大長度還包括了URL的非查詢字符串這部分。要更進一步就要找到一種更好的方法,把信息從客戶端送到服務器端。
我只花了大約20分鐘就決定好了如何把信息從客戶端傳遞到服務器端。我決定使用HTTP。在你確定我腦子發懵但已經回過神以前,讓我來解釋一下。我要在HTTP報頭裡傳遞信息。通過包頭來傳遞信息就能夠避免使用URL傳遞信息所無法避免的2,048字節的限制。
心裡有了這些,現在就需要修改通過URL傳遞信息的例子了。在客戶端不是要把參數添加到test.ASP的URL裡,而是XMLHTTP對象的setHeader方法會傳遞這個參數。進行這樣的修改就產生了Listing B裡的客戶端程序。
在服務器端,有必要從HTTP報頭裡而不是請求對象的查詢字符串裡取回區段變量名。其結果是:
<%@ Language=VBScript %>
<%
Response.Write Session(Request.ServerVariables("HTTP_test"))
%>
更進一步
我在這裡所描述的對象叫做XMLHTTP。注意這個對象的頭3個字母是XML。你已經見過了如何在客戶端和服務器端傳遞信息,但是XMLHTTP對象的初衷是允許信息作為XML在客戶端和服務器端傳遞信息。在以後的文章裡,我會解釋如何使用XML的簡單對象訪問協議(SOAP)來交換更加復雜的信息。