關於頁面局部重新整理常式

來源:互聯網
上載者:User
 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="擷取資訊"
       >
</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>


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。