twzheng's cppblog

『站在风口浪尖紧握住鼠标旋转!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  136 随笔 :: 78 文章 :: 353 评论 :: 0 Trackbacks

摘自:《.NET for Flash动态网站开发手札》   作者:张亚飞   电子工业出版社



17.1  应用Flash Remoting MX构建的Flash影片
应用程序架构

         应用Flash Remoting MX构建Flash影片应用程序和其他“客户端/服务器”应用程序极为相似(包括基于浏览器的网络应用程序,所以我们不时使用“客户端/服务器”这样的术语)。例如,Flash影片应用程序一般位于一个浏览器窗口中,嵌入在一个HTML页内,实际上也是作为HTML页内的一个动态元素。

         另外,Flash影片应用程序中“控件(组件)”可以用来显示文本和图形,用户还可以键入文字信息并和远程服务器进行通信,从这一点上来说非常像HTML页。

         Flash影片应用程序也可以创建服务端方法,请求调用远程服务,服务端方法调用由客户端发起,一般是一个异步事件:Flash影片应用程序请求调用远程服务,远程服务端处理请求,返回结果;作为宿主的Flash Player不会等待这一结果返回,但是当结果返回时会处理该结果。

17.1.1  理解Flash Remoting MX开发环境架构

因为Flash Remoting MX连接两个截然不同、相互独立的运行时环境,所以在使用Flash Remoting MX构建Flash影片应用程序时就必须使用两种开发语言:ActionScript和应用服务器使用的开发语言。因此,使用Flash Remoting MX构建Flash影片应用程序至少要求有两个不同开发环境的知识。

Flash可以用来创建使用Flash Remoting MX的Flash影片应用程序:

l         可以使用Flash来设计用户界面

l         可以使用Flash编写客户端ActionScript脚本代码

应用服务器有很多种,使用的开发语言也很多:ColdFusion使用ColdFusion开发语言;Java就是使用Java语言;.NET则支持的语言很多,包括VB、C#等。开发工具也多种多样,你可以使用文本编辑器也可以选择集成开发环境(IDE)。集成开发环境一般支持相关的程序语言及其API。Dreamweaver是一个不错的IDE,它支持ColdFusion、JSP和ASP.NET。本书主要是使用VB.NET开发的ASP.NET作为应用服务器技术。

因为客户端和服务端环境相互独立,所以在使用Flash Remoting MX构建Flash影片应用程序时,可以把它作为一个工程组。一般而言,一个网络应用程序需要设计人员和开发人员协同工作。设计人员创建用户界面,开发人员编写客户端ActionScript脚本代码和应用服务器逻辑。

在使用Flash Remoting MX构建Flash影片应用程序时,把服务端开发、客户端开发和客户端设计明确地组织起来,定义好各自的角色是非常重要的。从工作分工而言,客户端设计人员创建Flash影片应用程序用户界面,工作包括页面布局、动画、效果等;客户端开发人员编写ActionScript脚本代码连接到远程服务,并处理结果;最后,服务端开发人员在应用服务器上创建业务逻辑作为远程服务。

这是应用Flash Remoting MX技术开发Flash影片应用程序工程的架构设计模式,下面我们就来了解一下Flash Remoting MX的设计模式。


17.1.2  使用Flash Remoting MX设计模式

Flash Remoting MX技术被设计成可以和选定的(现有的)设计模式及框架集成在一起,这正是它的特点,用户也可以由此降低成本。对于Flash影片应用程序和.NET这两个现有的运行框架而言,Flash Remoting MX在中间执行的是一个非常有效率的结构化设计模式。除了可以提高开发效率、减少由于设计方面的欠缺导致的误解外,该模式可以用来强制检查“客户端/服务器”之间的交互,提高应用程序的性能和稳定性。

1.Model-View-Controller设计模式

现今,用户界面向导型的应用程序风靡世界,程序软件开发一般使用Model-View- Controller(MVC)方式,这种方式根据用途组织应用程序代码。在使用Flash Remoting MX构建Flash影片应用程序时,就是使用的这种方式。

MVC程序软件开发方式包含下面的几个元素:

(1)Model。Model(模型)代表应用程序数据和数据的处理,以及其他的逻辑。在一个网络应用程序中,就是应用服务器程序和数据库。

(2)View。View(查看)代表用户界面,一般包含用户控制和信息显示(动态的和静态的)两个元素。

(3)Controller。Controller(控制)代表着处理用户输入,根据输入改变模型然后查看的逻辑。根据应用程序设计的不同,Controller 可以位于客户端也可以位于服务端,或者两者结合起来。为了将网络信息交换减少到最小,充分利用Flash Player运行时,一般应当在Flash影片应用程序中完成Controller。

如图17-1所示揭示了Flash Remoting MX环境应用中的MVC架构。

图17-1  Flash Remoting MX环境应用中的MVC架构

在图17-1中,Flash Remoting MX使得controller和model相互分离,它实际是在Flash影片应用程序和应用服务器(或者Web Service)之间起到一个通信通道的作用。

2.其他的Flash Remoting MX设计模式

除前面介绍的模式外,也有其他的设计模式,主要是为了减少远程服务方法调用,例如value object模式。Flash Remoting MX能从一个远程服务返回结果,并将结果作为一个ActionScript对象。ActionScript对象可以用来打包远程服务数据,仅返回一个对象给Flash影片应用程序,这样就避免了无数的、频繁的单个调用。

为了简化远程服务API以适用于Flash影片应用程序,你可以使用facade设计模式,这种模式在Flash影片应用程序和远程服务之间提供一个缓冲层。facade设计模式规定了一个服务端应用程序经纪人,用来接收Flash影片应用程序远程调用,并传递方法到相应的服务器资源。这就给了你更多的适应性:你可以改变远程服务架构,而不需改变Flash影片应用程序。

如图17-2所示揭示了Flash Remoting MX环境应用中的facade设计模式。

图17-2  Flash Remoting MX环境应用中的facade设计模式

ColdFusion组件、JavaBeans,以及.NET 程序集都可以用做facade。它们都可以接收所有来自Flash影片应用程序的功能请求,并将这些请求分配给相应的应用服务器资源或者根据请求进行网络服务调用,在本书前面的章节已经为您详细地介绍过怎样使用Flash Remoting MX从Flash影片应用程序调用.NET程序集了。


17.1.3  理解Flash Remoting MX for .NET 目录结构

要为应用Flash Remoting MX技术而使用一个ASP.NET应用程序,必须将Flash Remoting MX程序集(FlashGateway.dll)放置在应用程序的本地程序集缓存中(bin目录下),并在应用程序的 web.config文件中注册该程序集。在最简单的ASP.NET表单应用程序中,ASP.NET应用程序的目录结构如图17-3所示。

图17-3  ASP.NET应用程序的目录结构

如图17-3所示,在我们前面介绍的helloWorld例子中,3JK目录中的本地程序集缓存包含有Flash Remoting MX程序集(flashgateway.dll)。要使Flash影片应用程序连接到一个远程服务,必须引用Web根目录下应用程序目录中的物理资源。

Flash Remoting MX自动安装了一个名为gateway.aspx的空ASPX文件,但是你也可以使用应用程序目录中的任何ASPX文件,在这里我们使用了默认的gateway.aspx。

web.config文件包含有flashgateway.dll程序集的注册信息。HttpModule配置模块可以处理对ASP.NET资源的所有Web请求。所以我们要在web.config文件中添加下面的一段配置语句:

<httpModules>

<add name="GatewayController" type=

             "FlashGateway.Controller.GatewayController,flashgateway" />

</httpModules>

如果对服务端方法的请求中包含着AMF信息,Flash Remoting MX就会解释AMF信息并使请求继续下去。

技巧与提示

注意,在安装Flash Remoting MX for .NET时,会在Web根目录下创建一个名为flashremoting的目录。在该目录下,你可以发现一个本地程序集缓存(bin目录),以及一个Samples目录,该目录下存放了Flash影片应用程序的例子。

17.2  深入Flash Remoting MX网关和服务适配器

Flash Remoting MX将进入的请求映射到对应的服务适配器,这就可以直接连接到一个特定的应用服务器。

当一个HTTP请求到达服务器时,它包含了AMF信息,Flash Remoting MX根据名称将该请求映射到对应的服务适配器。要避免名称冲突,可以在ActionScript脚本代码中定义目录结构、充分授权的类名或包名,或者是描述Web服务的WSDL URL地址。


17.2.1  应用Flash Remoting MX for .NET

Flash Remoting MX将ASP.NET技术作为Flash影片应用程序的一个远程服务,因而可以被当作ActionScript的一项功能,这样就能被Flash影片应用程序识别。

能够作为远程服务的Microsoft.NET技术有很多,包括ASP.NET网页、Web服务、程序集方法。Flash开发人员编写ActionScript脚本代码可以使用一个称为NetServices或Service的功能类库连接到一个远程.NET服务器,或者引用一个远程服务,调用远程服务的功能。

为了通过HTTP传输信息, Flash Remoting MX使用一个称为Action Message Format (AMF)的二进制信息格式,它模拟了Web服务执行时使用的Simple Object Access Protocol (SOAP)协议。它允许使用HTTP在Internet上发送各种数据类型,包括记录集和其他的原始数据类型(如整数、字符串、XML文档和日期等)。

Flash Remoting MX网关是ASP.NET运行时的一个前端控件,它处理从ActionScript到.NET Common Language Runtime (CLR)的数据类型转换。在网关收到服务请求之前,该请求必须先通过过滤装置处理串行数据、日志和安全检验,最后到达一个服务适配器,服务适配器被用来处理服务和启动类型。

对于Microsoft.NET技术,Flash Remoting MX包含四个服务适配器:

l         ASP.NET适配器

l         ADO.NET数据绑定适配器

l         Web服务适配器

l         程序集适配器(*.dll)

Flash Remoting MX for .NET要求安装.NET Framework SDK,要检查是否安装了.NET Framework SDK,可打开Windows控制面板,双击“添加/删除应用程序”选项,查看有没有Microsoft.NET Framework SDK。如果没有看到,就要下载一个安装上。(下载地址http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml)

Flash Remoting MX怎样融入Microsoft.NET框架

当Flash影片应用程序和Flash Remoting MX服务器控件被嵌入在ASPX网页中时,使用Flash Remoting MX的Flash影片应用程序就成为 .NET应用程序中客户端内容中的一部分。Flash Remoting MX在 ASP.NET网页和.NET网络表单应用程序中可以用做一个自定义服务器控件,或者也可以在一个.NET 程序集(DLL)文件中用做一个命名空间,还可以用在一个代码隐藏类文件和Web服务中。一个 .NET 程序集(flashgateway.dll)位于ASP.NET应用程序本地程序集缓存中,它提供了Flash Remoting MX的功能。



17.2.2  关于AMF

如果您对生物学非常熟悉的话,有可能知道AMF,它是一种极其罕见的植物名,名为丛枝内生菌根菌,是菌根菌的一种。绝大部分植物都能从阳光中获取赖以生存的食物,但是菌根菌靠吸取寄生植物的劳动果实成活。

在Flash Remoting MX中,AMF正是这样一种事物,只不过它是一种信息编码格式。它本身并不产生信息数据,而是对通过HTTP在Flash影片应用程序和远程服务之间传递的数据进行编码和解码来产生信息数据。

由于AMF是专为ActionScript对象模型设计的信息编码格式,所以对于使用Flash Remoting MX的Flash影片应用程序来说非常高效。

AMF的全称是Action Message Format,它采用二进制格式,专为ActionScript对象模型设计,要从远程服务发送和接收信息,Flash Remoting MX就使用Action Message Format。使用AMF,Flash Remoting MX可以编码和解码通过HTTP在Flash影片应用程序和远程服务之间传递的数据。

AMF符合Simple Object Access Protocol(SOAP)协议格式,它使用信息包格式分段传送信息。一个AMF信息包包含下面5个部分:

l         信息包头,这一部分包含了AMF版本信息

l         上下关系头计数

l         上下关系头配置。上下关系头包含了一个一个独立的AMF信息应当怎样被处理的描述信息

l         信息计数

l         信息配置

在客户端,服务端的方法请求被使用NetServices类或Service类的方法自动序列化为AMF格式;在服务端,Flash Remoting MX逆序列化AMF信息。当服务端处理完成时,结果又被序列化为AMF格式,并发回Flash影片应用程序。服务端创建的AMF信息格式与客户端创建的AMF信息格式相同。单独的AMF信息包主体内,包含了错误或响应对象,它们被表述成一个ActionScript对象。



17.2.3  Flash Remoting MX和数据类型

当应用Flash Remoting MX技术,从Flash影片应用程序向应用服务器发送数据和应用服务器返回数据给Flash影片应用程序时,数据被进行了两次转换:

(1)在客户端的Flash影片应用程序中,在ActionScript数据类型和Action Message Format(AMF)两种数据类型之间转换:发送时从ActionScript数据类型转换成AMF格式;返回的数据从AMF数据格式转换成ActionScript数据类型;

(2)在服务器网关中,是在.NET语言(C#、Visual Basic)数据类型和Action Message Format(AMF)两种数据类型之间转换:向应用服务器发送时从AMF数据格式转换成.NET语言(C#、Visual Basic)数据类型;从应用服务器返回的数据从.NET语言(C#、Visual Basic)数据类型转换成AMF数据格式。

如图17-4所示显示了这两次数据类型的转换。

图17-4  Flash Remoting MX的两次数据类型转换

这两次数据类型转换使得Flash Remoting MX可以不依赖服务器系统的数据编码方法,从而可以非常有效地与各种应用服务器技术相结合,包括Microsoft.NET应用服务器技术。

Flash Remoting MX可以自动识别数据类型并进行相应的数据类型转换。大多数情况下,数据类型转换是非常直接简单的,你只需将ActionScript数据作为参数传递给应用服务器,然后在结果处理方法中处理返回的结果即可。但是也有少数的情况必须考虑数据类型转换,否则,程序会出现不可预知的后果。

下面我们来详细介绍一下.NET语言(Visual Basic)的数据类型和ActionScript数据类型之间转换的对应关系。

1.从ActionScript数据类型向.NET数据类型转换

表17-1列出了ActionScript数据类型和相应的应用程序服务器中支持的数据类型。

表17-1  ActionScript数据类型和相应的VB.NET数据类型

ActionScript数据类型

VB.NET数据类型

Number(简单数据类型)

任何数值数据类型,包括Decimal、Double(双精度浮点型)、Integer和Long(长整型)

boolean(简单数据类型)

Boolean

String(简单数据类型)

String

ActionScript(AS)对象

FlashGateway.IO.ASObject

Object(作为参数被传递到远程服务方法的对象,该对象是由name/value形式构成的)

FlashGateway.IO.ASObject

null

Nothing

undefined

Nothing

Array(索引是连续的数值)

System.Collections.ArrayList

Associative Array(索引是名称标示)

System.Collections.Hashtable

Date

Date

XML

System.Xml.XmlDocument

RecordSet(不能发送)

无对应项

在从ActionScript数据类型向VB.NET数据类型转换时还要注意以下几个重要的问题:

(1)只要是可能,Flash Remoting MX都会把ActionScript Number转换成.NET数值数据类型。但是,如果数值不能转换成相应的应用服务器数据类型(例如,ActionScript数值超出了应用服务器数据类型一个整形数值类型的范围),Flash Remoting MX就会在服务器上抛出一个错误,因此在开发应用程序时要注意应用服务器数据类型的取值范围。

如表17-2所示列出了VB.NET数值数据类型的取值范围。

表17-2  VB.NET数值数据类型的取值范围

Decimal

0 到 +/-79 228 162 514 264 337 593 543 950 335之间不带小数点的数;

0 到 +/-7.922 816 251 426 433 759 354 395 033 5 之间带 28 位小数的数;

最小非零数为+/-0.000 000 000 000 000 000 000 000 000 1 (+/-1E-28)。

Double

(双精度浮点型)

负数取值范围为-1.797 693 134 862 31E+308到 -4.940 656 458 412 47E-324;

正值取值范围为 4.940 656 458 412 47E-324到 1.797 693 134 862 31E+308。

Integer

-2 147 483 648 到 2 147 483 647。

Long(长整型)

-9 223 372 036 854 775 808 到 9 223 372 036 854 775 807。

(2)Flash Remoting MX在处理复合数组(Associative Array)时与对待连续数组不同。有一些ActionScript数组包含了不连续的索引(例如,仅包含索引0,2和3 ,而不包含索引1的数组),有一些ActionScript数组既包含数字又包含字符串,这些数组称为复合数组。Flash Remoting MX在处理复合数组时会将索引值转换成键值,但是当数值作为键值时是字符串类型(例如,"0","1","2")。

2.从.NET数据类型向ActionScript数据类型转换

如表17-3所示列出了应用程序服务器数据类型和相应的ActionScript中支持的数据类型:

表17-3  VB.NET数据类型和相应的ActionScript数据类型

VB.NET数据类型

ActionScript数据类型

Nothing

null

Boolean

Boolean

任何数值数据类型,包括Decimal、Double、Integer和Long

Number

Char String

String

Date

Date

System.Collections.ICollection

object[]

Array

System.Collections.Hashtable

System.Collections.IDictionary

Associative array

Sytem.Data.DataSet

由RecordSet对象组成的复合数组

System.Data.DataTable

RecordSet

FlashGateway.IO.ASObject

System.Exception

Object

FlashGateway.IO.ASObject(定义了Type属性)

Typed Object

System.Xml.XmlDocument

XML

(1)在从应用程序服务器数据类型向ActionScript数据类型转换时的注意事项

①如果应用服务器上的字符串数据表示的是一个数字,那么,在ActionScript中,如果需要的话,Flash将会将该字符串自动转换成数字。

②如果使用setType方法为应用服务器上的flashgateway.io.ASObject对象定义对象类型,并且对象类型名与ActionScript内建的对象类名相同,Flash Remoting MX将会在ActionScript脚本中创建一个该类的实例。

③要返回大量且相互独立的数据给Flash影片应用程序,可以定义一个复杂的应用服务器变量来包含这些数据,例如,一个变量可以转换成一个ActionScript对象,也可以是数组或者复合数组,仅仅返回一个变量,但是在Flash影片应用程序中可以使用该变量中的多个元素。

(2)处理对象

当在远程服务方法调用中传递一个Flash对象时,对象的属性被传递给网关。在.NET环境中,FlashGateway.IO.ASObject类(它执行ICollection接口)的一个实例就相当于一个Flash对象。因此,你可以向任何接受Map或ICollection的方法传递Flash对象。

因为Flash Remoting MX仅仅是传输数据,在服务器上对象方法是不适用的,同样,对象的属性也必须是Flash Remoting MX能够处理的类型。例如,你不能在一个将传递给远程服务方法的对象中包含Flash RecordSet对象,因为Flash Remoting MX不能将RecordSet对象转换成服务器上的一种数据类型。

当从服务器返回一个对象给Flash时,Flash Remoting MX将对象数据属性信息作为Flash对象发送给Flash。在Flash中,你可以将该对象的属性转换成Flash数据类型的。

(3)处理ActionScript typed对象

如果你在ActionScript脚本中使用Object.RegisterClass方法注册一个对象的话,你就创建了一个typed对象。Typed对象在Flash影片应用程序中是非常有用的,它可以用来创建Flash对象的子类。

在对Flash Remoting服务方法的调用中,你可以使用typed对象。

在一个服务方法调用中使用typed对象的一个实例,在服务器端,Flashgateway.IO. ASObject对象代表参数,它包含了对象的type名。

例如,下面的ActionScript脚本创建了一个typed对象,并在一个服务方法中使用该对象:

//创建一个类(也就是类的构造器)

myClass = function()

{

    this.Value1 = "Test1";

}

//注册类

Object.registerClass("testClass", myClass);

//将一个类的实例发送到远程应用服务器Flash Remoting网关

myService.myFunction(new testClass());

应用服务器上的服务方法接收到该请求,参数是一个type对象,在Java和ColdFusion中是flashgateway.io.ASObject,在 .NET环境中是FlashGateway.IO.ASObject。服务方法可以访问该类的type名:testClass(在Java和ColdFusion中使用对象的getType方法,在.NET环境中使用ASType属性)。

当服务方法创建了一个新的typed对象返回Flash Remoting MX时,在Java和ColdFusion中,它实际是创建了一个type flashgateway.io.ASObject对象;在.NET环境中,它实际是创建了一个type FlashGateway.IO.ASObject对象。服务方法使用对象的构造器(在.NET环境中使用ASType属性)为在ActionScript脚本中使用Object.registerClass方法指定的type设置类名。

当Flash客户端从服务方法中接收到typed对象时,Flash运行type的构造器,并粘附该对象所有的prototype方法。



17.3  调用远程服务方法和处理远程服务调用结果

使用Flash Remoting MX调用一个应用服务就像是在调用一个Web服务,或者是在做一个远程过程调用(RPC)。因为,当你对远程服务做一个调用时,你会从该服务获得一个回应。当使用Web服务和RPC时,远程服务上的数据先从其自身数据类型被转换成用于网络传输的数据,这种数据只是一种表示法。

与RPC或者Web服务请求不同,使用Flash Remoting MX进行的调用不直接接收远程服务的结果,而是编写一个结果处理程序来处理返回的数据。由于远程服务调用和结果处理程序是相互独立的,所以远程服务调用和结果处理是异步进行的。也就是说,远程服务请求就像是一个没有返回结果的方法调用,而远程服务请求的结果回应就像是一个Flash事件,你是为该事件编写了一个事件处理方法。

17.3.1  调用远程服务方法

要调用存在于一个服务对象中的方法,可以使用服务对象名,后面跟一个应用服务器方法名,就像下面的一行脚本语句:

weatherSvc.getTemperature("New York");

在本例中,方法getTemperature是位于应用服务器上的一个公共方法或应用程序网页 ,并且该方法也可以传递字符串格式的参数:New York。也可以使用远程服务方法传递多个参数,只需使用“逗号(,)”将参数隔开,例如下面的脚本代码:

weatherSvc.getTemperature("New York", 1998, "average");

在本例中,远程服务方法传递了三个参数:一个城市名(New York)、一个年份值(1998)和一个命令(average)。该方法用来求取1998年New York的平均气温。

注意:远程服务方法中的参数必须按照固定顺序排列。

如果没有在创建Service类实例时定义结果处理方法,那么可以在调用远程服务方法时定义一个Responder(回应)对象,用做结果处理的回应对象;如果在创建Service类实例时已经定义了结果处理方法,那么就不要在调用远程服务方法时再定义Responder对象了。

因此,定义Responder对象时,一般有两种方法:

l         为一个Service类实例的所有方法定义同一个Responder对象

l         为每一个方法定义不同的Responder对象

注意:在使用Connection对象的getService方法时定义了Responder对象后,就不要同时使用远程服务方法定义Responder对象。如果这样做的话,Flash Remoting MX就会将远程服务方法中定义的Responder对象作为一个参数传递给远程服务方法,这样程序就会出问题。

要为一个特定的远程服务方法定义结果处理方法,可以在定义方法的参数时将结果处理方法作为该方法的第一个参数,例如下面的脚本:

weatherSvc.getTemperature( new temperatureResult(), "New York", 1998, "average" );

在该例中,名为temperatureResult的结果处理方法就用来接收和处理返回的调用结果,还包括getTemperature 远程服务方法的出错信息。


17.3.2  定义远程服务方法

为了使用Flash Remoting MX,你必须在应用服务器上为Flash Remoting MX定义应用远程服务方法。根据应用服务器的种类不同,应用远程服务方法也不相同,并且同一种类服务器所能够应用的应用服务器方法名也不相同,在本书中仅介绍在.NET应用服务器上为使用Flash Remoting MX创建应用服务器的方法。

前面我们已经简单地介绍了 .NET应用服务器上可以作为Flash Remoting MX应用服务器方法的Microsoft.NET技术,包括ASP.NET网页、Web服务和程序集方法。

下面,我们再次强调一下,把这三种技术列在表17-4中。

表17-4  可以作为Flash Remoting MX应用服务器方法的Microsoft.NET技术

ASP.NET网页(.aspx)

网络根目录所在的目录

ASP.NET网页

DLL文件(.dll)

充分授权的类名

Public方法

.NET Web服务

命名空间

使用WSDL描述的网络服务器方法



17.3.3  处理远程服务方法调用结果

当应用服务器返回远程服务方法调用的结果时,事件处理方法就会应用返回的数据,或者处理返回的出错信息。

例如,结果处理方法可以在Flash影片应用程序中显示调用结果,而出错处理方法可以在Flash影片应用程序中设置trace方法显示出错信息。

对于使用Service类创建到远程服务的连接并调用远程服务方法的,以及可以使用RelayResponder 构造器直接指定对象和事件处理方法的,你可以直接使用这里定义的对象和事件处理方法处理返回的结果或出错信息。

对于使用NetServices类和Connection类创建到远程服务的连接,并调用远程服务方法的,则有更多的选择,你可以定义结果处理层级。

1.结果处理层级

Flash Remoting MX支持下列事件处理层级:

(1)如果在使用Connection对象的getService方法时定义了Responder对象,那么Flash Remoting MX就会做下列事件:

①如果Responder对象中有一个形如functionName_Result的方法,并且functionName是调用的远程服务方法名,Flash Remoting MX就会将该方法调用的结果返回给与该方法同名的_Result方法。

②如果Responder对象中有一个名为onResult的方法,Flash Remoting MX就会将该方法调用的结果返回给该方法。

(2)如果在调用远程服务方法时定义了Responder对象,那么Flash Remoting MX就会将结果返回给该对象的onResult方法。

注意:在使用Connection对象的getService方法定义了Responder对象后,就不要同时使用远程服务方法定义Responder对象。如果这样做的话,Flash Remoting MX就会将远程服务方法中定义的Responder对象作为一个参数传递给远程服务方法,这样程序就会出问题。

(3)当在Flash创作环境开发阶段测试应用程序时,没有定义一个Responder对象,那么Flash Remoting MX就会在“输出”面板中显示调用结果。

2.结果处理策略

不同的结果处理程序为开发人员提供了各种不同的结果处理策略,开发人员可以使用不同的策略来适应应用程序的需要。

下面我们来详细介绍一下开发过程中要应用的结果处理策略。

(1)使用getService方法定义Responder对象

如果使用gatewayConnection.getService方法定义Responder对象,那么可以应用下面的技术:

①在gatewayConnection.getService方法中定义一个对象(一般是主时间轴this)作为Responder对象,然后在主时间轴中为每一个远程服务方法创建一个单独的_Result处理方法。

一般在满足下列条件时使用该技术:

l         对一个方法调用的_Result方法应与对另一个方法调用的_Result方法不同

l         对于所有远程服务中的所有方法来说,每个一方法都有一个独一无二的方法名。例如,你不能在两个远程服务调用中使用相同名字的方法:myFirstService. myFunction和myOtherService.myFunction,这样就会出问题,因为两个结果需要不同的处理过程

l         在一个远程服务中对一个特定方法的调用可以使用一个Responder对象处理

②在gatewayConnection.getService方法中定义一个对象(一般是主时间轴this)作为Responder对象,然后在主时间轴中创建一个onResult方法处理所有的远程服务方法调用结果。

这种技术只有在对所有远程服务方法的所有请求的结果可以使用一个方式进行处理时才适用。

③使用前两种方法的结合。在gatewayConnection.getService方法中定义一个对象(一般是主时间轴this)作为Responder对象,然后在主时间轴中为一些远程服务方法创建单独的_Result方法,然后为其他的远程服务方法创建一个onResult方法处理这些远程服务方法调用的结果。

一般在满足下列条件时使用该技术:

l         一些远程服务方法的调用结果的处理机制与其他远程服务方法调用结果的处理机制不同

l         处理机制不同的所有远程服务调用中的方法有一个独一无二的方法名

l         一些远程服务方法虽然方法名不同,但其调用结果的处理机制相同

l         对一个特定方法的不同调用,其调用结果可以使用一个Responder对象处理

使用处理层级的例子

下面的例子揭示了怎样使用主时间轴作为Responder对象,并且为一些远程服务方法定义一个onResult结果处理方法,以及为其他的一些远程服务方法定义特定的functionName_Result结果处理方法。

在该例中,有两个方法用于特定的functionName_Result结果处理方法,它们是getTemperature_Result和getForecast_Result(这两个方法用来显示返回的temperature和forecast)。而onResult结果处理方法用来在一个信息文本框中显示结果:

//初始化连接

if (inited == null) {

    inited = true;

    NetServices.setDefaultGatewayURL

               ("http://localhost/flashservices/gateway.aspx");

    gatewayConnection = NetServices.createGatewayConnection();

    //定义主时间轴作为默认的Responder对象

    weatherService = gatewayConnection.getService("flashExamples.weatherStation",

                this);

}

//结果处理方法

function getTemperature_Result(temperature) {

    temperatureIndicator.text = temperature;

}

function getForecast_Result(forecast) {

    forecastIndicator.text = forecast;

}

//默认的回应处理方法

function onResult(result) {

    generalMessageBox.text = result;

}

//调用远程服务方法

weatherService.getTemperature("New York");

weatherService.getForecast("Chicago");

weatherService.getServiceStatus("San Francisco");

weatherService.getUsageStats();

(2)使用远程服务方法定义Responder对象

如果要在调用远程服务方法时定义Responder对象,可以使用下面的技术:

①定义一个Responder对象。使用结果处理方法将结果值赋给一个Responder对象,可以将Responder对象的一个实例作为gatewayConnection.getService方法的一个参数传递给它。

使用这种技术比使用this作为Responder对象更加面向对象,这允许你使用更加结构化的代码。

②定义几个不同的Responder对象。使用结果处理方法将结果值赋给不同的Responder对象,可以将每一个Responder对象的一个实例作为serviceName.functionName调用时的一个参数传递给它。

该技术允许开发人员为特定Responder对象创建方法,在这种情况下,一些service应有相同的方法名,但是返回的数据不同;该技术也允许开发人员为一个远程服务方法创建几个不同的结果处理方法。

③使用上述两种方法的结合。为一些远程服务方法使用多个Responder对象;为另一些远程服务方法使用单独的一个Responder对象。

下面是在远程服务方法调用中为每一方法定义一个result对象的例子,与前面介绍的例子目的基本相同,但是我们在该例的远程服务方法调用中为每一调用定义了回应处理对象。

在该例中,有三个回应处理对象,它们是tempResult、forecastResult和generalResult(这三个回应处理对象分别用来显示返回的temperature、forecast和其他的远程服务方法)。每一个回应处理对象中有一个onResult结果处理方法用来处理远程服务方法调用返回的结果:

//初始化连接

if (inited == null) {

    inited = true;

    NetServices.setDefaultGatewayURL

                 ("http://localhost/flashservices/gateway.aspx");

    gatewayConnection = NetServices.createGatewayConnection();

    //在创建Service类实例时不要定义默认的Responder对象

    weatherService = gatewayConnection.getService

                           ("flashExamples.weatherStation");

}

//Temperature的结果处理对象

function tempResult() {

    this.onResult = function(temperature) {

        temperatureIndicator.text = temperature;

    };

}

//Forecast的结果处理对象

function forecastResult() {

    this.onResult = function(forecast) {

        forecastIndicator.text = forecast;

    };

}

//General的结果处理对象

function generalResult() {

    this.onResult = function(result) {

        generalMessageBox.text = result;

    };

}

//调用远程服务方法,并指定结果处理方法的一个实例作为第一个参数

weatherService.getTemperature(new tempResult(), "New York");

weatherService.getForecast(new forecastResult(), "Chicago");

weatherService.getServiceStatus(new generalResult(), "San Francisco");

weatherService.getUsageStats(new generalResult());


posted on 2007-08-02 10:32 谭文政 阅读(1400) 评论(0)  编辑 收藏 引用 所属分类: Flash ActionScript

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理