![]() |
|
remote script文档
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
广告招租,e-mail:yesize@hotmail.com
复杂的 Web 应用程序既调用客户脚本又调用服务器脚本。客户脚本经常用于对应用程序的用户接口进行编程──例如,为了动态改变 Web 页文本,对用户动作,比如双击作出反应,并执行诸如验证这样的面向客户的任务。客户脚本在浏览器中局部执行,这样就向用户提供了一种生动的、反应迅速的接口。 对比来说,服务器脚本是用来对某个应用程序的末段编程的。这经常引起对某个数据库的存取动作,或者执行中间层业务逻辑。服务器脚本也用于创建较大范围的应用程序:也就是可能通过多种不同类型的浏览器(每个都有不同存取能力)进行存取的应用程序。 但是客户和服务器脚本是互斥的。当某个页首次请求时,服务器可能运行服务器脚本,并将页传递给浏览器,然后浏览器就可以运行客户脚本。不过,如果该页上的服务器脚本有必要再次运行的话,那么必须将该页提交回服务器,服务器可以有效地重新运行该页。对页面上控件状态和脚本中值的维护可能涉及到在浏览器和服务器之间来回传递信息的一个复杂的 scripting 过程。另外,客户和服务器之间的折返过程涉及到显示某个应用程序的重载过程。 一种折衷方案是 remote scripting。Remote scripting 使得用户可以在客户脚本中工作,但要调用某个 ASP 页中的方法(函数或者例程)。实际上,用户可以象调用本地例程那样调用服务器脚本,不过它们仍然运行在服务器上,并具有对服务器能力的所有存取权限。由于用户从不把当前页留作调用服务器脚本之用,因此页的状态仍然保持。 用户可以在下列任务中使用 remote scripting: 当用户继续和某个数据输入表单交互作用时,服务器上的数据检查和数据验证。 更新来自服务器的页面中的信息而无须刷新屏幕。 Remote scripting 是作为一个函数库来实现的,当用户希望运行某个服务器方法时,用户从客户脚本中调用这些函数。当用户调用某种服务器方法时,请求即被传递到浏览器中异步运行的一个代理过程中(在实现过程中,代理是作为一个 Java applet 来实现的。)该代理过程发送一个请求到包含用户调用方法的 ASP 页的服务器中。 服务器加载 ASP 页,而且该 ASP 页上的一个特殊例程将用户的请求调度到正确函数。如果方法有返回值,那么该值即被发送回代理过程,该过程将之包装为一个对象 ──一个调用对象 ──它包含了返回值以及其他有用信息的属性。 当用户在客户脚本中对服务器方法进行调用时,可以在两种方式中选择其一来完成: 同步 用户脚本调用远程过程,并等待其返回。如果用户在处理之前需要远程过程结果的话,那么就有必要这么做。 异步 用户脚本对某个远程脚本进行调用,然后继续处理。该页保持有效状态,以便于用户处理。如果某个调用要持续较长一段时间,那么就有必要使用异步调用。 Rs.htm 包含了用户在自己的 .htm 文件中初始化 remote scripting、执行远程过程、检查远程调用状态,以及获得方法结果时所要使用的方法。 Rs.asp 包含了用户在 .asp 文件中初始化服务器端的 remote scripting,以及在自己的页中调度到适当函数时所要调用的方法。 Rsproxy.class 包含客户和服务器页之间通信时 applet 的 Java 类文件(对象代码)。 在用户的客户页中,用户引用 Rs.htm,这使得该文件中的方法对于用户服务器脚本来说是有效的。对 Rsproxy applet 的调用就在这些方法中。当用户创建服务器页的时候,用户将服务器端的一个 INCLUDE 语句 ─ 该语句引用 Rs.asp 文件 ─ 包括进去。伴随客户文件中的 Rs.htm,这样做使得所需要的方法在服务器页上成为有效的。 所有文件都必须在服务器上是有效的。用户可以将它们放置到任何合适的地方。不过,对于用户的客户和服务器文件来说,当它们从服务器发出请求时,路径都必须是有效的。缺省的情况是,remote scripting 过程假设这些文件在用户服务器或者工程的虚拟根目录外的一个名为 _ScriptLibrary 的文件夹中是有效的。如果用户不将它们放到那里,那么要特别注意它们的路径,因为在创建客户和服务器页时,用户需要指定之。 Remote Scripting 和安全性 在您能使用 remote scripting 来调用服务器脚本之前,必须将 remote scripting 能力添加到用户的客户页中。使用来自于客户脚本的 remote scripting 所需的例程包含在 Rs.htm 文件中。用户必须将该文件包含到自己的客户页中。另外,用户必须调用一个方法来启动 remote scripting applet。 为了使得 remote scripting 有效 创建一个空的 JavaScript 脚本块──它引用 Rs.htm 文件,如下例所示: 要确保所指定 Rs.htm 文件的路径是正确的。该脚本块可以出现在用户客户页的任何地方,但必须在一个这样的块中──它在用户调用某个远程过程之前执行。 创建第二个 JavaScript 脚本块,并在这个块中调用方法 RSEnableRemoteScripting。缺省的情况是,该方法假定 Rsproxy.class applet 在一个叫做 _ScriptLibrary 的文件夹中,而且刚好在用户服务器或者工程的虚拟根目录的下级目录。如果不是这样的话,那么您必须将路径传递到方法调用中的 Rsproxy.class 文件中。 <BODY> <!-- 这里是 .htm 文件的其余部分 --> 注意 RSEnableRemoteScripting 所创建的 <APPLET> 标记并不出现在您的页面中──即使您在自己的浏览器中查看该页的源程序。 带有有效 remote scripting 的梗概客户页是这样的: <HTML> <主体> 以此方式设置了客户页之后,用户就可以在服务器页上添加调用远程过程的脚本了。有关如何进行的详细信息,请参阅 同步调用 Remote Scripting 方法以及 异步调用 Remote Scripting 方法。关于如何设置服务器页以便于接收 remote scripting 调用的详细信息,请参阅在服务器页中使得 Remote Scripting 有效。 文档: 使 Remote Scripting 在服务器页中有效除了对客户页进行配置以便于调用远程脚本外,您还必须对自己的服务器页进行配置,以便于对它们进行接收。其做法包括下面这些步骤: 包含 remote scripting 服务器库,并对其进行初始化。 编写客户页能调用的函数或者例程。 将自己的函数和例程显露为方法。 包括并初始化 remote scripting 服务器库 创建服务器端引用 Rs.asp 文件的 INCLUDE 语句,如下例所示: 确保为 Rs.asp 文件指定正确路径。INCLUDE 语句可以出现在用户文件的任何位置。 将一个调用插入到RSDispatch方法中,当您从客户脚本调用服务器脚本时,可用该方法找到正确过程。该调用可能看起来如下所示: RSDispatch 调用必须是运行在该页上的第一个服务器脚本。按惯例,典型做法是将其放到文件头部。 在合适的初始化动作中,创建用户将从客户脚本中作为方法调用的函数或者例程。您可以用任何脚本语言书写过程。过程可以接受任意数目的参数,但参数只可以为字符串、数字、日期,或者其他简单数据类型──客户不能将结构化数据(例如,对象或者数组)作为参数。 注意 当您将参数从客户脚本传递到服务器脚本时,它们即被转换为字符串。如果用户期望自己的服务器方法中有不同数据类型,可以在方法脚本内部转换之。 在服务器脚本中创建了过程后,您必须将它们作为方法显露出来。为了达到该目的,您可以创建一个 JavaScript 公共描述对象,并列出用户希望显露的方法。 显露方法 创建一个 public_description 对象,该对象为您的方法指定构造函数。下面的示例命名构造函数为 MyServerMethods: 创建您在 public_description 对象中指定的构造函数。在构造函数内部,指定用户希望显露的方法名,以及它们相应的函数或者例程名。用户所使用的语法取决于用户是在 JavaScript 中还是在 VBScript 中创建自己的方法。可使用下面的语法: 注意 JavaScript 是大小写敏感的,因此用户必须根据约定正确大写。 其中: methodName 将被显露的方法名。 functionName 服务器页中实现 methodName 的函数名。 p1, p2 传递给方法的参数列表──如果有参数的话。仅当该方法在 VBScript 中实现时,才能以这种方式显式地声明参数。参数名在构造函数内必须是一致的,但不需要和用户在方法本身中所使用的参数名匹配。用户不需要显式地声明传递给 JavaScript 中所实现方法的参数。 <% RSDispatch %> <SCRIPT RUNAT=SERVER LANGUAGE="JavaScript"> function squareNumber(numberToSquare){ <SCRIPT RUNAT=SERVER LANGUAGE="VBScript"> 为了使得用 remote scripting 调用 ASP 页上的方法更方便一些,您可以在客户脚本中创建一个包含服务器方法页的对象引用。这使得用户可以使用标准 object.method( ) 语法去调用用户已在自己的服务器页上显露的方法。 将某个 ASP 页作为对象加以引用 在客户脚本中,调用 RSGetASPObject 方法,将您希望作为对象加以引用的 URL 和 ASP 页的名字传递给它。RSGetASPObject 方法返回一个对象引用。用下面的语法: 其中: ASPobj 该对象是用 RSGetASPObject 方法创建的。用户可以在以后对 ASPName.asp 中指定页的引用中使用该对象。 url 您希望调用其方法的服务器页的 URL。 rsMath = RSGetASPObject("../myPages/RSMath.asp") 或者用下面的 VBScript 来创建: set rsMath = RSGetASPObject("../myPages/RSMath.asp") 如果该页包含一个叫 Add 的方法,那么您可以调用使用了诸如下面的 JavaScript 语法的方法,: co = rsMath.Add(number1, number2) 或者用下面的 VBScript 语法: set co = rsMath.Add(number1, number2) 关于如何调用 remote scripting 方法的详细信息,请参阅同步调用 Remote Scripting 方法以及异步调用 Remote Scripting 方法。 文档: 调用 Remote Scripting 方法同步在对某个客户页和某个服务器页上的 remote scripting 进行配置后,您就可以从自己的客户脚本调用该服务器页的方法了。缺省的情况是,当用户调用某个服务器方法时,它被同步执行──您的客户脚本直到服务器方法执行完毕并返回结果后才能停止运行。一般说来,当您在自己的客户脚本中需要服务器方法结果时,则需同步调用服务器方法。 注意 您也可以异步调用服务器方法。有关详细信息,请参阅异步调用 Remote Scripting 方法。 当您调用某个服务器方法时,该方法并不返回单个值。而是创建一个 call object ,它是一个包含了被调用过程的返回和状态信息的对象。最常用的属性是调用对象的 return_value 属性,它包含了远程过程计算或者检查出来的单个值。其他调用对象属性使得用户可以得到更多关于远程过程调用的状态信息。 如果您已经创建了对某个服务器页的对象引用,那么可以用标准 object.method 语法来调用方法。有关创建对象引用的详细信息,请参阅作为对象引用 ASP 页。另外,您也可以在没有任何对象引用时调用 remote scripting 方法。这样做比起使用 object.method 语法来要略微冗余些,但不需要用户首先创建对象引用。 同步调用服务器方法 如果用户创建了对服务器页的对象引用,那么对于使用 JavaScript 的调用,可用第一个语法示例,而对于使用 VBScript 的调用,可用第二种语法示例: VBScript: - 或者 - 如果用户没有创建对象引用,调用 RSExecute 函数。对于使用 JavaScript 的调用,使用第一个语法示例,而对于使用 VBScript 的调用,使用第二种语法示例: VBScript: 其中: callObject 在 remote scripting 调用完成后,将被实例化的调用对象名。您无需在调用 remote script 之前创建该对象;远程脚本调用为您创建之。 ASPObject 您在早期使用 RSGetASPObject 方法可选择地创建的对象引用。有关详细信息,请参阅作为对象引用 ASP 页。 url 包含您想要执行的远程脚本的 ASP 页的 URL。必须已将服务器页配置为使得服务器页中的 Remote Scripting 有效中所描述的那样。服务器页必须在用户从中请求当前客户页的服务器上。 methodName 您想要执行的服务器页上的方法名。 p1, p2, ... methodName中的方法所需要的任何参数。 参数是通过值来传递的。用户可以传递简单的数据类型,比如数值或者文本值,但不能传递结构化数据,比如数组或者对象。 例如,下面按钮 btnAdd 的客户脚本 onclick 处理程序调用服务器方法 add 来累加两个数值。调用 remote scripting 方法会创建一个名为 co 的调用对象。remote scripting 调用的结果从调用对象的 return_value 属性中提取出来,并作为名为 txt3 的文本框值显示出来。 <SCRIPT LANGUAGE="JavaScript" for="btnAdd" event="onclick"> 在无对象引用情况下所产生的同样调用(用 RSExecute )可能如下所示: <SCRIPT LANGUAGE="JavaScript" for="btnAdd" event="onclick"> 有关在产生 remote scripting 调用时,如何检查错误的详细信息,请参阅检查错误。 文档: 调用 Remote Scripting 方法异步Remote scripting 向您提供了异步调用服务器方法的选择 ──当执行服务器方法时,用户的客户脚本继续运行。异步调用 remote scripting 方法使得您可以避免应用程序用户接口速度的减慢,因为您可以在执行服务器脚本的同时继续工作。 注意 如果您的应用程序需要,那么也可以同步调用服务器方法。有关详细信息,请参阅同步调用 Remote Scripting 方法。 异步调用某个 remote script 类似于同步调用。不过,当产生调用时,您要指定多至三个附加参数: 当服务器方法完成处理时,在用户的客户脚本中有一个被调用的 JavaScript callback function 。例如,如果用户的 remote scripting 方法执行一次数据库检查,那么回调函数可能得到远程调用返回的检查值,并在页面上的某个控件中显示之。 一个可选的 JavaScript 错误回调函数──如果异步调用时遇到错误将调用之。 一个可选的上下文参数。这是用户传递给方法并在以后传回用户的数据。它典型地用于帮助您决定在自己的回调函数中正调用什么方法,例如,如果您正在将所有远程脚本调用回传给某个回调函数。 当您产生异步调用时,调用对象作为一个参数传递到回调函数中。这样您就可以在调用脚本中对其进行测试(例如,决定呼叫的状态),或者在回调函数中测试(例如,获得方法的返回值)。 如果您已经创建了对某个服务器页的对象引用,那么您就可以用标准的 object.method 语法来调用方法。有关创建对象引用的详细信息,请参阅作为对象引用 ASP 页。 如何异步调用服务器方法 如果用户已经创建了对服务器页的对象引用,那么可以用下面的语法。由于您必须传递回调函数的函数指针,因此对于异步方法调用来说,您必须用 JavaScript。 - 或者 - 如果您尚未创建对象引用,那么可以调用 RSExecute 函数,所用语法如下: 其中: ASPObject 您先前用 RSGetASPObject 方法创建的对象引用。有关详细信息,请参阅作为对象引用 ASP 页。 callObject 在完成 remote scripting 调用时将被实例化的调用对象名。您无需创建在调用 remote script 之前创建该对象;RSExecute 方法为您创建该对象。 url 包含您想要执行的远程脚本的 ASP 页的 URL。服务器页必须已被配置为使得服务器页中的 Remote Scripting 有效中所描述的那样。服务器页必须在用户从中请求当前客户页的服务器上。 methodName 您想要执行的服务器页上的方法名。 p1, p2, ... methodName 中方法所需要的任何参数。参数是通过值进行传递的。您可以传递简单的数据类型,比如数值或者文本值,但不能传递数组或者对象。 callbackFunction 您的客户脚本中 JavaScript 函数的函数指针,当完成对 remote scripting 方法的调用时将调用该函数。由于用户正在传递的是一个指针,因此不要在引号中包括其名字。在 RSExecute 调用中包括回调函数名意味着您想要异步执行 remote scripting 方法。 errorCallbackFunction 用户的客户脚本中某个可选 JavaScript 函数的函数指针,如果 remote scripting 方法遇到一个错误,将调用该函数。由于您所传递的是一个指针,因此不要在引号中包括其名。关于 remote scripting 中错误的详细信息,请参阅检查错误。 context 您传递给 remote scripting 方法并回传给您的一个可选值。您可以在自己的回调函数中用自己觉得有用的任意方式使用该值。 <SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick"> 使用 RSExecute 而不用对象引用的同样示例如下所示: <SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick"> 函数 showResults 是先前示例的回调函数,可能如下所示: <SCRIPT LANGUAGE="JavaScript"> 在这种情况下,showResults 函数可被用作一般意义上的回调函数,以显示任何运算值。该函数指明用户可能如何使用调用对象的 context 属性(当调用 remote scripting 函数时对之进行初始化),以便于决定如何调用回调函数。 测试异步调用 如何测试某个远程调用的状态 在调用脚本中,获得调用对象的 status 属性值,它可以包含下列值中的任一个: 下面的示例显示了同步调用某个叫做 square 的 remote scripting 方法,然后在页面上的某个文本框中显示调用状态的客户脚本。 <SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick"> 关于错误的详细信息,请参阅检查错误。 控制异步调用 等待调用完成。这将挂起客户脚本处理,直到完成 remote scripting 调用,有效地将异步调用转换为同步调用。如果您在自己的客户脚本中到了异步调用提供所需信息的阶段,那么就可这样做。为了等待,可以调用调用对象的等待方法。 取消调用,若要这样做,可以调用调用对象的取消方法。 文档: 检查错误当您在服务器脚本中用 remote scripting 调用方法时,可能会遇到多种错误,包括语法错误和运行时间错误,以及调用 remote scripting 方法时的错误。remote scripting 调用机制向您提供了获知调用过程中所出现错误信息的途径。 错误处理程序根据您是进行同步或者异步调用稍微有些不一样。如果您在进行同步调用时导致错误,那么 remote scripting 机制将在浏览器中显示一条错误消息。错误文字来自于调用对象的 message 属性。有关详细信息,请参阅如下的“Remote Scripting 调用故障诊断”。 不过,如果您产生导致一个错误的异步调用,那么您可以通过指定一个错误回调函数捕获该错误,该回调函数的调用在很大程度上和普通回调函数有相似之处。 捕获异步调用中产生的错误 您可以指定自己异步 remote scripting 调用中的错误回调函数名。由于您必须传递该回调函数的函数指针,因此对于异步方法调用来说,您必须使用 JavaScript。如果您已经创建了对服务器页的对象引用,那么可以用第一个语法示例。否则可以用第二个语法示例。 callobject = RSExecute(url, methodName, p1, p2[,...], 有关产生对服务器方法异步调用的详细信息,请参阅异步调用 Remote Scripting 方法。 不管您进行同步还是异步调用,都可以得到关于错误条件的信息,方法是测试调用对象的属性。如果用户指定了错误回调函数,那么调用对象就被作为参数传递,就象普通回调函数参数传递一样。特别是下面的属性提供了错误信息: status 如果远程调用失败则包含 -1。 data 包含服务器返回的 XML 格式的粗信息。这是调试的最好信息源,因为它包含了错误消息的完整文本以及服务器生成的其他消息。 message 包含 remote scripting 代理过程生成的错误消息信息(如果有的话)。message 中的错误消息不必要和 data 属性中的一样。例如,如果 ASP 页包含一条语法错误,那么关于该错误的详细消息将出现在 data 属性中,但消息属性将只包含这样一条消息──它指示用户不能调用 ASP 页上的方法。 <SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick"> function showErrors(co){ Remote Scripting 调用故障诊断 在某些情况下,用户不能用 remote scripting 进行任何处理,因为尚未对之进行正确的初始化。下表列出了典型的初始化错误及其可能的出错缘由。 症状 可能错因 如果错误位于包含远程调用方法的 ASP 页中,或者如果错误出现在对某个远程方法的调用过程中,那么用户可以在某个错误回调函数中捕获该错误,而且用户可以从调用对象的 data 和 message 属性中获得关于错误的信息。 下表列出了用户可以用错误回调函数捕获的典型问题以及 message 和 data 属性中的值。在多数情况下,message 属性返回一般性信息,而 data 属性则包含关于错误的详细信息。 注意 数据属性包含一定数目的 XML 标记以及和调用有关的其他信息。下表列出了出现在属性值中的一个字符串。 问题 消息值 数据值 当您调用一个服务器方法时,该方法不返回单个值。而是创建一个调用对象,该对象包含被调用过程的返回值和状态信息。下表列出了调用对象的属性。 属性 描述 调用的唯一标识号,它是首次调用时产生的。 方法的返回值──如果有的话。 产生 remote scripting 调用时,服务器返回的粗数据,是以 XML 标记封装的。有关详细信息,请参阅检查错误。 指示方法调用当前状态的值。可能值包括: 有关详细信息,请参阅异步调用 Remote Scripting 方法。 message 和调用有关的文本信息。如果调用成功,那么 message 包含值“完成”。如果失败,那么 message 可能包含服务器返回的错误文本或者一条标准错误消息。有关详细信息,请参阅检查错误。 callback 调用中指定的可选回调函数文本。 调用中指定的可选错误回调函数文本。 随调用传递的上下文值。有关详细信息,请参阅异步调用 Remote Scripting 方法。 下表列出了您能为调用对象调用的方法。 方法 描述 关于调用对象的详细信息,请参阅同步调用 Remote Scripting 方法和异步调用 Remote Scripting 方法。 文档: 等待方法终止当前正执行的客户脚本,直到指定调用对象的异步 remote scripting 调用完成。 语法 co.wait() 参数 co 说明 调用该方法将把一个异步 remote scripting 调用转换为同步调用。如果 remote scripting 调用已完成,那么该方法将立即返回。如果您在客户脚本中遇到这种情况──需要来自 remote scripting 调用的结果,那么这种调用是有用的。 示例 下面的脚本异步调用 EmpLists 页上的方法 GetNames。当发出调用后,它显示一条消息,然后等待结果。 <SCRIPT LANGUAGE="JavaScript" FOR="btnReport" EVENT="onclick"> 文档: 取消方法 停止某个正异步执行的 remote scripting 调用。 语法 co.cancel() 参数 co 您可以在异步调用 remote scripting 过程中调用该方法──如果您决定不再需要异步调用结果的话。如果某个用户动作──比如单击按钮或者请求漫游到另一页──指示 remote scripting 调用已经无效的话,那么这种调用是有用的。 您不能取消同步 remote scripting 调用。 示例 <SCRIPT LANGUAGE="JavaScript" FOR="btnReport" EVENT="onclick"> <SCRIPT LANGUAGE="JavaScript" FOR="btnCancel" EVENT="onclick">
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||