Jeanette Stallons
Java EE Platform 是领先的企业 Web 服务器。Adobe Flash Platform 是富 Internet 应用程序领域的领先者。借助这两件利器,开发人员可以交付以数据为中心、引人注目的应用程序,它们利用了企业后端解决方案和出众用户体验的优势。
在本文中,您将学到使用 Flex 和 Java 构建的应用程序的架构,其中包括:
- 客户端/服务器架构的概述。
- 客户端与服务器的不同通信方式。
- Flash Remoting 的介绍及其使用原因和方式。
- 如何将 Flex 应用程序与安全框架集成在一起。
- 如何使用事件、状态、MXML 组件和模块构建 Flex 应用程序的概述。
您还应当观看视频 Flex 4 和 Java 集成介绍*。
要进一步了解这些应用程序的构建技术,请阅读 Flex 和 Java 应用程序的构建技术一文。
客户端/服务器架构
Flex 和 Java 应用程序使用一个多层架构,其中的应用程序层是 Flex 应用程序,业务或应用程序层是 Java EE 服务器和代码,数据层则是数据库。您可以像普通 Java 应用程序一样编写后端代码、为对象建模、定义数据库、使用 Hibernate 或 EJB 3 等对象关系框架、编写用于查询和操作这些对象的业务逻辑。业务层必须可以从 Flex 应用程序通过 HTTP 进行访问,它将用于移动演示层与数据层之间的数据。
典型的 HTML 应用程序包含多个页面,当用户在页面之间导航时,必须传递应用程序数据,这样应用程序本身(它包含的页面和功能集)可以保持状态。相对而言,Flex 应用程序在本质上有状态。Flex 应用程序嵌入一个 HTML 页面,用户不会离开该页面并且页面由 Flash Player 渲染。Flex 应用程序可以动态更改视图,在后台向服务器异步发送和检索数据,更新应用程序界面,但不会离开该界面(请参阅图 1)(与 XMLHttpRequest API 使用 JavaScript 提供的功能相似)。
图 1.客户端/服务器架构。
客户端/服务器通信
Flex 应用程序可以使用直接套接字连接或更常见的 HTTP 与后端服务器通信。Flex 框架有三个通过 HTTP 与服务器通信的远程过程调用 API:HTTPService、WebService 和 RemoteObject。它们三个包起 Flash Player 的 HTTP 连接性,而后者则使用浏览器的 HTTP 库。Flex 应用程序无法直接连接到远程数据库。
您使用 HTTPService 对 JSP 或 XML 文件、RESTful Web 服务或通过 HTTP 返回文本的其他服务器文件发出 HTTP 请求。您为返回的数据指定端点 URL、listener 函数(当 HTTPService 请求返回成功或失败响应时调用的回调函数)以及数据类型(一旦 Flex 应用程序收到后,应当将它转换为哪种数据结构)。您可以将待处理的数据指定为原始数据文本,分配到 String 变量或转换为 XML、E4X 或传统的 ActionScript 对象。如果回到 JSON,您可以使用 Adobe Flex corelib* 类包将 JSON 对象反序列化为 ActionScript 对象。要对基于 SOAP 的 Web 服务器发出调用,您可以使用 HTTPService API 或更专用的 WebService API,后者会将 SOAP 格式的文本自动序列化和反序列化为 ActionScript 数据类型或反之。
发出远程过程调用的第三个选项是使用 RemoteObject API。它对服务器端 Java 类的方法发出 Flash Remoting 请求,该类通过 HTTP 返回二进制 Action Message Format。尽可能使用 Flash Remoting,它的二进制数据传输格式使应用程序载入数据的速度比 XML、JSON 或 SOAP 等更冗长、基于文本的格式快 10 倍(请参阅图 2)。有关 AMF 与其他基于文本的序列化技术的对比,请参阅 James Ward 的 Census RIA Benchmark 应用程序*。
图 2.Flex 和 Java 的连接方法。
Flash Remoting
Flash Remoting 是客户端和服务器端功能的组合,它们为从 Flash Platform 应用程序访问服务器端对象共同提供了一个调用和响应模型,仿佛它们是本地对象一样。它在 ActionScript 和服务器端数据类型之间提供透明的数据传输、序列化为 Action Message Format (AMF)、反序列化以及客户端与服务器之间的数据编组。
Flash Remoting 使用 Flash Player 中的内建客户端功能和某些服务器中的内建服务器端功能(如 ColdFusion 和 Zend),但必须安装在其他服务器上(例如,BlazeDS* 或 LiveCycle Data Services* 安装在 Java EE 服务器上,WebORB 或 FluorineFX 安装在 .NET 服务器上,Zend Framework 或 amfphp 安装在 PHP 服务器上,等等)。有关 BlazeDS 和 LiveCycle Data Services 的更多详细信息,请参阅 Flex 和 Java 应用程序的构建技术一文。
BlazeDS 和 LiveCycle Data Services 使用基于消息的框架在客户端和服务器之间来回发送数据。它们提供 Remoting、Proxying 和 Messaging 服务,并为 LiveCycle 提供附加的 Data Management 服务。Flex 应用程序向服务器发送请求,请求将传递到服务器上的端点。请求从端点传递到 MessageBroker,这是 BlazeDS 和 LiveCycle Data Services 引擎,它负责处理所有请求并将它们通过一系列 Java 对象传递到目标-包含要调用的方法的 Java 类(请参阅图 3)。
图 3.Flash Remoting 架构。
AMF
AMF 是一种二进制格式,它用于序列化 ActionScript 对象并促进 Flash Platform 应用程序与远程服务之间通过 Internet 进行的数据交换。Adobe 发表该协议;最新的是针对 ActionScript 3 的 AMF 3 规范*。此处包含一些表格,其中列出了从 ActionScript 转换为 Java 以及从 Java 转换为 ActionScript 的数据类型映射。
对于自定义类型或强类型对象,公共属性(包括使用 get 和 set 方法定义的那些属性)经过序列化,作为一般对象的属性从 Flex 应用程序发送到服务器,或从服务器发送到 Flex 应用程序。要实现相应的客户端与服务器端对象之间的映射,您在 Java 和 ActionScript 类中使用相同的属性名,然后在 ActionScript 类中使用 [RemoteClass]
元数据标签创建一个 ActionScript 对象,它直接映射到 Java 对象。
以下是一个示例 Employee ActionScript 类,它映射到服务器上的服务包中的服务器端 Employee Java DTO。
package valueobjects.Employee{
[Bindable]
[RemoteClass(alias="services.Employee")]
public class Employee {
public var id:int;
public var firstName:String;
public var lastName:String;
(...)
}
}
安装 BlazeDS 或 LiveCycle Data Services
要将 Flash Remoting 与 BlazeDS 或 LiveCycle Data Services 一起使用,您需要安装和配置必要的服务器端文件。对于 BlazeDS,您可以将它作为一个 WAR 文件下载,并部署为 Web 应用程序或统包解决方案。统包下载包含一个可随时使用的 Tomcat 版本,其中已部署和配置 BlazeDS WAR 文件以及各种范例应用程序。同样,对于 LiveCycle Data Services,安装程序允许您选择与一台集成 Tomcat 服务器一起安装 LiveCycle 或是作为 LiveCycle Data Services Web 应用程序进行安装。
无论哪种情况,都会创建一个名为 blazeds 或 lcds(通常后跟一个版本号)的 Web 应用程序。您可以使用自己的 Java 代码修改并构建这个应用程序,或者通过一种更典型的方法,即复制 blazeds 或 lcds Web 应用程序包含的 JAR 文件和配置文件,然后将它们添加到服务器上的现有 Java Web 应用程序(请参阅图 4)。
图 4.必需的 BlazeDS 或 LiveCycle Data Services 文件。
修改 web.xml
如果将这些文件复制到其他 Web 应用程序,您还需要修改 web.xml 文件,为 HttpFlexSession 定义一个会话监听器,并为 MessageBroker 定义一个 servlet 映射,它会处理所有请求并将它们传递到正确的服务器端 Java 端点。您可以从原始 blazeds 或 lcds Web 应用程序 web.xml 文件复制粘贴它们。
<!-- Http Flex Session attribute and binding listener support -->
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<!-- MessageBroker Servlet -->
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
您也可以复制粘贴 RDSDispatchServlet 的映射(并取消注释),它与 Flash Builder 4 的数据服务创建功能一起用于 RDS 访问,该功能将检查服务器端类并生成相应的客户端代码。有关 Adobe 应用程序建模技术的更多详细信息,请参阅文章 Flex 和 Java 应用程序构建技术以及教程使用 Flash Builder 4 构建连接到 BlazeDS Remoting 目标的 Flex 应用程序。
<servlet>
<servlet-name>RDSDispatchServlet</servlet-name>
<display-name>RDSDispatchServlet</display-name>
<servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
<init-param>
<param-name>useAppserverSecurity</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping id="RDS_DISPATCH_MAPPING">
<servlet-name>RDSDispatchServlet</servlet-name>
<url-pattern>/CFIDE/main/ide.cfm</url-pattern>
</servlet-mapping>
查看 services-config.xml
对于 Flash Remoting,客户端会向服务器发送一个待处理的请求,然后服务器将包含结果的响应返回给客户端。您通过修改 Web 应用程序的 /WEB-INF/flex/ 文件夹中的 services-config.xml 和 remoting-config.xml 文件,配置这些请求。
services-config.xml 文件定义了发出请求时可使用的不同通道。每个通道定义指定了请求使用的网络协议和消息格式,以及服务器上消息的交付端点。基于 Java 的端点以协议特定方式分解消息,然后将消息以 Java 形式传递到 MessageBroker,后者将它们发送到相应的服务目标(接下来将说明如何定义它们)。
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
<channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
<endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure"
class="flex.messaging.endpoints.SecureAMFEndpoint"/>
</channel-definition>
(...)
</channels>
定义目标
在 remoting-config.xml 文件中,您将定义 MessageBroker 传递消息的目标(对 Java 类的命名映射)。您使用一个无参数构造函数将 source
属性设置为完全限定的 Java POJO 类名,该构造函数位于一个源路径中,一般通过将它放入 Web 应用程序的 /WEB‑INF/classes/ 目录或 /WEB‑INF/lib/ 目录中的 JAR 文件做到这一点。可以访问 Java 命名和目录接口 (JNDI) 中存储的 EJB 和其他对象,方法是对目标调用方法,该方法是在 JNDI 中查找对象并调用其方法的服务 facade 类。
您可以访问无状态或有状态 Java 对象,方法是将 scope
属性设置为 application、session 或 request(默认)。对引用的服务器端对象的实例化和管理由 BlazeDS 或 LiveCycle Data Services 负责。
<service id="remoting-service" class="flex.messaging.services.RemotingService">
<adapters>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<destination id="employeeService">
<properties>
<source>services.EmployeeService</source>
<scope>application</scope>
</properties>
</destination>
</service>
您也可以为各个目标指定通道。
<destination id="employeeService " channels="my-secure-amf">
最后,在 Flex 应用程序中定义 RemoteObject 实例时,您将使用这些目标。
<s:RemoteObject id="employeeSvc" destination="employeeService"/>
安全性
在许多应用程序中,对部分或全部服务器端资源的访问必须限制为特定用户。许多 Java EE 应用程序使用容器管理的安全性,其中对 Realm 执行用户验证(验证用户)和用户授权(决定用户可以访问什么-通常基于角色),Realm 是一个现有的用户名、密码和用户角色存储。在 Java EE 服务器上将 Realm 配置为关系数据库、LDAP 目录服务器、XML 文档或配置为使用特定验证和授权框架。
要将 Flex 应用程序与 Java EE 安全性框架集成在一起,从而适当地限制对服务器端资源的访问,您可以将安全性信息添加到 BlazeDS 或 LiveCycle Data Services 配置文件(以下提供详细信息),然后,通常在 Flex 应用程序中创建一个表单,使用它从用户那里获取登录凭据,再传递给待验证的服务器。对于所有后续请求,用户凭据会自动传递到服务器。
修改 services-config.xml
在 BlazeDS 或 LiveCycle Data Services services-config.xml 文件中,您需要在 <security>
标签中为您的应用程序服务器指定“login command”。BlazeDS 和 LiveCycle Data Services 提供以下登录命令:TomcatLoginCommand(用于 Tomcat 和 JBoss)、JRunLoginCommand、WeblogicLoginCommand、WebSphereLoginCommand、OracleLoginCommand。它们都在 XML 文件中定义,您只需对相应项取消注释即可。
您还需要定义一个安全性限制,将它指定为使用基本或自定义验证,如果需要,还可以指定一个或多个规则。要使用 Tomat 或 JBoss 进行自定义验证,您还需要向 Web 应用程序另外添加一些类,用于同 Jave EE 应用程序服务器使用的安全性框架集成,并修改几个配置文件。此处*提供更多详细信息。
<services-config>
<security>
<login-command class="flex.messaging.security.TomcatLoginCommand"
server="Tomcat">
<per-client-authentication>false</per-client-authentication>
</login-command>
<security-constraint id="trusted">
<auth-method>Custom</auth-method>
<roles>
<role>employees</role>
<role>managers</role>
</roles>
</security-constraint>
</security>
...
</services-config>
修改 remoting-config.xml
接下来,您需要在目标定义中引用安全性限制:
<destination id="employeeService">
<properties>
<source>services.EmployeeService</source>
</properties>
<security>
<security-constraint ref="trusted"/>
</security>
</destination>
您也可以为所有目标定义默认安全性限制和/或将访问权限制为特定方法可使用不同的安全性限制。
默认通道 my-amf 使用 HTTP。您可以将一个或多个目标更改为使用 my-secure-amf 通道,该通道使用 HTTPS:
<destination id="employeeService">
<channels>
<channel ref="my-secure-amf"/>
</channels>
...
</destination>
在 services-config.xml 文件中定义 my-secure-amf
:
<!-- Non-polling secure AMF -->
<channel-definition id="my-secure-amf"
class="mx.messaging.channels.SecureAMFChannel">
<endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure"
class="flex.messaging.endpoints.SecureAMFEndpoint"/>
</channel-definition>
将代码添加到 Flex 应用程序
它涵盖了服务器端设置。现在,如果要使用自定义验证,您需要在 Flex 应用程序中创建一个表单,用于从用户那里检索用户名和密码,然后通过调用 ChannelSet.login()
方法并监听其 result
和 fault
事件,将这些凭据传递到服务器。result
事件表明登录(验证)成功完成,fault
事件表明登录失败。凭据适用于通过相同 ChannelSet 连接的所有服务。对于基本验证,您不必向 Flex 应用程序添加任何内容。当应用程序第一次尝试连接到目标时,浏览器会打开一个登录对话框。
您的应用程序现在可以像之前那样向服务器目标发出 Flash Remoting 请求,但现在每个请求会自动发出用户凭据(对于基本和自定义验证)。如果目标或目标的方法指定的授权角色与登录的用户不符,调用将返回一个 fault
事件。要删除凭据并注销用户,可使用 ChannelSet.logout()
方法。
Flex 应用程序架构
您已学会如何在服务器端设置 Flash Remoting 以及如何使用 Flex 定义 RemoteObject 实例,我们现在看看如何构建一个应用程序来使用这个对象。
使用事件
一个典型的 Flex 应用程序包含用于定义用户界面的 MXML 代码以及用于逻辑的 ActionScript 代码。像 JavaScript 及浏览器 DOM 对象一样,它们通过事件和事件处理函数连接在一起。要使用应用程序中的 RemoteObject,您需要定义实例、调用服务器端远程目标的方法、为 result
和 fault
事件指定回调函数,并在其中使用服务器返回的数据进行一些操作。
这里有一个简单的应用程序,它从一个数据库检索员工数据,并在一个 Flex DataGrid 组件中显示这些数据。初始化应用程序后,将调用服务器上的 remoting-config.xml 文件中定义的 employeeService 目标的 getEmployees()
方法,如果服务器成功返回数据,将填充变量 employees
,如果请求出于任何原因失败,警告框中将显示一条消息。数据绑定用于将 employees
变量绑定到 DataGrid 的 dataProvider
属性。
<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/mx"
initialize="employeeSvc.getEmployees()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
[Bindable]private var employees:ArrayCollection;
private function onResult(e:ResultEvent):void{
employees=e.result as ArrayCollection;
}
private function onFault(e:FaultEvent):void{
Alert.show("Error retrieving data.","Error");
}
]]>
</fx:Script>
<fx:Declarations>
<s:RemoteObject id="employeeSvc" destination="employeeService"
result="onResult(event)" fault="onFault(event)" />
</fx:Declarations>
<mx:DataGrid dataProvider="{employees}"/>
</s:Application>
使用 RemoteObject 时,可以在服务层级定义 result
和 fault
处理程序:
<s:RemoteObject id="employeeSvc" destination="employeeService" result="onResult(event)"
fault="onFault(event)"/>
在方法层级:
<s:RemoteObject id="employeeSvc" destination="employeeService">
<s:method name="getEmployees" result="onResult(event)" fault="onFault(event)"/>
<s:method name="getDepartments" result="onResult2(event)" fault="onFault2(event)"/>
</RemoteObject>
或根据每个调用:
<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/mx"
initialize="getEmployeesResult.token=employeeSvc.getEmployees()">
<fx:Declarations>
<s:RemoteObject id="employeeSvc" destination="employeeService"/>
<s:CallResponder id="getEmployeesResult" result="onResult(event)"
fault="onFault(event)"/>
</fx:Declarations>
使用数据绑定
数据绑定是 Flex 框架的一个强大部分,当数据更改时,它允许您更新用户界面,并且不必明确注册和编写事件监听器完成该操作。在之前的应用程序代码中,employees
变量定义前的 [Bindable]
标签是一个编译器指令;编译该文件时,会自动生成 ActionScript 代码,这样每当 employees
变量改变时,将广播事件。
[Bindable]private var employees:ArrayCollection;
DataGrid 的 dataProvider
属性赋值中的花括号实际会生成代码,用于监听 employees
变量的变化,当它更改时,将相应地更新 DataGrid 视图。
<mx:DataGrid dataProvider="{employees}"/>
在这个应用程序中,employees
最初为空并且 DataGrid 中不显示数据,但从服务器成功检索到数据并填充 employees
后,将更新 DataGrid 以显示员工数据。
使用视图状态
要在运行时对用户界面动态做出更极端的更改,如添加、删除、移动或修改组件,可使用 Flex 视图状态*。对于每个 Flex 视图或组件,可以定义多个状态;对于视图中的每个对象,可以定义应当将它包含在哪个状态中、它的外观以及它在状态中应该做什么。将组件的 currentState
属性设置为某个已定义状态的名称,即可在不同状态之间切换。
<s:states>
<s:State name="employees"/>
<s:State name="departments"/>
</s:states>
<mx:DataGrid dataProvider="{employees}" includeIn="employees"/>
<s:Button label.employees="Switch to departments"
label.departments="Switch to employees"
click.employees="currentState='departments'"
click.departments="currentState='employees'"/>
使用 MXML 组件
当应用程序逐渐变大时,您需要将逻辑细分为多个 ActionScript 类包,将视图细分为不同的 MXML 文件(称为 MXML 组件)。每个 MXML 组件扩展一个现有组件,并且只能包含在一个应用程序中,但不能独立运行。要使用 MXML 编写的组件,您将该组件的一个实例(它的类名与其文件名相同)实例化并包含正确的命名空间,以便编译器可以找到它。
以下是 MXML 组件 Masterview 的代码,它被保存为 com.adobe.samples.views 包中的 MasterView.mxml。
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" >
<fx:Metadata>
[Event(name="masterDataChange",type="flash.events.Event")]
</fx:Metadata>
<fx:Script>
<![CDATA[
import mx.collections.ArrayList;
[Bindable]private var masterData:ArrayList=new ArrayList(["data1", "data2", "data3"]);
public var selectedData:String;
private function onChange(e:Event):void{
selectedData=dataList.selectedItem;
this.dispatchEvent(new Event("masterDataChange"));
}
]]>
</fx:Script>
<s:DropDownList id="dataList" dataProvider="{masterData}" change="onChange(event)"/>
</s:Group>
以下是实例化并使用那个自定义 MasterView 组件的应用程序的代码。
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:views="com.adobe.samples.views.*">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
private function onMasterDataChange(e:Event):void{
Alert.show(e.currentTarget.selectedData,"Master data changed");
}
]]>
</fx:Script>
<views:MasterView masterDataChange="onMasterDataChange(event)"/>
</s:Application>
广播事件
要构建松耦合组件,您需要为组件(它的公开成员)定义一个公共 API 和/或如以上 MasterView 代码示例所示定义并广播自定义事件。[Event]
元数据用于将事件作为该组件的 API 的一部分进行定义,并指定它广播的事件对象的类型。
<fx:Metadata>
[Event(name="masterDataChange",type="flash.events.Event")]
</fx:Metadata>
当组件中发生一些事件时(在本例中,DropDownList change
事件),组件将创建并广播元数据中指定事件对象类型的实例。
this.dispatchEvent(new Event("masterDataChange"));
实例化这个自定义组件的代码此时可以注册监听这个自定义事件,并注册一个事件处理程序。
<views:MasterView masterDataChange="onMasterDataChange(event)"/>
像这样定义并广播自定义事件的松耦合组件是 Flex 应用程序的核心构造块。事实上,这是 Flex 框架本身的组件的构建方式。有关广播自定义事件的更多信息,请观看视频使用 Flash Builder 4 定义 Flex 4 中的事件*。
创建模块
默认情况下,所有代码将编译到一个 SWF 文件中。如果您的 SWF 文件变得很大或是包含只有特定用户可能使用的功能,您可以使用模块*将应用程序分为多个 SWF 文件,它们在运行时可以由主应用程序动态载入和卸载。要创建模块,您创建一个扩展 Module 类的类(使用 MXML 的 ActionScript),然后编译它。要在运行时将模块动态载入一个应用程序,可使用 <mx:ModuleLoader>
标签或 ModuleLoader 类的方法。
使用微型架构
它涵盖了应用程序构建的基础知识,但随着您的应用程序越变越大,您希望通过一些方法来组织文件、集中应用程序数据和数据服务、处理所有组件之间的通信。要这样做,您可以使用企业应用程序开发领域多年来久经考验的各种设计模式构建自己的 Flex 应用程序。事实上,许多特定于 Flex 的微型架构已经开发完成并且不断完善。最早并且最知名的莫过于 Cairngorm*,这是一个开放源代码微型架构,它使用命令和授权、前端控制程序、一个单例数据模型、一个单例服务存储和一个事件分发器。其他常用框架包括 Pure MVC*、Mate*、Parsley*、Swiz* 和 Spring ActionScript*。有关这些框架和其他框架的更多信息,请参阅 Adobe 开发人员中心的 Flex 架构。
后续工作
本文讨论了 Flex 和 Java 应用程序的架构。有关更多信息,请使用本文包含的链接以及下列资源:
- Adobe Flex 开发人员中心
- Adobe 开发人员中心的 Flex 和 Java
- Adobe 开发人员中心的 Flex 架构
- BlazeDS 文档*
- Adobe LiveCycle Data Services ES2 文档*
- Adobe Flex 4 文档*
关于作者
Jeanette Stallons 是一名独立 Flex 培训师和咨询师,曾为包括 Adobe、Oracle、Boeing、Wachovia、Morgan Stanley 和 Charles Schwab 在内的许多公司授课。在从事这一自由职业之前,Jeanette 曾效力于 Allaire、Macromedia 和 Adobe 的培训部门,为 Flash、Flex 和其他产品设计架构、编写代码、教授和构建应用程序。她的最新项目是 Adobe Flex Learning Paths Flex 应用程序,她一直都是这个应用程序的幕后策划者、编程员和内容专家。