以前在開發ASP程式時,根據客戶的要求,不能使用重新整理頁面要對資料進行更新。就使用當時比較新的方法(Microsoft Remote Scripting)。還記得那個 Rs.asp檔案嗎?呵呵,我們來回顧一下老的調用方法:
有三個檔案:
Rs.asp :在伺服器端進行引用,來完成伺服器端的初始化工作
Rs.Htm :其實它是一個JavaScript 腳本檔案,使用完成請求分析資料
Rsproxy.class :是一個Java 小程式,就是通過它來完成用戶端與服務端的通信
-------- 服務端檔案 Server.asp----
<%@ LANGUAGE=VBSCRIPT %>
<!--#include file="_ScriptLibrary/rs.asp"--> //必須要包含這個檔案
<% RSDispatch %> //對 Remote Scripting 進行初始化,必須第一個調用
<SCRIPT Language=JavaScript RUNAT=SERVER>
function Description(){
this.myFunction = myFunction; //暴露myFunction函數
}
public_description = new Description();
function myFunction(strInput, numLength) //在這裡實作這個myFunction 函數
{
var objConn = Server.CreateObject("ADODB.Connection");
objConn.Open("dsn=pubs;uid=sa;pwd=;Network=DBMSSOCN");
var objRS = Server.CreateObject("ADODB.Recordset");
objRS.MaxRecords = numLength;
objRS.Open("SELECT au_lname, au_fname FROM Authors Where (au_lname + ', ' + au_fname) >= '" + strInput + "' ORDER BY au_lname,au_fname", objConn, 0, 3);
var tmpMsg = new String;
tmpMsg.value = "";
while (!objRS.EOF){
tmpMsg.value = tmpMsg.value + objRS("au_lname") + ", " + objRS("au_fname") + ":";
objRS.MoveNext();
}
objConn.Close();
return tmpMsg.value;
</SCRIPT>
--------------用戶端 RSClient.HTM ------
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Servin' It Up with Remote Scripting</TITLE>
<BODY onload="refresh_list()"> //當頁面載入時調用函數 refresh_list()
<SCRIPT Language="JavaScript" src="_ScriptLibrary/rs.htm"> //這是用戶端必須的引入
<H2>Address Book Sample</H2>
<FORM id=form1 name=form1>
<INPUT type="text" size="50" id=Myname name=MyName onkeyup=refresh_list()><br>
<SELECT id=NameList name=NameList size=10>
- One Moment Please -----</SELECT>
</FORM>
<SCRIPT LANGUAGE=javascript>
<!--
RSEnableRemoteScripting(); //初始化用戶端腳本,建立連接配接對象
function refresh_list(){
var serverURL = "server.asp"; //伺服器端檔案
var DisplayLength = 10
document.form1.NameList.length = 0
document.form1.NameList.length = DisplayLength
var inValue = document.form1.MyName.value;
var myVar = RSExecute(serverURL, "myFunction", inValue, DisplayLength);//進行遠端調用
var myArray = myVar.return_value.split(":"); //傳回值隻能是String類型
for (i = 0; i < 10; i++){ //下面對得到的資料進行分析
var myOpt = new Option
myOpt.value = myArray[i];
myOpt.text = myArray[i];
if (i < myArray.length){
document.form1.NameList.options[i] = myOpt;
document.form1.NameList.options[0].selected = true;
//-->
</BODY>
</HTML>
這就是完整的RemoteScripting 的調用過程,不過有兩個非常不好的地方那就是。RS使用的是 HTTP Get方法來進行資料傳送。這樣有了一個2K的資料限止。也就是說你的參數總的長度不能超過2K。還有一個不好是用戶端必須有JVM運作機。在Windows XP 中系統已經不是預設安裝了,是以會出現無法運作的問題。
而下用使用Web Service 就已經很好地解決了這些方面的問題。
在Web Service隻用到了一個Web Service 服務和一個 webservice.htc 檔案
先我們建立一個 Web Service ,利用VS.net 很容易就能完成。
-----------Web 服務 WebServiceTest.asmx------
using System;
using System.Web.Services;
public class Service1 : System.Web.Services.WebService
[WebMethod]
public string HelloWorld()
{
return "Hello World";
-----------用戶端檔案 Client.html---
<Body>
<div id="displayHello"></div>
<div id=service style="BEHAVIOR: url(webservice.htc)"></div> //這是引入JavaScript庫
<script language="JavaScript">
service.useService("WebServiceTest.asmx?WSDL","svrHelloWorld"); //建立svrHelloWorld屬性
//在 WebServiceTest Web 服務上調用 HelloWorld 方法
var iCallID = service.svrHelloWorld.callService(showHelloWorld,"HelloWorld");
function showHelloWorld(result){
//顯示Hello World
displayHello.innerHTML = result.value;
</script>
</Body>
因為Web Service能夠使用HTTP POST方法,那就沒有了2K的限止。因為使用的是XML,支援通過浏覽器通信,是以不需要資料傳送層。當然也可以很容易地通過防火牆。完美的Web 程式就是這樣建立起來的。:)