来源:www.yesky.com
转贴-如何在不刷新页面的情况下调用远程ASP (2000.03.30)
RS技术的一个具体例子 在前面的帖子中,我介绍了RS的基本工作原理,显然如果将RS技术运用在一 个网站的设计中将会有很多非凡的作用(尤其是它的那个最大的优点,可以在不刷 新页面的情况下调用服务端的代码)。正是因为这个特点,你就可以象在编写一个 传统的C/S模式的程序一样,对数据库的数据进行处理了(我想大家一定很想知道 具体应该如何来实现了,下面将给出一个具体的例子,调试这个破程序几乎快把 我给累死,呵呵。)
从前面的描述可以看到,要使用RS技术就需要客户端和服务端满足下面两个 条件: 1。客户端只需要支持Java applet即可 2。而服务端只需要支持ASP即可 换句话说,就是RS技术是完全独立与浏览器的(当然浏览器至少需要满足支持Ja va 和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中没有使用到subm it 所以如果你在该页面中直接敲回车键的话什么都不会出现,你必须通过鼠标单击
那个"获取信息"按扭来使用这个局部页面刷新技术。在单击完该按扭后,页面会 有 一段小小的延迟(这段时间内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> ======================================================================================================================================= 转贴-关于资料上传的问题 (2000.03.29)
关于资料上传的问题
需要一服务器端控件,如SAFileUP(http://www.serverpages.com/upload )等,
也可以自己用VB写: 编写Web方式上载文件的ASP组件
---- 基于Web方式上载文件,要遵从RFC1867标准。但IIS没有提供这方面的支持 。虽然可以从Internet上下载这方面的ASP组件,但大多都是试用版,有使用时间 的限制;并且,功能上也不能完全满足自己的要求。我们可以编写自己的ASP组件 ,使之适合自己的应用系统的需求。
---- 我们假设有如下的一个上载文件的.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标准,demo.htm传到服务器端的二进制数据具有类似的如下格
式:
-----------------------------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”出现在定界符后的"name=”标记处;对text1而言,"name=”标 记后紧接两对回车换行符(chr(13)&chr(10)&chr(13)&chr(10))即是客户端输入 的值,该值结束时跟一对回车换行符和一个定界符;对file1而言,"name=”标 记后的"filename=” 标记指出了客户端上载的文件的路径和文件名,下一行指 出了文件的类型,后跟两对回车换行符表示文件数据的开始,文件数据结束时跟 一对回车换行符和一个定界符。
---- 下面,我们以VB6.0中文版环境为例,讲述如何编写上载文件的ASP组件:
---- 1. 进入VB时,选择工程类型为ActiveX DLL。
---- 2. 在工程窗口中选择工程,在属性窗口中给工程重命名,如"Huang”;
在工程窗口中选择类模块"Class1”, 在属性窗口中将其重命名,如"Upload File”,并且,将Instancing属性设置为"5-MultiUse”。 ---- 3. 选择VB菜单"工程—— >引用—— >Microsoft Active Server Pages Object Library”,单击"确定”。
---- 4. 编写类模块,代码 Zip 2KB
---- 对存入文件的目标目录,要有写入的权限。
---- 对OnStartPage过程的说明:当客户请求一个基于ASP的Web文件时,Web 服
务器会调用该ASP文件上所有ASP组件的OnStartPage方法。Web开发者可以在OnSt
artPage过程中访问ASP的内建组件。
---- 5.选择"文件—— >生成Huang.DLL”, 生成Huang.DLL。如果VB就在IIS
服务器上,则VB会自动注册该组件;否则,把Huang.DLL拷贝到IIS服务器所在的
Windows NT目录下,运行"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 "选择的文件已经上载到服务器!" obj.SaveTheFile "file1", "c:\test" % > < /BODY > < /HTML > ---- 上述例子在VB6.0中文版和IIS4.0中文版下调试通过。
代码可到:http://www.ccw.com.cn/99/tips/9905/052601-06.zip 下载。
---- 基于Web方式上载文件,要遵从RFC1867标准。但IIS没有提供这方面的支持 。虽然可以从Internet上下载这方面的ASP组件,但大多都是试用版,有使用时间 的限制;并且,功能上也不能完全满足自己的要求。我们可以编写自己的ASP组件 ,使之适合自己的应用系统的需求。
---- 我们假设有如下的一个上载文件的.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标准,demo.htm传到服务器端的二进制数据具有类似的如下格 式:
-----------------------------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”出现在定界符后的"name=”标记处;对text1而言,"name=”标 记后紧接两对回车换行符(chr(13)&chr(10)&chr(13)&chr(10))即是客户端输入 的值,该值结束时跟一对回车换行符和一个定界符;对file1而言,"name=”标 记后的"filename=” 标记指出了客户端上载的文件的路径和文件名,下一行指 出了文件的类型,后跟两对回车换行符表示文件数据的开始,文件数据结束时跟 一对回车换行符和一个定界符。
---- 下面,我们以VB6.0中文版环境为例,讲述如何编写上载文件的ASP组件:
---- 1. 进入VB时,选择工程类型为ActiveX DLL。
---- 2. 在工程窗口中选择工程,在属性窗口中给工程重命名,如"Huang”; 在工程窗口中选择类模块"Class1”, 在属性窗口中将其重命名,如"Upload File”,并且,将Instancing属性设置为"5-MultiUse”。
---- 3. 选择VB菜单"工程—— >引用—— >Microsoft Active Server Pages Object Library”,单击"确定”。
---- 4. 编写类模块,代码 Zip 2KB
---- 对存入文件的目标目录,要有写入的权限。
---- 对OnStartPage过程的说明:当客户请求一个基于ASP的Web文件时,Web 服 务器会调用该ASP文件上所有ASP组件的OnStartPage方法。Web开发者可以在OnSt artPage过程中访问ASP的内建组件。
---- 5.选择"文件—— >生成Huang.DLL”, 生成Huang.DLL。如果VB就在IIS 服务器上,则VB会自动注册该组件;否则,把Huang.DLL拷贝到IIS服务器所在的 Windows NT目录下,运行"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 "选择的文件已经上载到服务器!" obj.SaveTheFile "file1", "c:\test" % > < /BODY > < /HTML > ---- 上述例子在VB6.0中文版和IIS4.0中文版下调试通过。
|