访问数据服务概述

Flex 与其它数据访问技术的比较

Flex 使用数据源和数据的方式与将 HTML 用于用户界面的应用程序是不同的。

客户端处理和服务器端处理

与借助于 JSP 和 servlet、ASP、PHP 或 CFML 创建的 HTML 模板集不同,Flex 区分客户端代码与服务器代码,它将应用程序用户界面编译为二进制 SWF 文件,并发送到客户端。

当应用程序向数据服务发出请求时,不会重新编译 SWF 文件,也无需刷新页面。远程服务仅返回数据,随后 Flex 会将所返回的数据绑定到客户端应用程序中的用户界面组件。

例如,在 Flex 中,当用户在应用程序中单击 Button 控件时,客户端代码会调用 Web 服务。从 Web 服务中获得的结果数据将返回到二进制 SWF 文件中,而无需刷新页面。这样,结果数据即可作为动态内容应用于应用程序。

<?xm l version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768" xmlns:employeesservice="services.employeesservice.*" xmlns:valueObjects="valueObjects.*"> 
 
    <fx:Declarations> 
        <s:WebService 
            id="RestaurantSvc" 
        wsdl="http://examples.adobe.com/flex3app/restaurant_ws/RestaurantWS.xml?wsdl" /> 
        <s:CallResponder id="getRestaurantsResult" 
            result="restaurants = getRestaurantsResult.lastResult as Restaurant"/> 
    </fx:Declarations> 
 
    <fx:Script> 
        <![CDATA[ 
            import mx.controls.Alert; 
 
            protected function b1_clickHandler(event:MouseEvent):void { 
                getRestaurantsResult.token = RestaurantWS.getRestaurantss(); 
            } 
        ]]> 
    </fx:Script> 
. . . 
    <s:Button id="b1" label="GetRestaurants" click="button_clickHandler(event)"/> 
 

将这个 Flex 示例与以下示例进行比较。以下示例显示了一段使用 JSP 自定义标签调用 Web 服务的 JSP 代码。当用户请求 JSP 时,将在服务器(而不是客户端)上发出 Web 服务请求,然后使用结果生成 HTML 页中的内容。应用程序服务器会重新生成整个 HTML 页,然后再将其发回到用户的 Web 浏览器。

<%@ taglib prefix="web" uri="webservicetag" %> 
 
<% String str1="BRL"; 
String str2="USD";%> 
 
<!-- Call the web service. --> 
<web:invoke 
    url="http://www.itfinity.net:8008/soap/exrates/default.asp" 
    namespace="http://www.itfinity.net/soap/exrates/exrates.xsd" 
    operation="GetRate" 
    resulttype="double" 
    result="myresult"> 
    <web:param name="fromCurr" value="<%=str1%>"/> 
    <web:param name="ToCurr" value="<%=str2%>"/> 
</web:invoke> 
 
<!-- Display the web service result. --> 
<%= pageContext.getAttribute("myresult") %>

数据源访问

Flex 与其它 Web 应用程序技术之间的另一个区别是,在 Flex 中,您从不直接与数据源通信,使用数据访问组件可连接远程服务,以及与服务器端数据源交互。

以下示例显示直接访问数据源的 ColdFusion 页面:

... 
<CFQUERY DATASOURCE="Dsn" 
    NAME="myQuery"> 
    SELECT * FROM table 
</CFQUERY> 
...

要在 Flex 中获得类似的功能,可使用 HTTPService、Web 服务或者 RemoteObject 组件来调用从数据源返回结果的服务器端对象。

事件、服务调用和数据绑定

Flex 是一种事件驱动型技术,通过用户操作或程序事件,可触发对服务的访问。例如,用户单击按钮就是一个可以触发服务调用的用户操作事件。程序事件的一个示例是,当应用程序创建完用户界面组件(如 DataGrid)后,可以使用 DataGrid 的 creationComplete 事件调用远程服务以填充 DataGrid。

Flex 中的服务调用是异步的。客户端应用程序无需等待数据返回。在检索或更新大型数据集时,异步服务调用很有用。因为在等待检索或更新数据时,不会阻止客户端应用程序。

从服务调用返回的数据存储在与服务调用相关联的 CallResponder 中。用户界面组件随后使用数据绑定功能从 CallResponder 检索返回的数据。

使用 Flex 中的数据绑定功能,可以使用数据源动态更新用户界面组件。例如,Flex 组件可以将其 text 属性与 CallResponder 的 lastResult 属性相关联。CallResponder 中的数据改变时,Flex 组件会自动更新。

Flex 还可以实现双向数据绑定。借助双向数据绑定,无论是 Flex 组件还是数据源中的数据发生变化,相应的数据源或 Flex 组件都会自动更新。在将用户输入的远程数据更新到 Form 组件或 Flex 数据组件时,双向数据绑定非常有用。

使用 Flash Builder 访问数据服务

在 Flex Builder 3 中,可使用 Flex 数据访问组件来实现对数据服务的远程过程调用。但 Flash Builder 将此过程进行了简化。

Flash Builder 提供的各种向导和其它工具可以:

  • 帮助访问数据服务

  • 配置数据服务返回的数据

  • 协助对从服务返回的数据进行分页

  • 协助数据管理功能(该功能使服务器数据的多个更新同步)

  • 生成用于访问数据服务的客户端代码

  • 将从服务返回的数据绑定到用户界面组件

使用 Flash Builder 访问服务工作流

可以按照下述工作流,使用 Flash Builder 创建用于访问数据服务的应用程序。

  1. 您可以先连接数据服务,也可以先构建用户界面,具体取决于您的环境。

    连接远程服务。如果先连接了远程服务,则随后再构建用户界面。

    构建用户界面。如果先构建了用户界面,则随后再连接远程服务。

    注: 可以根据个人喜好决定先执行哪个操作。例如,如果您已经规划了一个用户界面设计,则可以先构建用户界面。否则,您可以先连接数据,然后借助 Flash Builder 生成应用程序组件。
  2. 将数据操作绑定到应用程序组件。

    Flash Builder 提供多种方法来帮助您将数据操作绑定到应用程序组件。使用 Flash Builder,可以执行下列操作:

    • 针对服务操作返回的数据,生成各种表单。

    • 选择要绑定到用户界面组件的服务操作。

    • 生成表单,用于表示服务返回的复杂数据。

  3. (可选)管理数据检索和更新。

    使用 Flash Builder 工具,可以实现对返回数据的分页,并协调对多组数据的更新。

    在返回大量数据记录时,通常需要执行分页,以便“按需”检索记录集。

    对于更新多个记录的应用程序,可以执行数据管理功能。数据管理功能包括:

    • 提交功能,用于同时更新更改的记录

    • 撤消机制,用于在将所做的更改写入到服务器之前还原所做的更改

    • 代码生成,用于在添加、删除或更改记录时自动更新用户界面组件

  4. 运行应用程序并监视数据流。

    在应用程序完成之后,请运行该应用程序,以便查看其运行过程。使用 Flash Builder 网络监视器查看在应用程序和服务之间传递的数据。网络监视器对于诊断错误和分析性能非常有用。

    Flash Builder 还提供了可靠的调试和概要分析环境。网络监视器和 Flash 概要分析器在 Flash Builder Premium 中提供。

扩展 Flash Builder 支持的服务

Flash Builder 向导和工具支持访问的服务实现类型如下:

  • PHP 服务

  • ColdFusion 服务

  • BlazeDS

  • LiveCycle Data Services

  • HTTP(REST 样式)服务

  • Web 服务 (SOAP)

  • 静态 XML 文件

如果需要对其它服务类型(如 Ruby on Rails)的工具支持,则可以扩展 Flash Builder 实现。请参阅 Flash Builder 可扩展性参考

数据访问组件

通过数据访问组件,客户端应用程序可以通过网络调用操作和服务。数据访问组件使用远程过程调用与服务器环境进行交互。数据访问组件有以下三种:RemoteObject 组件、HTTPService 组件和 WebService 组件。

数据访问组件是针对客户端应用程序设计的,其中的调用和响应模型是访问外部数据的最佳选择。通过这些组件,客户端可以对处理请求的远程服务发出异步请求,然后将数据返回到应用程序。

数据访问组件调用远程服务。随后将从服务获得的响应数据存储到 ActionScript 对象中,或存储为服务返回的任何其它格式。在客户端应用程序中使用数据访问组件可处理以下三种服务类型:

  • 远程对象服务 (RemoteObject)

  • Web 服务 (WebService)

  • HTTP 服务 (HTTPService)

Adobe® Flash® Builder™ 提供了各种向导和工具,用于将数据访问组件的实现包装到服务包装器中。服务包装器封装数据访问组件的功能,为您针对许多低级别实现提供保护。从而您可以更专注于实现服务以及构建用于访问该服务的客户端应用程序。有关使用 Flash Builder 访问数据服务的更多信息,请参阅使用 Flash Builder 构建以数据为中心的应用程序

提供对服务的访问

默认情况下,Adobe Flash Player 会阻止对加载应用程序所用主机以外的任何其它主机进行访问。如果未使用 Adobe LiveCycle® Data Services 代理请求,则 HTTP 服务或 Web 服务必须位于承载应用程序的服务器上,或者承载 HTTP 服务或 Web 服务的远程服务器必须定义 crossdomain.xml 文件。通过 crossdomain.xml 文件,服务器可以指示特定域或所有域中提供的 SWF 文件是否可以使用其数据和文档。crossdomain.xml 文件必须位于应用程序正在连接的服务器的 Web 根文件夹下。

HTTPService 组件

在客户端应用程序中,可以使用 HTTPService 组件发送 HTTP GET 或 POST 请求,以及包含从 HTTP 响应获得的数据。如果使用 Flex 来构建桌面应用程序(在 Adobe AIR® 中运行),则支持 HTTP PUT 和 DELETE。

如果使用 Adobe LiveCycle Data Services 或 BlazeDS,则可以使用 HTTPProxyService,通过它来使用其它 HTTP 方法。通过 HTTPProxyService,可以发送 GET、POST、HEAD、OPTIONS、PUT、TRACE 或 DELETE 请求。

HTTP 服务可以是接受 HTTP 请求并发送响应的任何 HTTP URI。此服务类型通常又称为 REST 样式的 Web 服务。REST 表示代表性状态传输 (Representational State Transfer),是一种针对分布式超媒体系统的体系结构样式。

无法公开与 SOAP Web 服务或远程对象服务相同的功能时,使用 HTTPService 组件是最佳选择。例如,可以使用 HTTPService 组件与未以 Web 服务或远程服务目标形式提供的 JavaServer Pages (JSP)、Servlet 和 ASP 页进行交互。

调用 HTTPService 对象的 send() 方法时,该方法将对指定的 URI 发出 HTTP 请求,并返回 HTTP 响应。可以选择将参数传递给指定的 URI。

Flash Builder 提供了用于以交互方式连接 HTTP 服务的工作流。有关更多信息,请参阅访问 HTTP 服务

WebService 组件

WebService 组件用于访问 SOAP Web 服务,此类服务是带有方法的软件模块。Web 服务方法通常称为“操作”。Web 服务接口通过 Web 服务描述语言 (WSDL) 进行定义。通过 Web 服务提供的标准相容方式,在不同平台上运行的软件模块可以相互交互。有关 Web 服务的详细信息,请访问万维网联合会网站的 Web 服务部分,网址为 www.w3.org/2002/ws/

客户端应用程序可以与在 Web 服务描述语言 (WSDL) 文档(以 URL 形式提供)中定义其接口的 Web 服务进行交互。WSDL 是一种标准格式,用于描述能够由 Web 服务理解的消息、Web 服务对于这些消息的响应格式、Web 服务支持的协议以及将这些消息发送到何处。

Flex 支持 WSDL 1.1,有关说明,请访问 www.w3.org/TR/wsdl。Flex 支持 RPC-encoded 和 document-literal Web 服务。

Flex 支持格式设置为 SOAP 消息且通过 HTTP 传输的 Web 服务请求和结果。SOAP 提供基于 XML 格式的定义,用于在 Web 服务客户端(如使用 Flex 构建的应用程序)和 Web 服务之间交换结构化和类型化信息。

如果在您的环境中 Web 服务是公认标准,则可以使用 WebService 组件连接 SOAP 相容的 Web 服务。对于企业环境中的对象,WebService 组件也很有用,但无需在 Web 应用程序的源路径上提供。

Flash Builder 提供了用于以交互方式连接 Web 服务的工作流。有关更多信息,请参阅访问 Web 服务

RemoteObject 组件

与 REST 样式服务或 Web 服务一样,使用远程对象服务可以直接以本机格式访问业务逻辑,而无需转化为 XML 格式,从而节约将现有逻辑公开为 XML 所需的时间。远程对象服务的另一个好处是通过有线网络进行通信的速度较快。虽然数据交换仍通过 HTTP 或 HTTPS 进行,但数据自身会序列化为二进制表示形式。使用 RemoteObject 组件将减少通过有线网络传输的数据量,降低客户端内存使用率,从而缩短处理时间。

在访问服务器上的数据时,ColdFusion、PHP、BlazeDS 和 Adobe LiveCycle Data Services 可以使用服务器端类型化。客户端应用程序可直接通过远程调用指定对象上的方法,来访问 Java 对象、ColdFusion 组件(本质上是一个 Java 对象)或 PHP 类。服务器上的对象使用本机数据类型作为参数,使用这些参数查询数据库,并返回属于其本机数据类型的值。

当服务器端类型化不可用时,可以使用 Flash Builder 提供的工具实现客户端类型化。使用 Flash Builder 可配置和定义从服务返回的数据的类型。通过客户端类型化,客户端应用程序可以查询数据库,并检索已正确类型化的数据。对于任何未定义服务返回的数据类型的服务来说,客户端类型化是必需的。

Flash Builder 提供了用于以交互方式连接远程对象服务的工作流。有关更多信息,请参阅连接数据服务