关于超想
本站导航
邮件列表
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> asp ->详细
相关内容  
 
 
在Delphi程序中应用IE浏览器控件
DELPHI 中动态链接库的使用
利用Hook技术实现键盘监控
Delphi下汉字输入法的编程及使用
在Delphi中用拼音首字符序列来实现检索功能
在DELPHI中处理时间
Delphi 元件撰写常问问题
任意动态改变/添加网络设置中的 TCP/IP 的 DNS 地址
Delphi 3中Cookie的建立使用
Delphi4.0 开发WEBMAIL程序
用DELPHI制作留言板
 
【新品推荐】

  详细内容
 

Web开发中远程脚本的应用
作者: 评价: 上站日期: 2001-09-04
内容说明:
来源:

  
  复杂的Web开发几乎都用到服务器端脚本和客户端脚本。服务器端脚本运行在服务器,通常执行数据库查询和中间层的商业逻辑;客户端脚本运行在浏览器,通常对客户的操作做出实时的反应,如输入验证等。但是,客户端与服务器端的脚本是分离的,当页面第一次被调用时,服务器端脚本被调用,并将执行结果作为普通的HTML页面传到浏览器,然后这个页面中的客户端页面可以被执行,但是如果要再次访问服务器端脚本,只有调用另一个包含脚本程序的HTML文件,这就需要将参数传到服务器端,而且,如果需要的话,还必须在服务器端执行完毕后再将结果传回。在这个来回过程中,需要复杂的URL和查询字符串构造,以及页面状态的保存(比如,用户已经键入的内容),非常繁琐。
   微软公司在IIS 4.0 中推出了远程脚本以解决这个问题。所谓远程脚本,就是在一个.asp文件中定义一些函数,并将其外显以供调用。而在其它页面中的客户端脚本,可以通过一个代理程序同步或异步地调用这些函数,而无需离开当前页面。由于无需离开当前的页面,也就无需保存客户端的状态。
   下面结合一个实例说明如何应用远程脚本。 我们用到的两个数据表为: 省: State: StateID 省份代码 StateName 省份名称 和 城市 City: StateID 所属省份代码 CityID 城市代码 CityName 城市名称
   我们设计这样一个用户登记页面register.asp,除了要求用户填写姓名,年龄等基本信息外,还要求用户从一个省份列表中选择其所在的省,并在一个城市列表中选择其所在的城市。通过服务器端脚本,我们不难从数据库中选出所有的省份和城市名称填入两个列表框中;但当用户从省份列表中选择了一个省后,我们当然希望城市列表中只显示属于这个省的城市。虽然我们可以采取将所有城市的省份代码,城市代码,城市名称一次性传到客户端,当用户选择了某个省再逐一比较的办法,但考虑到城市非常多,会使得相应的客户端程序非常长,从而造成页面下载时间极长,因此这种方案只适合传输速度快的Intranet中,在真正的Internet网站中是不可取的. 
  正确的方法是将省份代码作为参数传递给在另一个文件city.asp中定义的服务器端函数GetCityList(), 此函数返回相应的城市和城市代码列表,再根据返回值更新城市列表框。
   下面是部分程序源码:( 在程序中的标号只是为了说明方便,实际编程是不需要的) 
 <  !--register.asp // > 
 <  HTML > 
 <  HEAD > 
 <  TITLE > 
Customer Register<  /TITLE > 
 <  /HEAD > 
 <  %set conn=server.createobject("ADODB.Connection") conn.open "dsn=dsnname;uid=username;password=pwd" set state=conn.execute ("select stateid,statename from state") % > 
 <  BODY > 
 <  form name="register" method="post" action="do_register.asp" > 
 <  !--HTML code for user input name, address, etc // > 
 <  P > 
您所在的省:<  select name= "state" onchange=" p=this.options[this.selectedIndex].value; 10: var c=RSExecute("city.asp","GetCityList",p); 20: citylist=c.return_value; 30: for (i=register.city.options.length-1;i > 
=0;i--) register.city.options[i]=null; 40: register.city.options[0]=new Option('选择城市',0); 50: start=0; 60: i=1; 70: while(start<  citylist.length){ 80: semicolon=citylist.indexOf(';',start); 90: cid=citylist.substring(start,semicolon); 100: fullstop=citylist.indexOf('.',semicolon); 110: name=citylist.substring(semicolon+1,fullstop); 120: register.city.options[i]=new Option(name); 130: register.city.options[i].value=cid; 140: i=i+1; 150: start=fullstop+1; } 160:register.city.selectedIndex=0;" > 
 <  Option > 
选择省份<  /Option > 
 <  %do while not state.eof% > 
 <  Option value="<  %=state("stateid")% > 
" > 
<  %= state("statename")% > 
<  /option > 
 <  %state.movenext loop state.close set state=nothing conn.close set conn=nothing% > 
<  /select > 
<  /P > 
 <  P > 
地区<  select name="city" size="1" > 
 <  option selected value="0" > 
选择城市<  /option > 
 <  /select > 
<  /P > 
 <  p > 
<  input name="Post" type="submit" value="提交" > 
<  /p > 
 <  /form > 
 200:<  script language="JavaScript" src="_ScriptLibrary/rs.htm" > 
<  /script > 
 210:<  script language="JavaScript" > 
 RSEnableRemoteScripting("_ScriptLibrary");<  /script > 
 <  /body > 
 <  /html > 
   首先解释以下第200和210两句。这两句初始化远程脚本模式,其中_ScriptLibrary是register.asp所在目录的一个子目录,该目录中至少应包含rs.htm,rs.asp, rsproxy.class三个文件,如果你用Visual InterDev6 开发, 它会自动产生这个目录。   需注意的是在微软公司的文档和例子中,这两句都是紧跟<  body > 
标记的后面,如果用IE浏览这个页面,也不会有问题,但如果用Netscape Navigator浏览,则有时会产生Java小程序找不到的错误,把它挪到<  /body > 
标记的前面就不会有问题了。   第10句是关键,其中RSExecute是rs.htm中定义的函数,它的参数如下(ServerURL, Function Name,Parameter1,Parameter2,…),在本例中,city.asp是定义远程脚本函数的文件名,GetCityList是远程脚本函数名,它接受一个省份代码作为参数。RSExecute函数的返回值并不是GetCityList函数的返回值,而是一个对象c,真正的GetCityList 返回值存在c.return_value中。如果函数执行过程中产生错误,则c.status= -1 且错误信息存于c.message中。   第30句清空city列表框,第50到第160句根据返回的城市列表填充city列表框。城市列表以以下格式存储:id1;city1.id2;city2. …idn;cityn . 即城市之间用句号(.)分开,城市的代码和名称用分号(;)分开。   下面再看以下city.asp 的源码。 <  %@ Language=VBScript % > 
 10:<  % RSDispatch % > 
 20:<  SCRIPT RUNAT=SERVER LANGUAGE="JavaScript" > 
 21: <  !--#INCLUDE FILE="_ScriptLibrary/rs.asp"-- > 
 22: var public_description = new MyServerMethods(); 23: function MyServerMethods() { 24: this.GetCityList = Function( 'StateID',,' return GetCityList(StateID)' ); } 25:<  /Script > 
 <  script language="vbscript" runat="server" > 
 function GetCityList(StateID) set conn=server.CreateObject ("ADODB.Connection") conn.Open application("DSN_C") set rs=conn.Execute ("select cityid,cityname from city StateID=" & StateID) dim c c="" do while not rs.eof c=c & rs("id") & ";" & rs("name") & "." rs.movenext loop GetCityList=c rs.close conn.Close set rs=nothing set conn=nothing end function <  /script > 
   第10句RSDispatch函数首先初始化服务器段远程脚本,第21到第25句声明(外显)一个服务器端函数GetCityList,使得这个函数可以被客户端的函数调用。在本例中,这个函数是用VBScript函数写的,它的声明格式是:
    this.FunctionName1=Function('parameter1','parameter2',…,'return FunctionName2(parameter1,parameter2,…)');如果这个函数是用JavaScript编写的,则声明格式是:this.FunctionName1=FunctionName2
     其中FunctionName1是供外部调用的函数名,FunctionName2是实际定义的函数名,二者可以相同也可以不同。
      后面的用VBScript编写的函数GetCityList完成实际的检索数据库并生成结果字符串的工作,相信读者可以看懂。只是需注意的是,远程脚本函数的参数类型永远是字符串,而无论客户端的调用是何类型,因此在服务器端需要作必要的类型转换,同时它只能返回简单数据类型,而不能是数组或其他自定义类型。   以上的例子采用了最简单的同步调用方式,即客户端发起函数调用,然后等待函数执行结束;如果需要,还可以采用异步调用方式,即发起调用是指定一个回叫函数,然后继续下面的处理,当远程函数执行完毕回叫函数被激活,并根据返回值进行后续处理。在这里不再详细说明,您可以到微软公司的站点 http://www.microsoft.com/china/scripting 上下载关于远程脚本完整的文档和例子。 深入讨论:
    以上的例子在IE浏览器上可以正确运行,如果数据库中的数据是英文,在Navigator中也可以运行,但如果数据是中文,则在Navigator中会报错。因为在Navigator中,所有的字符串是以ANSI编码的,而服务器端的函数返回的字符串是以Unicode编码的,因此Navigator在试图拆分返回的字符串时就会报错。
     解决方法是:把用户的浏览器的名字作为参数传给GetCityList函数,在函数内部,如果判断客户端的浏览器是Navigator,则利用VBScript的函数ASC和Hex,将中文的城市名称转化成十六进制代码(每个汉字对应4位十六进制数),而在客户端,在每两位十六进制的前面加上字符'%',最后调用JavaScript函数unescape就可得到中文的城市名称 。 
 

 
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> asp ->详细
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
声明:本站内容除注明原创以外均从网上摘抄,如有侵权请指明。
  如果您对我们的网站有什么意见或者建议,请与我们联系
powered by 建站易上手- V2.0