开发员应该运用RIA 客户机来做点什么。对于那些熟悉页面请求应答模式的传统Web开发员来说,这是一个明确的思想上的转变。象Flex这样的RIA 产品并非像Struts一样是请求或回应驱动。 RIA 客户机负责在任何情况下更新UI而不必回到服务器。
当使用RIA时Struts不只是您唯一想的事了。 熟悉这类型技术需要时间。 在经历这些曲折以后, 最大的问题是Java服务器端组件的综合化。 这也并非是针对RIA概念。
Flex与业务层集成
前面我们已经讨论了一些表示层相关的,下面我们讨论其它层在我们的应用结构是怎么受影响的。我们已经重置了我们的表示层组件; 我们怎么把它与业务层集成在一起呢?
Flex是一个可扩展的RIA 框架,它提供了很多方式与您的J2.EE 组件通信。Flex提供了HTTP 通信,万维网服务通信,还有Macromedia 的私有的AMF (ActionScript 传讯格式化) 网关。AMF 网关是一个高性能二进制协议,它近似于Flash remoting协议。远程对象运用HTTP 协议被发送到AMF 网关。Flex为每个这些通信协议提供MXML 标签, 这样一来极大的减少编制程序复杂度。 此外, Flex允许您以或异步或同步方式对您的企业等级启用远程调用。 通过使用一种异步远程购买权, 用户就能够对客户机进行一些操作并且即使当发生在传统万维网应用中时也不被拦截。 您能阻拦用户与使用同步调用的UI交涉。
让我们来考虑一下怎么让Flex和我们的业务综合化层集成呢。为这我们将使用Spring框架作为我们的综合化层, 但这对您选择实施什么综合化层并没有限制。让我们假设一下您有您的服务运行在Spring microcontainer里, 并且您需要由Flex调用远程对象。
因为Flex对Spring完全不了解,您也许可以考虑添加一个separate, 即一个薄层作为代表您的service components。 并且, 因为Spring对Java接口起到了很大作用,所以我们可以建立一个代表对象,这个代表对象实施着和Spring服务一样的Java 界面。这些代表对象将提供一个减弱了的网关,它从Flex和综合化层中分离。 您需要做的唯一的事是在Flex配置文件中配置这些对象因此他们能与AMF 网关共同操作。 这里有一个实例将说明代表对象是怎样被配置在server-side flex-config.xml Flex配置文件里的:
<object name="OrderBusinessDelegate">
<source>
com.meagle.flexro.FlexBusinessDelegate
</source>
<type>stateless-class</type>
<use-custom-authentication>
true
</use-custom-authentication>
<allow-unnamed-access>
false
</allow-unnamed-access>
<roles>
<role>OrderUser</role>
<role>Admin</role>
</roles>
</object>
初看Flex你会发现它一些有附加能力,类似于像设置安全性啦,决定委派对象是否申明啦。当Flex发一个远程的对象呼叫到内层时,它将会干扰一个Flex的委派Java对象.委派对象将会负责对呼叫内层或者服务层 (比如Spring).作为结果的对象将通过AMF网关返回到Flex客户端,这个对象被称为ActionScript对象.这里是一个MXML代码的例子, Flex客户端用MXML代码来远程调用并将结果存储到一个数据模式中.
<mx:RemoteObject id="soapro"
named="OrderBusinessDelegate"
protocol="https"
showBusyCursor="true">
<mx:method name="saveNewOrder"
result="saveNewOrder_result(event)"
fault="faultHandler(event.fault)"/>
<mx:method name="findOrderById"
result="findOrderById_result(event)"
fault="faultHandler(event.fault)"/>
<mx:method name="updateOrder"
result="updateOrder_result(event)"
fault="faultHandler(event.fault)"/>
</mx:RemoteObject>
<mx:Model id="roModel" >
<!-- The object graph for the Order object
will be stored here -->
<Order/>
</mx:Model>
< name="saveNewOrder">< name="findOrderById">< name="updateOrder">
用ActionScript equivalents写的Java的域对象在AMF网关里来回传递。这个过程开始于一个请求,这个请求是从Flex服务器通过AMF网关到应用程序的其他层。一个返回对象的图,将会被通过其他Java层,最后通过一个AMF网关返回到服务器。一旦这个对象通过网关他们就将被转变为 ActionScript equivalents。图3详细说明了这一过程:

图3. Overview of the AMF gateway.
