本文列述了 13 个 Java 程序员应当学习 Flex 和 BlazeDS 的理由,讨论了为什么 Flex 结合 BlazeDS 是开发 RIA 的最佳组合之一。无论是高度交互的网站还是以 Java 为后端的企业应用,这项组合都是最佳选择之一。更重要的是,这项组合能同时为开发员和企业带来高回报(ROI)。
在阐述 Java 程序员应当学习 BlazeDS 的 13 条理由时,我以一个假想的苏打分派系统来展示如何让已有的 Java 程序转变为 RIA 应用。通过这个例子,我同时还会讲解到 BlazeDS 在已有 Java 应用或新建 Java 应用中的多种不同用法。
理由一:开源
Flex 软件开发工具箱(SDK)的核心是个开源框架,专门用来开发、维护那些在不同浏览器、不同操作系统下界面都相同的 RIA 应用。Flex 发布采用的是 Mozilla 公共许可证(Mozilla Public License)。编译后的 Flex 应用在 Adobe Flash 平台下运行。
BlazeDS 是连接 Flex 和 Java 的索桥,是项针对远程调用和消息传递的开源技术。在 Java 应用服务器上,它以 servlet 的形式存在,因此可以在任何标准 Java 网络应用中运用它。BlazeDS 以 LGPL(Lesser GNU Public License)公共许可证书发布。在发布 BlazeDS 的同时,Adobe 还公布了 AMF(ActionScript Message Format)规格说明,BlazeDS、Java 和 Flex 客户端间以这种简洁的二进制格式实现通信。
理由二:完善的社区支持
Flex 社区非常活跃,社区贡献了大量项目。Flex.org,这个配以社区新闻的 Adobe 站点几乎每天都有新的社区贡献;Yahoo! 上的 Flex 用户组的成员也已经超过了 11000。
再比如 Google Code 上的 Flexlib 项目,已经提交了大量的开源 UI 组件。Swiz 和 Mate 项目贡献了优化事件处理的框架;还有 Gorilla Logic 贡献了自动化 UI 测试的 Flex Monkeym 项目。
理由三:带来广阔的就业前景
据 Adobe 的 Flex“传道士”——James Ward 看来,Flex 高级开发员的市场需求非常大,学习 Flex 能让你拥有极具市场竞争力的开发技能。
理由四:更高的业务效益回报
总体上,开发企业 web 应用不是个轻松的活,这基本上是众所周知的事实。Flex 和 BlazeDS 提供的不仅仅是功能强大的开发工具,而且开发技术本身相对也非常简单。开发效率可以得到大幅度的提升,产品因此可以很快推向市场。Flex 和 Flash 带来的用户体验也相对更有魅力,对增加流量、提高用户转化率(conversion rate)很有帮助。
很经典的一个例子是 Borders 连锁书店。他们最近发布了带有“魔法书架”的新网站,这个网站采用 Flash 接口来模拟书籍借阅的过程。Borders 发现这一模拟借阅非常明显地提到了用户转换率:“借助这个 Flash 驱动的接口,用户可以浏览书籍、DVD 和 CD 的封面,用户转换率比其他没有此项功能的网站高出62%”。
理由五:Flex 是第一个专门为创建UI 而设计的语言
大部分语言都不是在第一时间设计其对UI 的支持。Java 中Swing 包的实现刚好是个很好的证明。也就是这个原因,很多像捆绑数据这样的简单动作在Swing 当中的实现就非常痛苦。用 Swing 最大的问题在于,要想提高开发效率就必须要对其API 了如指掌。
Flex 刚好相反,它是专门为创建 web UI 而设计的。正如 Bruce Eckel 所说,Flex 是第一个针对 UI 开发的领域特定语言(DSL)。用 Flex 构建 UI 比其它诸如 JSP、JSF、Swing 等技术简便得多。语言本身糅合了数据绑定、事件处理、控件布局以及其它一些 UI 常用开发技巧,就算对语言没有深刻的理解也不会影响开发效率。
理由六:编程风格近似于 Java
你可以继续使用现有的 Java 开发工具来开发 Flex 应用。当然也可以采用 SDK 中携带的免费命令行工具,Adobe Flex Builder(一个 Eclipse 插件),或最近的 IntelliJ IDEA 8。
Flex 提供的是一个有状态环境,在这个环境中,数据从客户端加载。这种编程模式更像是开发桌面客户端而非 HTML 编程,这种风格对于用过 Java Swing 编程的开发员来说应该是相当熟悉。
Flex 是 MXML(类似 XML 的 UI 标记语言)和 Adobe ActionScript(面向对象的解析语言)的结合体。鉴于这种结合方式,Flex 编程与 Java 非常相似,因为两者用的都是熟知的面向对象的概念。
最理想的开发环境是把 Flex 应用创建在 web 部署文件夹下。这样一来,每次更新应用之后都不需要重新部署,只要在浏览器下刷新一下就可以了。用 Flex 和 BlazeDS 开发后,开发效率绝对比之前有很大的提升。
理由七:BlazeDS 可以在任何 Java 应用服务器上运行
BlazeDS 目前已发布了多个版本,其中的 turnkey 版本还包含了为 BlazeDS 配置的 Apache Tomcat。本文中,我用的是二进制发布版本,其中含有一个 WAR 用来展示如何把应用部署到各种应用服务器上去。不用这个 WAR 的话,你也可以从中提取 JAR 文件放到自己的项目中去。关于安装 BlazeDS 的各种选项内容,可以参见 BlazeDS 的 wiki 。
这里举一个简单的例子,比方说要在已有的一个简单的苏打调配系统中应用 BlazeDS。你只要把 JAR 文件放到项目文件夹下,然后就可以在应用里直接用 BlazeDS,可以部署到能够部署应用的任何地方。
在项目中添加 BlazeDS,只需要完成下面两个步骤:
- 解压缩 BlazeDS WAR 文件的内容:jar xvf blazeds.war。
- 把 JAR 文件都拷贝到项目的 lib 文件夹下:cp -R WEB-INF/lib /sodaSample。
理由八:可以在已有 Java 应用中运用
比方说这个简单的苏打调配系统,假设你想要扩展这个已开发好的服务,让其它 Flex 应用可以远程调用。在现成的应用中配置 BlazeDS 的基本步骤有:
- 修改
WEB-INF/flex
文件夹下的 BlazeDS 配置文件 - 在该应用对应的 web.xml 文件里定义
MessageBrokerServlet
和 session 监听器
配置好 BlazeDS 之后,再把苏打调配服务添加到 BlazeDS 远程配置文件里,Flex 客户就能远程调用了。这个过程通过在配置文件里定义一个目的地(destination)、一个或多个信道(channel)来传输数据。基本的 AMF 信道定义在 services.xml 文件里。下面这段配置在 remoting-config.xml 里定义了目的地(destination):
<destination id="sodaService" channels="my-amf"> <properties> <source>com.gorillalogic.sodaSample.SodaService</source> </properties> </destination>
通过在远程调用配置文件里定义端点(endpoint),Flex 客户端就可以调用任何一个基本的 Java 服务。
要是想把 Java 数据模型也传送到 Flex 客户端的话,只要在 ActionScript 类中定义好两者间的映射:
[Bindable] [RemoteClass(alias="com.gorillalogic.sodaSample.SodaModel")]
这段代码告诉 Flex,在远程调用的服务返回SodaModel
的时候,把它映射到 Flex 的SodaModel
。本例中的 Flex 客户端显示的就是如何调用这个 Java 服务。调用返回一个已经填写好预定信息的SodaModel
:
public function callSodaService():void { var sodaType:String = type.text; var sodaCount:int = parseInt(cnt.text); var flag:Boolean = preOpen.selected; remoteObject.getSoda(sodaType, sodaCount, flag); } private function resultHandler(event:ResultEvent):void { var sodaModel:SodaModel = event.result as SodaModel; }
Flex 返回的结果是通用的 result 变量,可以直接映射到你的SodaModel
。这里我就不深入讨论怎么实现映射了,但其中值得提到的是要在编译配置里声明services-config.xml
路径,像这样:
-locale en_US -services=/nsource/sodaSample/web/WEB-INF/flex/services-config.xml -context-root /
如果不添加这个路径的话,你的 Flex 客户端就没发找到 Java 服务。同样的方式,你还能把一个对象从客户端传递回服务器端。比如,你可以把一个空的 soda model 发回服务器(审校注:原文这里写的是客户端,根据上下文判断这里应该是服务器端)。
理由九:可以通过 Java 来扩展和修改 BlazeDS
假如你想添加特殊的日志来记录苏打调配服务被调用的情况,那么你可以扩展标准的 Java 适配器来添加日志功能。
首先,添加一个继承了JavaAdapter
的 Java 类:
import flex.messaging.services.remoting.adapters.JavaAdapter. public class TimingJavaAdapter extends JavaAdapter {
其次,重载 invoke() 方法:
public Object invoke(Message message) { RemotingMessage remotingMessage = (RemotingMessage) message; String operation = remotingMessage.getOperation(); String destination = remotingMessage.getDestination(); Logger.info("calling " + operation + " on destination " + destination); Object data = super.invoke(message); return data; }
这个方法中,你可以看到调用之后的操作和调用的目的地(destination)。这种方法也能用来处理其它一些问题,比如记录向服务器发送调用需要多长时间。
理由十:HTML 和 JSP 也能调用 BlazeDS
从 HTML 和 JSP 也能调用 BlazeDS,这种调用有几种不同的实现方式,比如通过 Browser Manager 或fflashVars
f 来实现。Flex 应用能够读取由 HTML 页面设置的fflashVars
f。
比方说你想要通过 HTML 页面来发送你的用户名和准备预定的苏打类型,你可以在 HTML 页面这样设置flashVars
:
<object id='SodaSample' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='100%' width='100%'> <param name='src' value='SodaSample.swf'/> <param name='flashVars' value='username=ryan&type=coke'/> <embed name='mySwf' src='SodaSample.swf' pluginspage='http://www.adobe.com/go/getflashplayer' height='100%' width='100%' flashVars='username=ryan&type=coke'/> </object>
然后,在 Flex 应用中,你可以通过读取应用参数来获取这些变量:
var username:String; if (Application.application.parameters.hasOwnProperty("username")) { username = Application.application.parameters.username; }
理由十一:Flex 和 BlazeDS 的数据传输性能远胜于其它 Ajax 解决方案
目前使用的远程过程调用(RPC)都默认选择 AMF 二进制协议。AMF 是个开放的标准,而且相当快。James Ward 曾举例比较过多种远程调用解决方案。尽管其它 Ajax 技术——比如 Dojo——已经能够快速处理几百行的数据,但是用 Flex 和 BlazeDS 的话可以轻松搞定成千上万行。(请参考 James Ward’s census ,可以了解下各种不同的 RIA 数据加载技术的测评。)
理由十二:Java 客户端能够直接调用 BlazeDS
最新发布的 BlazeDS 当中含有一个 Java 的 AMF 类,通过这个类,你可以在 Java 客户端直接调用 BlazeDS 服务器。对于单元测试和加载测试来说,BlazeDS 的这种调用方式非常实用。
理由十三:Spring 下也能用
Adobe 和 Spring 互相联手,尝试将双方项目集成起来。他们发布的第一个 Spring–BlazeDS 集成版本就向大家展示了他们的良苦用心。Spring Bean 能够以远程服务的方式被调用,因此可以清除很多重复的配置文件。更多这方面的相关信息,可以参考该项目的主页。
结论
开源的BlazeDS 创建在Java 基础上,无论是对新的还是已有的Java 服务器项目来说都是个很好的选择。Flex、BlazeDS 技术能够提供高性能的远程通信,支持Flex 和Java 间的对象映射,因此是RIA 开发的理想选择。Flex 和BlazeDS 的开发新手,如果曾经是Java 开发员的话,会发现整个开发过程效率非常高,而且很容易掌握。
Flex 加 BlazeDS 还是开发大型 Java 企业应用的理想选择。我们组开发的上个项目中,应用涉及到 50 多个不同的界面,而且服务器和客户端之间需要规律性地互传几千行的代码。这类应用几乎没法通过传统的 Ajax 技术来实现。但是在引入了 Flex 和 BlazeDS 之后,我们在年内就发布了第一个版本。看,这就是这对动态组合为你的应用开发项目带来的过人之处。
阅读英文原文: 13 Reasons for Java Programmers to Learn Flex and BlazeDS 。
注释:你应当对这些技术有些基本的了解。关于 BlazeDS 的一些基本指南有:“Building Web and Desktop Applications with BlazeDS and AMF”和“BlazeDS 30-minute test drive”。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。
评论