gigigo Groupie
加入: 2004/5月/31
Online Status: Offline 回復: 42
|
Posted: 2004/5月/31 10:36上午 | IP記錄
|
|
|
RS技術的一個具體例子 在前面的主題中,我介紹了RS的基本工作原理,顯然如果將RS技術運用在一個 網站的設計中將會有很多非凡的作用(尤其是它的那個最大的優點,可以在不重整 網頁的情況下調用服務端的程式碼)。正是因為這個特點,你就可以像在編寫一個 傳統的C/S模式的程式一樣,對資料庫的資料進行處理了(我想大家一定很想知道具體應該如何來實現了,下面將給出一個具體的例子 ,測試這個破程式幾乎快把我給累死,呵呵。) 從前面的描述可以看到,要使用RS技術就需要客戶端和服務端滿足下面兩個條件: 1。客戶端只需要支持Java applet即可 2。而服務端只需要支持ASP即可 換句話說,就是RS技術是完全獨立與瀏覽器的(當然瀏覽器至少需要滿足支持Java 和javascript),你可以在IE中使用,也可以完全在 NC中使用,這也是區別與RDS技術的一個顯著特點。 在能夠靈活運用RS技術前,先要說明一個問題,就是前面也曾經提到過的「異步調用」 的問題。也正是因為有異步調用,才能夠實現你只重整網頁的某一部分而不用重整 整個網頁。 由於它的這個特點,你可以讓服務端來實現在你瀏覽網頁的同時 對你輸入資料的合法性檢查(當然這可以是一系列很複雜的合法性檢查,例如需要 將使用者輸入的資料和資料庫內已有的資料進行對比等,這個可不是客戶端的JS能夠解決的) 然後當服務端返回檢查結果後,你再進行相應的操作(例如彈出一個對話框告訴使用者 輸入出錯等等) 異步調用時的語法如下: RSExecute(serverURL, functionname, param_list) 第一個參數是你想調用的asp網頁的完整的URL路徑 第二個參數是你想調用函數的名稱 後面的就是該函數需要的輸入參數了 如果你想調用的函數需要兩個輸入參數的話,就是這樣的寫法: RSExecute(serverURL, functionname, f_arg_1, f_arg_2) 當進行調用時有兩種寫法, 一種是有返回結果的調用方式: objResult = RSExecute(serverURL, functionname, f_arg_1, f_arg_2); 另外一種則是沒有返回結果的調用方式: RSExecute(url, func_name, f_arg_1, f_arg_2, CallbackFunction); 這種調用方式要特別的注意,其中的CallbackFunction是客戶端的一個JS函數 它表示一但RS執行完畢服務端上的調用,就會馬上調用這個函數,並把結果返回到這個 函數中去。 一個典型的CallbackFunction函數應該是這樣的結構: function CallbackFunction(objResult) { //你自己的處理過程 } 其中唯一的輸入參數objResult就是RS調用的返回值. 下面我們假設這樣一種情況: 使用者在瀏覽器中輸入了使用者的e-mail地址,然後使用者離開了e-mail地址輸入框 進入接下來的輸入過程,這個時候就是RS該上場了,它根據使用者輸入的地址在 服務端的資料庫中查詢這個地址,就可以判斷出這個使用者是否已經存在,然後 把結果返回給客戶端,在客戶端再使用DHTML技術在一個叫"ShowResult"的輸入框 裡面提示使用者以前輸入的訊息。 function CallbackFunc(objResult) { // 提示使用者的訊息 window[objResult.context].value = objResult.return_value; } 而RSExecute()應該這麼調用 RSExecute(serverURL, functionname, f_arg_1, CallbackFunc, "ShowResult"); 不說了,不說了,上面囉嗦了這麼多,我想大家也都看得頭大了,下面還是 讓具體的程式碼來發言把: (請在使用程式碼前在你的服務器上建立一個叫NW的系統DSN文件,該文件使用了 Northworld即中文ACCESS97自帶的示例資料庫) 下面的例子是這麼進行的,default.htm中分為兩禎,在 main.html網頁中使用了RS技術,大家可以注意到在main.html中沒有使用到submit 所以如果你在該網頁中直接敲回車鍵的話什麼都不會出現,你必須通過鼠標單擊 那個"獲取訊息"按扭來使用這個局部網頁重整技術。在單擊完該按扭後,網頁會有 一段小小的延遲(這段時間內java applet在後台建立了和服務端的連接) 然後馬上網頁回復正常的鼠標,你可以在該網頁中繼續進行其他的操作。 而不必象普通網頁重整時,你只有等待資料。 而info.asp大家一眼就能夠看明白,其實就是一個很簡單的處理字元串的程式。 如果大家要是對DHTML技術熟悉的話,完全可以在客戶端完成這些操作。 至於EmpData.asp就是服務端處理資料的程式了。 好了,其中的好處大家可以自己去 體會。
特別注意,不要改變太多程式碼,不然很容易出錯,畢竟是在使用javascript編程
Default.htm文件程式碼如下: <HTML> <HEAD> <TITLE>RS技術的實現例子</TITLE> </HEAD> <FRAMESET id=fset rows="70%,30%"> <FRAME name=main src="main.html"> <FRAME name=info src="info.asp"> </FRAMESET> </HTML>
Maim.html文件程式碼如下 <HTML> <HEAD> <TITLE>RS技術的實現例子</TITLE> </HEAD> <BODY> <script language="javascript" src="http://YourServer/_ScriptLibrary/rs.htm"></script > <script language="javascript"> RSEnableRemoteScripting("http://YourServer/_ScriptLibrary"); </script> <h1>僱員訊息</h1> <hr> <form name=MyForm> 請輸入你想查詢的名字: <br><input type=text name="empLastName" size=40> <input type=button name=btnExecute style="width=150" value="獲取訊息" onclick="execAsynch(empLastName.value)"> </form> <hr>
<SCRIPT LANGUAGE="javascript"> var serverURL = "http://YourServer"; var pageURL = "/batman/EmpData.asp";
function refreshPage(co) { if (co.status != 0) { alert("發生異常錯誤\n" + message); } strText = co.return_value; top.info.location = "info.asp?info=" + escape(strText); } function execAsynch(empLastName) { RSExecute(serverURL+pageURL, "GetEmpInfoAsArray", empLastName, refreshPage); } </SCRIPT> </BODY> </HTML>
info.asp文件程式碼 <HTML> <BODY> <% Response.Write Request.ServerVariables("REMOTE_USER")
strText = Request.QueryString("info") If strText = "" Then Response.End arrData = split(strText, "|") arrLabels = split("職工,頭銜,城市,僱傭日期", ",") %> <table border=0> <% for i=0 to 3 Response.Write "<tr>" Response.Write "<td><b>" & arrLabels(i) & "</b></td>" Response.Write "<td><i>" & arrData(i) & "</i></td>" next %> </table> </BODY> </HTML>
EmpData.asp文件 <%@ LANGUAGE=VBSCRIPT %> <% RSDispatch %>
<SCRIPT RUNAT=SERVER Language=javascript> <!--#INCLUDE VIRTUAL="/_ScriptLibrary/RS.ASP"-->
function Description() { this.GetEmpInfoAsArray = DoGetData; } public_description = new Description();
function DoGetData(empName) { sql = "select * from 僱員 where [名字]='" + empName + "'"; rst = new ActiveXObject("ADODB.Recordset"); rst.CursorLocation = 3;
rst.Open(sql, "NW"); i = 0; strText = "";
if (rst.RecordCount == 1) { strText += rst.Fields("僱員ID").Value + " - " + rst.Fields("尊稱").Value + " " + rst.Fields("姓氏").Value + " " + rst.Fields("名字").Value; strText += "|"; strText += rst.Fields("頭銜").Value; strText += "|"; strText += rst.Fields("城市").Value + " " + rst.Fields("地區").Value + ", " + rst.Fields("國家").Value; strText += "|"; d = new Date(rst.Fields("僱用日期").Value); strText += (1+d.getMonth()) + "/" + d.getDate() + "/" + d.getYear(); } return strText; } </SCRIPT>
|