标题标题  显示论坛会员列表名单  搜索论坛搜索  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.2031 seconds.

 
保养品
保养品, Skin Care
www.elady.tw
美材批发
美材, Cosmetic
www.elady.tw/beauty_org
保养品批发
名牌保养品、保养品批发
gb.perfume.com.tw/skincare
饰品批发
饰品、饰品批发
gb.perfume.com.tw/ornament