|
來源:www.yesky.com
轉(zhuǎn)貼-如何在不刷新頁面的情況下調(diào)用遠(yuǎn)程ASP (2000.03.30)
RS技術(shù)的一個(gè)具體例子 在前面的帖子中,我介紹了RS的基本工作原理,顯然如果將RS技術(shù)運(yùn)用在一 個(gè)網(wǎng)站的設(shè)計(jì)中將會(huì)有很多非凡的作用(尤其是它的那個(gè)最大的優(yōu)點(diǎn),可以在不刷 新頁面的情況下調(diào)用服務(wù)端的代碼)。正是因?yàn)檫@個(gè)特點(diǎn),你就可以象在編寫一個(gè) 傳統(tǒng)的C/S模式的程序一樣,對數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行處理了(我想大家一定很想知道 具體應(yīng)該如何來實(shí)現(xiàn)了,下面將給出一個(gè)具體的例子,調(diào)試這個(gè)破程序幾乎快把 我給累死,呵呵。)
從前面的描述可以看到,要使用RS技術(shù)就需要客戶端和服務(wù)端滿足下面兩個(gè) 條件: 1?蛻舳酥恍枰С諮ava applet即可 2。而服務(wù)端只需要支持ASP即可 換句話說,就是RS技術(shù)是完全獨(dú)立與瀏覽器的(當(dāng)然瀏覽器至少需要滿足支持Ja va 和JavaScript),你可以在IE中使用,也可以完全在 NC中使用,這也是區(qū)別與RDS技術(shù)的一個(gè)顯著特點(diǎn)。 在能夠靈活運(yùn)用RS技術(shù)前,先要說明一個(gè)問題,就是前面也曾經(jīng)提到過的" 異步調(diào)用” 的問題。也正是因?yàn)橛挟惒秸{(diào)用,才能夠?qū)崿F(xiàn)你只刷新頁面的某一部分而不用刷 新 整個(gè)頁面。 由于它的這個(gè)特點(diǎn),你可以讓服務(wù)端來實(shí)現(xiàn)在你瀏覽頁面的同時(shí) 對你輸入數(shù)據(jù)的合法性檢查(當(dāng)然這可以是一系列很復(fù)雜的合法性檢查,例如需 要 將用戶輸入的數(shù)據(jù)和數(shù)據(jù)庫內(nèi)已有的數(shù)據(jù)進(jìn)行對比等,這個(gè)可不是客戶端的JS能 夠解決的) 然后當(dāng)服務(wù)端返回檢查結(jié)果后,你再進(jìn)行相應(yīng)的操作(例如彈出一個(gè)對話框告訴 用戶 輸入出錯(cuò)等等) 異步調(diào)用時(shí)的語法如下: RSExecute(serverURL, functionname, param_list) 第一個(gè)參數(shù)是你想調(diào)用的asp頁面的完整的URL路徑 第二個(gè)參數(shù)是你想調(diào)用函數(shù)的名稱 后面的就是該函數(shù)需要的輸入?yún)?shù)了 如果你想調(diào)用的函數(shù)需要兩個(gè)輸入?yún)?shù)的話,就是這樣的寫法: RSExecute(serverURL, functionname, f_arg_1, f_arg_2) 當(dāng)進(jìn)行調(diào)用時(shí)有兩種寫法, 一種是有返回結(jié)果的調(diào)用方式: objResult = RSExecute(serverURL, functionname, f_arg_1, f_arg_2);
另外一種則是沒有返回結(jié)果的調(diào)用方式: RSExecute(url, func_name, f_arg_1, f_arg_2, CallbackFunction); 這種調(diào)用方式要特別的注意,其中的CallbackFunction是客戶端的一個(gè)JS函數(shù) 它表示一但RS執(zhí)行完畢服務(wù)端上的調(diào)用,就會(huì)馬上調(diào)用這個(gè)函數(shù),并把結(jié)果返回 到這個(gè) 函數(shù)中去。 一個(gè)典型的CallbackFunction函數(shù)應(yīng)該是這樣的結(jié)構(gòu): function CallbackFunction(objResult) { //你自己的處理過程 } 其中唯一的輸入?yún)?shù)objResult就是RS調(diào)用的返回值. 下面我們假設(shè)這樣一種情況: 用戶在瀏覽器中輸入了用戶的e-mail地址,然后用戶離開了e-mail地址輸入 框 進(jìn)入接下來的輸入過程,這個(gè)時(shí)候就是RS該上場了,它根據(jù)用戶輸入的地址在 服務(wù)端的數(shù)據(jù)庫中查詢這個(gè)地址,就可以判斷出這個(gè)用戶是否已經(jīng)存在,然后 把結(jié)果返回給客戶端,在客戶端再使用DHTML技術(shù)在一個(gè)叫"ShowResult"的輸入框
里面提示用戶以前輸入的信息。 function CallbackFunc(objResult) { // 提示用戶的信息 window[objResult.context].value = objResult.return_value; } 而RSExecute()應(yīng)該這么調(diào)用 RSExecute(serverURL, functionname, f_arg_1, CallbackFunc, "ShowResult" ); 不說了,不說了,上面羅嗦了這么多,我想大家也都看得頭大了,下面還是
讓具體的代碼來發(fā)言把: (請?jiān)谑褂么a前在你的服務(wù)器上建立一個(gè)叫NW的系統(tǒng)DSN文件,該文件使用了 Northworld即中文ACCESS97自帶的示例數(shù)據(jù)庫) 下面的例子是這么進(jìn)行的,default.htm中分為兩禎,在 main.html頁面中使用了RS技術(shù),大家可以注意到在main.html中沒有使用到subm it 所以如果你在該頁面中直接敲回車鍵的話什么都不會(huì)出現(xiàn),你必須通過鼠標(biāo)單擊
那個(gè)"獲取信息"按扭來使用這個(gè)局部頁面刷新技術(shù)。在單擊完該按扭后,頁面會(huì) 有 一段小小的延遲(這段時(shí)間內(nèi)java applet在后臺(tái)建立了和服務(wù)端的連接) 然后馬上頁面回復(fù)正常的鼠標(biāo),你可以在該頁面中繼續(xù)進(jìn)行其他的操作。 而不必象普通頁面刷新時(shí),你只有等待數(shù)據(jù)。 而info.asp大家一眼就能夠看明白,其實(shí)就是一個(gè)很簡單的處理字符串的程序。
如果大家要是對DHTML技術(shù)熟悉的話,完全可以在客戶端完成這些操作。 至于EmpData.asp就是服務(wù)端處理數(shù)據(jù)的程序了。 好了,其中的好處大家可以自己去 體會(huì)。
特別注意,不要改變太多代碼,不然很容易出錯(cuò),畢竟是在使用JavaScript編程
Default.htm文件代碼如下: <HTML> <HEAD> <TITLE>RS技術(shù)的實(shí)現(xiàn)例子</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技術(shù)的實(shí)現(xiàn)例子</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("發(fā)生異常錯(cuò)誤\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("地區(qū)").Value + ", " + rst.Fields("國家").Value; strText += "|"; d = new Date(rst.Fields("雇用日期").Value); strText += (1+d.getMonth()) + "/" + d.getDate() + "/" + d.getYear(); } return strText; } </SCRIPT> ======================================================================================================================================= 轉(zhuǎn)貼-關(guān)于資料上傳的問題 (2000.03.29)
關(guān)于資料上傳的問題
需要一服務(wù)器端控件,如SAFileUP(http://www.serverpages.com/upload )等,
也可以自己用VB寫: 編寫Web方式上載文件的ASP組件
---- 基于Web方式上載文件,要遵從RFC1867標(biāo)準(zhǔn)。但I(xiàn)IS沒有提供這方面的支持 。雖然可以從Internet上下載這方面的ASP組件,但大多都是試用版,有使用時(shí)間 的限制;并且,功能上也不能完全滿足自己的要求。我們可以編寫自己的ASP組件 ,使之適合自己的應(yīng)用系統(tǒng)的需求。
---- 我們假設(shè)有如下的一個(gè)上載文件的.html文件,它被命名為demo.htm:
< HTML > < BODY > < FORM method="post" enctype= "multipart/form-data" action="upload.asp" > < input type=text name="text1" >< BR > < input type=file name="file1" >< BR > < input type=submit value="上載" > < /FORM > < /BODY > < /HTML > ---- 按照RFC1867標(biāo)準(zhǔn),demo.htm傳到服務(wù)器端的二進(jìn)制數(shù)據(jù)具有類似的如下格
式:
-----------------------------5fi25134734389 Content-Disposition: form-data; name="text1"
Text test -----------------------------5fi25134734389-- Content-Disposition: form-data; name="file1"; filename="E:\GIF\girl.gif" Content-Type: image/gif
GIF89a? ????嚕鄛}}^^^υ,? -----------------------------5fi25134734389 ---- 其中, 類似于"-----------------------------5fi25134734389”的這一 段字符串我們稱之為"定界符”。我們看到,demo.htm文件中的Form元素"text 1”,"file1”出現(xiàn)在定界符后的"name=”標(biāo)記處;對text1而言,"name=”標(biāo) 記后緊接兩對回車換行符(chr(13)&chr(10)&chr(13)&chr(10))即是客戶端輸入 的值,該值結(jié)束時(shí)跟一對回車換行符和一個(gè)定界符;對file1而言,"name=”標(biāo) 記后的"filename=” 標(biāo)記指出了客戶端上載的文件的路徑和文件名,下一行指 出了文件的類型,后跟兩對回車換行符表示文件數(shù)據(jù)的開始,文件數(shù)據(jù)結(jié)束時(shí)跟 一對回車換行符和一個(gè)定界符。
---- 下面,我們以VB6.0中文版環(huán)境為例,講述如何編寫上載文件的ASP組件:
---- 1. 進(jìn)入VB時(shí),選擇工程類型為ActiveX DLL。
---- 2. 在工程窗口中選擇工程,在屬性窗口中給工程重命名,如"Huang”;
在工程窗口中選擇類模塊"Class1”, 在屬性窗口中將其重命名,如"Upload File”,并且,將Instancing屬性設(shè)置為"5-MultiUse”。 ---- 3. 選擇VB菜單"工程—— >引用—— >Microsoft Active Server Pages Object Library”,單擊"確定”。
---- 4. 編寫類模塊,代碼 Zip 2KB
---- 對存入文件的目標(biāo)目錄,要有寫入的權(quán)限。
---- 對OnStartPage過程的說明:當(dāng)客戶請求一個(gè)基于ASP的Web文件時(shí),Web 服
務(wù)器會(huì)調(diào)用該ASP文件上所有ASP組件的OnStartPage方法。Web開發(fā)者可以在OnSt
artPage過程中訪問ASP的內(nèi)建組件。
---- 5.選擇"文件—— >生成Huang.DLL”, 生成Huang.DLL。如果VB就在IIS
服務(wù)器上,則VB會(huì)自動(dòng)注冊該組件;否則,把Huang.DLL拷貝到IIS服務(wù)器所在的
Windows NT目錄下,運(yùn)行"Regsrv32 Huang.DLL”注冊該組件。
---- 至此,文件上載的ASP組件編寫并注冊完成。
---- 編寫upload.asp文件如下:
< %@ Language=VBScript % > < HTML > < BODY > < % Dim txtValue
Set obj = Server.CreateObject("Huang.UploadFile") txtValue = obj.GetTheValue("text1") Response.Write( "text1的輸入值是: " & txtValue) Response.Write "< P > < /p >" Response.Write "選擇的文件已經(jīng)上載到服務(wù)器!" obj.SaveTheFile "file1", "c:\test" % > < /BODY > < /HTML > ---- 上述例子在VB6.0中文版和IIS4.0中文版下調(diào)試通過。
代碼可到:http://www.ccw.com.cn/99/tips/9905/052601-06.zip 下載。
---- 基于Web方式上載文件,要遵從RFC1867標(biāo)準(zhǔn)。但I(xiàn)IS沒有提供這方面的支持 。雖然可以從Internet上下載這方面的ASP組件,但大多都是試用版,有使用時(shí)間 的限制;并且,功能上也不能完全滿足自己的要求。我們可以編寫自己的ASP組件 ,使之適合自己的應(yīng)用系統(tǒng)的需求。
---- 我們假設(shè)有如下的一個(gè)上載文件的.html文件,它被命名為demo.htm:
< HTML > < BODY > < FORM method="post" enctype= "multipart/form-data" action="upload.asp" > < input type=text name="text1" >< BR > < input type=file name="file1" >< BR > < input type=submit value="上載" > < /FORM > < /BODY > < /HTML > ---- 按照RFC1867標(biāo)準(zhǔn),demo.htm傳到服務(wù)器端的二進(jìn)制數(shù)據(jù)具有類似的如下格 式:
-----------------------------5fi25134734389 Content-Disposition: form-data; name="text1"
Text test -----------------------------5fi25134734389-- Content-Disposition: form-data; name="file1"; filename="E:\GIF\girl.gif" Content-Type: image/gif
GIF89a? ????嚕鄛}}^^^υ,? -----------------------------5fi25134734389 ---- 其中, 類似于"-----------------------------5fi25134734389”的這一 段字符串我們稱之為"定界符”。我們看到,demo.htm文件中的Form元素"text 1”,"file1”出現(xiàn)在定界符后的"name=”標(biāo)記處;對text1而言,"name=”標(biāo) 記后緊接兩對回車換行符(chr(13)&chr(10)&chr(13)&chr(10))即是客戶端輸入 的值,該值結(jié)束時(shí)跟一對回車換行符和一個(gè)定界符;對file1而言,"name=”標(biāo) 記后的"filename=” 標(biāo)記指出了客戶端上載的文件的路徑和文件名,下一行指 出了文件的類型,后跟兩對回車換行符表示文件數(shù)據(jù)的開始,文件數(shù)據(jù)結(jié)束時(shí)跟 一對回車換行符和一個(gè)定界符。
---- 下面,我們以VB6.0中文版環(huán)境為例,講述如何編寫上載文件的ASP組件:
---- 1. 進(jìn)入VB時(shí),選擇工程類型為ActiveX DLL。
---- 2. 在工程窗口中選擇工程,在屬性窗口中給工程重命名,如"Huang”; 在工程窗口中選擇類模塊"Class1”, 在屬性窗口中將其重命名,如"Upload File”,并且,將Instancing屬性設(shè)置為"5-MultiUse”。
---- 3. 選擇VB菜單"工程—— >引用—— >Microsoft Active Server Pages Object Library”,單擊"確定”。
---- 4. 編寫類模塊,代碼 Zip 2KB
---- 對存入文件的目標(biāo)目錄,要有寫入的權(quán)限。
---- 對OnStartPage過程的說明:當(dāng)客戶請求一個(gè)基于ASP的Web文件時(shí),Web 服 務(wù)器會(huì)調(diào)用該ASP文件上所有ASP組件的OnStartPage方法。Web開發(fā)者可以在OnSt artPage過程中訪問ASP的內(nèi)建組件。
---- 5.選擇"文件—— >生成Huang.DLL”, 生成Huang.DLL。如果VB就在IIS 服務(wù)器上,則VB會(huì)自動(dòng)注冊該組件;否則,把Huang.DLL拷貝到IIS服務(wù)器所在的 Windows NT目錄下,運(yùn)行"Regsrv32 Huang.DLL”注冊該組件。
---- 至此,文件上載的ASP組件編寫并注冊完成。
---- 編寫upload.asp文件如下:
< %@ Language=VBScript % > < HTML > < BODY > < % Dim txtValue
Set obj = Server.CreateObject("Huang.UploadFile") txtValue = obj.GetTheValue("text1") Response.Write( "text1的輸入值是: " & txtValue) Response.Write "< P > < /p >" Response.Write "選擇的文件已經(jīng)上載到服務(wù)器!" obj.SaveTheFile "file1", "c:\test" % > < /BODY > < /HTML > ---- 上述例子在VB6.0中文版和IIS4.0中文版下調(diào)試通過。
|