Remote Scripting (RS)老早以前我就一直在說這個技術(shù)名詞了, 它到底是個什么東東了,其實RS是一種遠程調(diào)用你的ASP頁面 (當(dāng)然是調(diào)用你指定的URL中的ASP頁面了)中的某個函數(shù)或者方法 的技術(shù)。 該技術(shù)主要有三大優(yōu)點: I。你能夠優(yōu)化你每次從客戶端到服務(wù)端的一個來回數(shù)據(jù)流程 II。你能夠在不同的ASP頁面中重用(就是多次使用)同一個函數(shù)或則方法 III。當(dāng)你連接到遠程的ASP頁面時不會刷新你的當(dāng)前正在瀏覽的頁面 上面是它的三大特點,下面講講具體的過程。 RS讓你直接調(diào)用(或則說建立一個到服務(wù)端的連接) 注意,這也是它和RDS的不同的地方,RDS是通過一個類似與代理的機制并且 建立的連接是在一個斷開連接的記錄集基礎(chǔ)上的。 RS在建立這個連接的時候,是不會影響當(dāng)前所在的ASP頁面的。 一旦你建立了這樣的一個連接后,你就能夠調(diào)用任何一個在你的遠程頁面中 申明為public的函數(shù)。然后你可以把調(diào)用頁面需要的所有數(shù)據(jù)緩存在本地, 當(dāng)客戶端的頁面接受到遠程調(diào)用函數(shù)的返回值后,這些返回值有可能是 一個數(shù)組(array),記錄集(recordset),字符串(string) 接下來你就可以使用客戶端的數(shù)據(jù)處理技術(shù)(例如客戶端的JS,DHTML等)來對這些 數(shù)據(jù)進行處理了。這些數(shù)據(jù)你完全可以當(dāng)作好象就是使用客戶端的 腳本函數(shù)得到的一樣。
RS的基本原理: RS是通過“RS.HTM”(這是一個客戶端的模塊)和“RS.asp”(這是一個服務(wù)端的模塊) 來建立一個客戶端到服務(wù)端的連接的。 當(dāng)然其中使用了一個后臺加入到客戶端的Java applet來實現(xiàn)的。 該applet通過HTTP傳遞你要調(diào)用服務(wù)端上特定的ASP頁面和參數(shù)。 而客戶端的頁面通過調(diào)用本地的rs.htm中的函數(shù)來進行每次的遠程調(diào)用申請。 所以了,大家可以想象得到要想使用RS技術(shù)的話,那么在你的ASP頁面中就必須要 包括這些特定的頁面
如何使用RS 一般只要你安裝了VI后,就有了所需要的東西了。 主要是下面的三個文件:rsproxy.class, rs.asp, rs.htm. 把它們放到這個目錄中wwwroot\_ScriptLibrary 客戶端的寫法: 然后在你想使用RS的頁面的最前面包含這幾個文件: <script language="JavaScript" src="http://YourServer/_ScriptLibrary/rs.htm"> </script> <script language="JavaScript"> serverURL = "http://YourServer/_ScriptLibrary "; RSEnableRemoteScripting(serverURL); </script> 注意其中的serverURL,它必須是你想調(diào)用服務(wù)端asp的URL地址的全寫。 例如:http://YourServer/rsdemo/server.asp 服務(wù)端的寫法: 還要注意的是你必須要使用JavaScript來寫你的遠程調(diào)用部分(就是服務(wù)端的程序) ,因為這些RS函數(shù)在服務(wù)端都是使用JS寫的。 一個通用的寫法如下: '必須先調(diào)用RSDispatch,而且對大小寫敏感 <% RSDispatch %> <SCRIPT RUNAT=SERVER Language=javascript> <!--#INCLUDE VIRTUAL="/_ScriptLibrary/RS.ASP"--> ASP遠程調(diào)用對象的寫法很象是在寫DHTML的腳本.事實上,它必須要支持一個public_description 對象來描述通用的公共編程接口,并且實現(xiàn)申明所有的方法和屬性: 例子如下: function Description() { this.GetEmpInfoAsArray = DoGetData; } public_description = new Description (); function DoGetData(employeeName) { //為了能夠讓RS能夠識別你自己寫出來的函數(shù), //你必須要把它們申明成一個固定的名字public_description. //然后你可以在這個DoGetData中寫自己想返回的東西 //在這個例子中將使用SQL字符串和ADO來查詢微軟給的例子數(shù)據(jù)庫Northwind //當(dāng)然你應(yīng)該給該數(shù)據(jù)庫建立一個叫NW的DSN aRecs = new Array(); if (rst.RecordCount == 1){ aRecs[i++] = rst.Fields("EmployeeID").Value aRecs[i++] = rst.Fields("Title").Value return aRecs; } 當(dāng)然了,你也可以把整個記錄集都返回回去。
好了,上面是整個服務(wù)端的寫法,下面來看看客戶端怎么來處理這些返回的數(shù)據(jù)。 在客戶端可以通過一個同步的調(diào)用,如果同步調(diào)用的話所有結(jié)果都會在服務(wù)端執(zhí)行 完畢后返回, 當(dāng)然也可以通過一個異步的調(diào)用,當(dāng)你一旦調(diào)用了服務(wù)端的程序后 就馬上返回. 這些調(diào)用都是通過RS引擎中的RSExecute函數(shù)來實現(xiàn)的, 它一共有兩個參數(shù),一個是pageURL(就是前面說的asp頁面的URL) 另外一個是funcName就是你要調(diào)用的函數(shù)名。 function RSExecute(pageURL, funcName) 現(xiàn)在我想你一定會困惑了,怎么沒有函數(shù)需要的輸入?yún)?shù)呀?呵呵。 這是因為RSExecute將使用Javascript的arguments對象,它會把該對象中的 所有參數(shù)當(dāng)成你的函數(shù)需要的參數(shù)打包成一個數(shù)組傳遞給服務(wù)端。
co = RSExecute(pageURL, "GetEmpInfoAsArray", empName); if (co.status == 0) refreshPage(co);
function refreshPage(co) { //你想進行的處理可以寫在這下面
}
|