台灣最大程式設計社群網站
線上人數
598
 
會員總數:245619
討論主題:189317
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 用XMLHTTP實現偽Web服務
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
用XMLHTTP實現偽Web服務
價值 : 0 QP  點閱數:490 回應數:0
樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
用XMLHTTP實現偽Web服務

本文揭示XMLHTTP的神秘面紗。
我很喜歡使用XMLHTTP,主要是因為它能夠將任何ActiveX類方法展示給客戶。
就是說,你能夠讓客戶調用你的ActiveX控件。

最主要的是所有的通訊都是在後臺進行的。
使用XMLHTTP能夠擴展對資料庫的存取能力。
提交查詢申請時,用XMLHTTP向ASP偵聽(服務)頁發出XML格式的指令,ASP網頁隨即解釋該命令並調用VB activeX控件裡的方法。
這個VB控件用XML字符串形式將查詢結果返回給ASP服務頁,再由服務頁將結果組裝成XML格式返回給會員。
在作這一繫列事情時,不需對目前網頁進行重讀取。會員甚至不知道後臺在作些什麼。


在本文末尾可以下載有關示例源程式。

本文示例對繫統的要求是:

MS SQL Server(包含pubs資料庫示例),

MS IE 5.0+,

MSXML 3.0解析器,

MS IIS - 將示例中所有的ASP文件,CSS,及mybooks.xml文件拷貝到服務器的一個虛路徑下。


將bookview.asp, xml_receive.asp, mybooks.xml, default.css, 和book.css等文件拷貝到服務器的一個虛路徑下。

在服務器上加入WebClass.xmlcontrol(webclass.dll)。

在xml_receive.asp文件裡設置SQL Server服務器名。

在webClass.xmlcontrol類裡設置你的會員名和密碼。


來看看XMLHTTP的功能:


客戶端:這裡是bookViewer.asp文件中的一段代碼,用XMLHTTP來存取Pubs資料庫的books:

var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); //創建XMLHTTP對像

var xmlcmd='<?xml version="1.0"?><ENVELOPE><XMLCMD c1="gettitlesxml" p1="" p2="" p3=""></XMLCMD></ENVELOPE>';

xmlhttp.Open("POST","xml_receive.asp", false); //準備用XMLHTTP向xml_receive.asp發送指令

xmlhttp.Send(xmlcmd); //發出指令


第一行:創建XMLHTTP對像的引用。

第二行:創建XML指令。注意:可以不用XML格式而使用普通文件構造指令。之所以用XML格式,是因為它容易解析指令本身和指令的參數。

第三行:打開連接。其中第一個參數是http方法(最常使用的不是"POST"就是"GET")。第二個參數指向執行指令的URL路徑。第三個參數決定是否異步執行。另外還可以加上二個參數,即會員名和密碼。在上面的例子中,我用HTTP POST呼叫xml_receive.asp網頁(我稱它為偵聽頁),要求同步進行查詢工作(在完成查詢前不做其他事)。

第四行:發出指令,開始工作。注意:指令是由第二行代碼作出的。因為使用了同步執行方式,現在隻能坐等結果返回。


偵聽頁(xml_receive.asp)工作基礎

我把這個網頁稱為偵聽頁,是因為它在服務端坐等XMLHTTP指令的到來。收到查詢請求後,它要做三件事。

首先,將查詢請求讀取到XML DOM,並對指令及其參數進行解析。

其次,根據客戶要求,調用後臺Active X控件的處理方法。後臺Active X控件將執行結果用XML字符串返回。

第三,將返回結果讀取到XML DOM並用Response對像返回給會員。

[譯者注:這是一種很典型的三層應用,可以舉一反三。]


以上三步驟具體執行如下:


偵聽頁(第一步 - 指令解析):

以下是xml_receive.asp文件中的一段代碼,後面附有注釋。這段代碼用於解析接收到的查詢指令和參數(parameter1, parameter2, parameter3)。參數的數量可以任意增加。


var doc = Server.CreateObject("Msxml2.DOMDocument");

doc.load(Request); //將XMLHTTP請求讀取到XML DOM進行解析

var c1=doc.childNodes.item(1).childNodes.item(0).attributes.item(0).text; //指令

var p1=doc.childNodes.item(1).childNodes.item(0).attributes.item(1).text; //參數1

var p2=doc.childNodes.item(1).childNodes.item(0).attributes.item(2).text; //參數2

var p3=doc.childNodes.item(1).childNodes.item(0).attributes.item(3).text; //參數3

if (doc.childNodes.item(1).childNodes.length==2) //檢驗xml

var passedXML=''+doc.childNodes.item(1).childNodes.item(1).xml;

var xmlreturn=''; //初始化返回值

var doc=null; //釋放XML DOM



偵聽頁(第二步 - 調用後臺Active X控件的適當方法):

以下是xml_receive.asp文件中調用"gettitlesxml"方法的一段代碼。它創建Active X對像並調用其中的GetTitlesXML()方法來返回Pubs資料庫的查詢結果。記住,結果是用XML字符串方式返回。


//************* Function gettitlesxml ***********************

if (c1=="gettitlesxml")

{

resultsXML=true; //讀取結果的xml字符串

var objWC= Server.CreateObject("WebClass.xmlControl"); //初始化VB控件

objWC.strServer=sqlServer; //指向SQL Server服務器

xmlreturn=objWC.GetTitlesXML(); //VB函數,用XML字符串返回標題

var objWC=null; //釋放VB控件

}



偵聽頁(第三步 - 返回結果):

以下是xml_receive.asp文件中的一段代碼,將查詢結果返回給會員。這裡包括創建結果DOM,讀取結果到DOM,檢查讀取是否正確,最後用ASP的Response對像將結果返回給會員。注意:是用XML DOM的Save方法返回結果,其參數為Response,表示將結果存入Response輸出流。



var result = Server.CreateObject("Msxml2.DOMDocument"); //創建結果XML DOM

if (resultsXML) //讀取XML字符串

{
result.loadXML(xmlreturn); //調用loadXML將字符串讀取到DOM

if (c1=="savemybooks") result.save(Server.MapPath(p1)); //如果需要,保存XML文件

}


if ( result.parseError.errorCode!=0 ) //解析出錯

{

//返回結果

xmlreturn='<?xml version="1.0"?><RESULTS error="true">FALSE</RESULTS>';

result.loadXML(xmlreturn); //將出錯訊息加入到結果

}


//用ASP Response對像將結果返回給會員

Response.ContentType = "text/xml"; //返回XML格式文件

result.save(Response);//將DOM存放到HTTPResponse輸出流

var result = null;



返回到客戶端(bookViewer.asp)

服務端工作時,客戶端隻有耐心等待。一旦收到返回結果,就將其讀取到XML DOM,並用ASP表單顯式。



objSallbooks.load(xmlhttp.responseXML); //將返回值讀取到DOM

var xmlhttp = null;

//檢驗返回是否出錯

if (objSallbooks.childNodes.item(1).childNodes.item(0).nodeValue=="FALSE") Snumberofbooks=0;

else Snumberofbooks=(objSallbooks.childNodes.item(1).childNodes.length); //設置Books數量

if (Snumberofbooks>0) display_book(0,1); //顯式第一本書籍名



第一行:將XMLHTTP的Response讀取到XML DOM對像objSallBooks中去。XMLHTTP另外還有responseText方法用於讀取普通文件。

第二行:因為已經建立了XML DOM,可以不再需要XMLHTTP了。

第三行:如果出錯,偵聽頁會返回<?xml version="1.0"?><RESULTS error="true">FALSE</RESULTS>出錯訊息。

第四行:如果正確,DOM裡就有查詢結果,並可通過根節點的子節點長度求得結果數量。

第五行:如果有結果,就將結果綁定到表單上顯示。



現在可以對gettitlesxml函數作些補充。

對BookViewer.ASP文件作一些改動就能增強gettitlesxml函數的查詢功能。會員可以根據書籍的類型,價格和銷售日期對書籍進行查詢。下面就是改動的代碼。注意文本框由原先的隻讀方式改為常規方式。



var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");

var where= "";

if(document.frmFields.Stype.value.length>0) where=where + " type= '"+document.frmFields.Stype.value+"' AND ";

if(document.frmFields.Sprice.value.length>0) where=where + " price<= "+document.frmFields.Sprice.value+" AND ";

if(document.frmFields.Ssales.value.length>0) where=where + " ytd_sales>= "+document.frmFields.Ssales.value;

if(where.length>0) where = " WHERE " + where;

var xmlcmd='<?xml version="1.0"?>
<ENVELOPE><XMLCMD c1="gettitlesxml" p1="'+where+'" p2="" p3=""></XMLCMD>
</ENVELOPE>'; xmlhttp.Open("POST", "xml_receive.asp", false);
//用XMLHTTP向xml_receive.asp傳送指令

xmlhttp.Send(xmlcmd);//發出XML指令



第二行到第六行:建立查詢語句

第七行:與原先的代碼不同在於增加了一個p1參數,它是由第二行到第七行代碼建立的。



xml_receive.ASP文件的改動:

將新增的p1參數加入到Active X控件的GetTitlesXML函數中。



//************* Function gettitlesxml ***********************

if (c1=="gettitlesxml")

{

resultsXML=true; //讀取結果的xml字符串

var objWC= Server.CreateObject("WebClass.xmlControl"); //初始化VB控件

objWC.strServer=sqlServer; //指向SQL Server服務器

xmlreturn=objWC.GetTitlesXML(p1); //VB函數,用XML字符串返回結果

var objWC=null; //釋放VB控件

}



結語

這裡所作的一切是為了將ASP的客戶互動應用技術提高一個檔次。
會員能夠在一個簡單的網頁裡訪問資料庫。查詢過程由XMLHTTP在後臺執行,給會員的感覺就像在用一個Windows程式而不是Web應用。本文涉及的是Web服務理念。比Web服務更為復雜的是SOAP協議,它能使Web服務更具有彈性。在一般情況下 (隻要不是分布式應用),用上面給出的方法是足夠的了。


按照上面描述的技術路線:

客戶端應用-->ASP偵聽頁-->Active X控件,以及Active X控件-->ASP偵聽頁-->客戶端應用

提供的方法,可以在客戶端和後臺Active X控件之間建立通訊聯繫。ASP的偵聽頁可以給出會員需要的Active X控件的部分方法和屬性,而將其他內容隱藏起來。在偵聽頁中可以建立加密機製。這樣可以使得整個資料庫安全性得到很大程度的提高。因為所有對資料庫的訪問都是通過Active X進行的,隻要一些必需的訪問函數暴露在ASP文件中。


此文章的附件 : http://jaccy.virtualave.net/dl/200204150806170.zip


本篇文章發表於2002-06-07 00:00
目前尚無任何回覆
   

回覆
如要回應,請先登入.