站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题整合Macromedia Flex和Java

整合Macromedia Flex和Java

摘要: Rich Internet Application (RIA) 技术的涌现解决了表示层的限制。 这篇文章实实在在地介绍了什么是RIA,怎么把RIA 集成到你自己的系统结构中去。 并且将识别当跟一些现在普遍的公开的框架结合时所存在的潜在的挑战。
现今我们用J2.EE 服务器开发互联网应用,通常包括一个表示层譬如Struts, Tapestry, WebWork, or Spring。 这些工具一般按照Model-View-Controller (MVC)结构并以HTML的形式输出 到浏览器。 Web开发典型的编程模式是允许用户在应用中为每一次action向一个应用服务器发布请求。 为每次action用户 发出请求, 服务器会生成一个新的应答,这个应答允许用户为了更多信息递交一个新请求。 浏览器一般被用作提交给用户的用户界面。 但是, 浏览器是瘦客户机,它有影响扩展和终端用户体验的局限性。

Rich Internet Application (RIA) 技术的涌现解决了表示层的限制。 这篇文章实实在在地介绍了什么是RIA,怎么把RIA 集成到你自己的系统结构中去。 并且将识别当跟一些现在普遍的公开的框架结合时所存在的潜在的挑战。

版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:Mark Eagle;molecule
原文:http://www.onjava.com/pub/a/onjava/2004/12/01/flexjava.html
译文:http://www.matrix.org.cn/resource/article/44/44195_Macromedia+Flex+Java.html
关键字:Macromedia;Flex;Java

浏览器的局限性

那么当前的解决方法有什么问题吗?如果应用程序运转正确且允许用户是有生产力的,那么可能没什么错误。但是曾经有很多web开发员抱怨当使用浏览器作为客户机时会限制性能。 这是一些当前开发web应用程序时遇到的问题:

1.浏览器以不一致的方式解释scripting 语言, 譬如Java 语言。 这迫使开发员多次写同样的代码来调节各个浏览器。
2.简单用户接口会影响到譬如选中, 基于向导的表单, 和大表格数据集的处理,这使得在浏览器上需要更多额外的代码。
3.HTML 是有限的,静态的标记语言是无法是扩展的。
4. 在用户接口之内进行事件处理可能是富挑战性的。 因为被反馈的HTML 页一次只能被显示一页, 而事件没有回到服务器之前又是无法更新其它页的。
5. 只能通过Cookie来达到连续的应用状态,Cookie它是不支持对象的。
6.使用浏览器开发偶尔连接的客户机几乎是不可能。

很多Web开发员都知道这个事实: 当前工具设置有局限性。当在浏览器上工作时开发员必须查找解决方法。 对于开发员和用户来说用一台瘦客户机是承受不了当前的性能的。

Rich Internet Applications

为了克服这些局限性, 考虑用RIA来开发。 如今RIA给用户一台胖客户机来扩展浏览器所承受不了的性能。 最普遍应用的J2.EE 的RIA 客户机是Java 和Flash。 当开发大型的数据中心的应用程序时, RIAs 真的是很强的。开发RIA的几个可行方法是JDNC (JDesktop Network Components), Laszlo, Thinlet, Java Web Start, 和Macromedia Flex。
RIA能解决问题前面已经说过了。 下面是RIAs的一些特征:
1. RIAs提供了和浏览器一样的UI组件, 而且它还提供新的本地的更加丰富的组件。 比如包括一个数字步进, 滑动控制, 一个轴向数据网格要素和菜单栏。
2. 成熟的RIA应用允许布局管理器由如下构成,譬如制表符浏览器, 折叠,树结构和其它能和AWT and Swing开发相媲美的布局控制。
3. RIAs 提供拖放能力。
4. RIA 里的语言是一致的,它贯穿于所有客户机, 不必为不同的实施而重写。
5. 在用户接口,不必每个action都是请求/回应模式。通过富互联网应用,用户与UI 相互对话,如果需要也只需要向服务器发出请求。 RIAs 会运用HTTP 协议方法把数据提交给应用服务器。但是, 通常更好的用RIAs的机制是远程, 它会根据RIA 来支持不同的方式。RIAs提供扩展的与HTTP进行通讯的协议。
6. 事件处理横跨多个组件是可能的。
7. RIAs 允许您不使用HttpSession就可以在客户机存储更多信息。 这减少了在应用服务器里所占的内存。
8. 状态的连续广播, 通常是以对象的形式,它提供了创建偶尔连接的客户机的可能性。

RIA是相当新的技术,它介绍了开发时涉及到的应用。 它不能解决所有应用, 它是要依赖某种实现。 但是, 如果您认为您的应用可受益于一个更加富有的UI 设计, 那么RIA 也许就可以为您服务。 本文现在将集中于一个RIA 解决方法, Macromedia Flex, 并且集中讨论一下。

Macromedia Flex

Macromedia Flex是RIA的一台商业表示层服务器。因为这是Flex applications.用的环境,所以必需要安装Flash插件。 多数浏览器已经装备了Flash插件,对于RIA来说这也有助于正当使用Flex。 我们来讨论一下不用Java 插件而使用Flash插件来与J2.EE 应用服务器通话的意义所在。

开发员使用二个核心语言创建Flex应用。 第一核心语言是MXML, 即Macromedia Flex Markup Language,它拥有一套丰富的XML 标签,这些标签允许开发员设计用户接口。 MXML 也可以被认为是XUL, 或XML UI 语言。不同于HTML,这些标签是可以扩展的, 它拥有应用程序所需要的额外能力。 其他MXML 结构可以被叫做远程对象, 在model中存储返回的数据, 并且对MXML 构件可以自定义您自己的感观。

第二个Flex开发核心语言是ActionScript 2.0, 它是一个ECMA 支持的语言,与JavaScript 语言类似。 ActionScript 原理是被编码在MXML 页里面的。 这是较强的面向对象的语言,这对于java开发者来说是比较熟悉的。 ActionScript 而且有很大的事件处理能力,它允许应用程序回应动态用户交互。 由于ActionScript 运行在Flash插件里面,所以它不同于在浏览器里进行JavaScript编码,不需要重写几个同样编码的版本来支持不同的浏览器。MXML 和ActionScript 是基于文本的语言, 可以写在一个简单文本编辑器或 一个IDE 工具譬如Eclipse, 或一个更加老练的工具象由Macromedia 公司的Flex Builder里。 如果您接触过Java, XML, 和scripting 语言譬如JavaScript 语言的话, 那么您在学习Flex时就要稍微转下弯了。

Flex服务器负责把MXML 和ActionScript 组件转换成以.SWF 文件的形式的Flash字节码。这个过程类似于用Java Web应用容器把JSP 文件编译成servlets。在Flash运行环境下,SWF 文件被执行在客户机里。 Flex服务器提供其它服务譬如缓存, 并发, 和处理远程对象请求。

给您现有的结构介绍一个RIA 框架

现在你对RIA 概念的已经有些了解了, 让我们看看怎么把RIA 引入到您现有的结构中去。 其中我们也将着重论述怎样把RIA表现在一个层状应用中。 此外, 也会讲到当用Flex与一些普遍的公开的框架的结合开发时存在的一些潜在的问题。 这些实例将有助于引入RIA 到您的结构中去。

就让我们先由辨认层状结构开始。一个结构可能包括以下几层: 表示层, 业务代表层,业务综合服务层, 和持久层。 这是各自层的基本实现:

Flex + Business Delegates + Spring Framework + Hibernate

接下去的内容将集中讲解每一层。

我现有的MVC 表示层是怎么样的?

在Web应用程序中表示层是用来给用户传递用户界面, 处理后端服务请求, 并且存储信息数据模型用的。对刚接触RIA的开发员最初可能会倾向于重新使用现有的Struts。 但是, 象Flex这些开发产品都提供了他们自己的MVC 结构。 难道您真地需要维护一个包括二个MVC 结构的表示层吗?

以下是当Flex客户机通过Struts组件向Java 服务器作出请求时的实例。在被更高层接收之前,Flex客户机的请求会先被发送到Struts表示框架。 图1 显示了哪些是不做的:


图1 。怎样不集成Flex and Struts和其它Java组件。

表示框架譬如Struts是由HTTP传送HTML 请求来运行的。 当用Flex客户机来使用HTTP 协议时, 开发员就会出于对性能和面向对象的优点考虑,通过HTTP来使用远程对象而反对提交请求的方式。 所以, 有序化的使用这两个表示框架会提供协议配错。 除非您有特定需要直接地用RIA来集成Strut ,这样才可以避免。 图2 显示一个当使用Flex 和 Struts时更好的解决方法


图2 。 介绍Flex 和 Struts与其它Java 组件

图2 建议怎么安排分离的Flex组件 和 Struts组件共存。 但这是有条件的,这需要在当应用程序请求并行RIA 组件和轻量Struts组件的时候。

开发员应该运用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配置文件里的:



com.meagle.flexro.FlexBusinessDelegate

stateless-class

true


false


OrderUser
Admin



初看Flex你会发现它一些有附加能力,类似于像设置安全性啦,决定委派对象是否申明啦。当Flex发一个远程的对象呼叫到内层时,它将会干扰一个Flex的委派Java对象.委派对象将会负责对呼叫内层或者服务层 (比如Spring).作为结果的对象将通过AMF网关返回到Flex客户端,这个对象被称为ActionScript对象.这里是一个MXML代码的例子, Flex客户端用MXML代码来远程调用并将结果存储到一个数据模式中.

   named="OrderBusinessDelegate"
protocol="https"
showBusyCursor="true">
result="saveNewOrder_result(event)"
fault="faultHandler(event.fault)"/>
result="findOrderById_result(event)"
fault="faultHandler(event.fault)"/>
result="updateOrder_result(event)"
fault="faultHandler(event.fault)"/>