写点什么

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

2009 年 5 月 18 日

本文列述了 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 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009 年 5 月 18 日 02:5523393
用户头像

发布了 71 篇内容, 共 16.4 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

《运气的秘密》笔记

dowell87

28天写作

JavaScript02 - js的引入方式

桃夭十一里

JavaScript

JavaScript03 - window对象的方法

桃夭十一里

JavaScript

技术人员如何写好周报

猿话

[5/28]产品运维保障体系的质量实践

俊毅

我们为什么打比方

石云升

28天写作 确认偏误 打比方

这份30天获得40k+星,多次登上榜首的算法宝典,带你刷爆LeetCode

Crud的程序员

程序员 架构 算法

电商网站商品管理(二)多种搜索方式

escray

elasticsearch elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

为什么印度不会成为世界工厂?

JiangX

印度 28天写作 世界工厂

自动驾驶分级,小白能理解的那种(28天写作 Day8/28)

mtfelix

自动驾驶 28天写作

在GitHub中向开源项目提交PR的过程

worry

GitHub pull request

【得物技术】代码覆盖率原理与得物app实践

得物技术

测试 原理 代码 得物技术 覆盖率

阿里表哥甩我一份Redis笔记,看完还进不了阿里让我卖豆腐去

互联网架构师小马

Java 数据库 nosql redis 面试

限时开放!阿里P8大师终于把这份微服务架构与实践第2版PDF分享出来了

云流

Java 编程 程序员 微服务 架构师

也谈Python编码格式

InfoQ_36e3087a4d44

Python 编码格式

使用nodejs和express搭建http web服务

程序那些事

HTTP nodejs 异步IO 程序那些事 web服务

详解HDFS3.x新特性-纠删码

五分钟学大数据

hadoop hdfs

案例研究之聊聊 QLExpress 源码 (七)

小诚信驿站

聊聊架构 规则引擎 28天写作 QLExpress源码 聊聊源码

架构师第八周总结

Geek_xq

超越身边80%的人,其实没有你想象的那么难

flyer0126

认知提升 成长笔记 28天写作

技术创新是PC市场发展基石,英特尔占据明显领先优势

intel001

区块链2021狂想曲:迎接以技术为名的春天

脑极体

使用 kubectl-rabbitmq 部署和运维 K8S 上的 RabbitMQ 集群

郭旭东

RabbitMQ kubectl kubectl plugin

IO和NIO的对比篇

Java架构师迁哥

Python列表对象入门

老赵

28天写作

Spring Boot 集成Thymeleaf模板引擎

倪升武

Java springboot SpringBoot 2 thymeleaf 28天写作

JavaScript01 - 基础

桃夭十一里

JavaScript

2021字节、华为、滴滴Java内部面试题(含答案),新鲜出炉!

比伯

Java 编程 架构 面试 程序人生

一文带你学会AQS和并发工具类的关系

伯阳

AQS java 并发 ReentrantLock 多线程高并发 lock锁

APICloud AVM多端开发 |《生鲜电商app开发》项目源码教程

APICloud

前端开发 移动开发 APP开发 APICloud

Java并发编程实战(4)- 死锁

技术修行者

Java 并发编程 多线程 死锁

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

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