Java 程序员学习 Flex 和 BlazeDS 的十三个理由

阅读数:23075 2009 年 5 月 18 日

话题:Java语言 & 开发

本文列述了 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,只需要完成下面两个步骤:

  1. 解压缩 BlazeDS WAR 文件的内容:jar xvf blazeds.war。
  2. 把 JAR 文件都拷贝到项目的 lib 文件夹下:cp -R WEB-INF/lib /sodaSample。

理由八:可以在已有 Java 应用中运用

比方说这个简单的苏打调配系统,假设你想要扩展这个已开发好的服务,让其它 Flex 应用可以远程调用。在现成的应用中配置 BlazeDS 的基本步骤有:

  1. 修改WEB-INF/flex文件夹下的 BlazeDS 配置文件
  2. 在该应用对应的 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 或fflashVarsf 来实现。Flex 应用能够读取由 HTML 页面设置的fflashVarsf。

比方说你想要通过 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 中文站用户讨论组中与我们的编辑和其他读者朋友交流。