標題標題  顯示論壇會員列表名單  搜索論壇搜索  HelpHelp
  注冊注冊  登入登入
ASP教學區
 DoReMe : ASP教學區
主題 話題: 如何在不重整網頁的情況下調用遠端ASP 回復發表新主題
作者
貼子內容 << Prev Topic下一個主題 >>
gigigo
Groupie
Groupie


加入: 2004/5月/31
Online Status: Offline
回復: 42
Posted: 2004/5月/31 10:36上午 | IP記錄 引用 gigigo

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>
Back to Top 查看 gigigo's 資料 搜索其他貼子 gigigo 訪問 gigigo's
 

如果你想回復的話你必須首先 login
如果你還沒有注冊的話你必須首先 注冊

  回復發表新主題
顯示可打印的頁面 顯示可打印的頁面

論壇跳轉
不能 張貼新論題在這個討論版
不能 回應論題在這個討論版
不能 刪除你的發言在這個討論版
不能 編輯你的發言在這個討論版
不能 新增投票標題在這個討論版
不能 在這個討論版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.1855 seconds.

 
保養品
保養品, Skin Care
www.elady.tw
美材批發
美材, Cosmetic
www.elady.tw/beauty_org
保養品批發
名牌保養品、保養品批發
gb.perfume.com.tw/skincare
飾品批發
飾品、飾品批發
gb.perfume.com.tw/ornament