BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Ryan Knight 关注 0 他的粉丝 ,译者 沙晓兰 关注 0 他的粉丝 发布于 2009年5月19日. 估计阅读时间: 19 分钟 | 都知道硅谷人工智能做的好,你知道 硅谷的运维技术 也值得参考吗?QCon上海带你探索其中的奥义

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

不看好! by 陈 建闽

目前不看好,开发上不是很简便!
重复写代码!

Re: 不看好! by hao Iron

不看好,企业应用基本没有用的。。

不好用 by Shine Jimmy

感觉在编程方式以及实际的使用上并不友好。

Re: 不看好! by 林 冲

重复写代码?如果配置上的重复,我建议你去看看spring-flex这个项目,文章上也写有。

如果是代码的重复追求完全工业化的生产方式,去看看spring的mvc框架。

剩下来唯一的重复就是一个java pojo对应一个as pojo的问题。
本人觉得根本就不是一个问题。看看dto模式再回头想这个问题吧

Re: 不看好! by 林 冲

企业应用完全好使。本人以前公司已经完全使用flex来做企业级开发(公司规模300人)。因为flex,以前写js写到焦头烂额的情况已经不复存在。做flex就像做c/s项目,地球人都知道c/s比b/s开发得快,容易。

Re: 不好用 by 林 冲

使用任何一种新的,不同以前使用习惯的语言。都是有阵痛的。但想想往后的收益,你就知道这是值得的。程序员应该都是杂学家,不单单是flex,有时间任何先进的语言工具都玩一下,python ruby等等。编程是一理通百理明的

看过blazeds的源代码再决定把。 by TT T

写的实在是。。。

只是证明AMF比其它解决方案快。比比hessian或者其它的amf或者binary 解决方案吧。

Re: 不看好! by 林 冲

写错,应该是去看看flex的mvc框架

非常有兴趣尝试一下 by shao stone

非常有意思。UI使用flex实现,后台java来做,是不是一个非常完美的组合呢?

Re: 非常有兴趣尝试一下 by 陈 建闽

不完美!
不抗压!

maybe by - 博文 1公子

如果真那么强,应该搞个好IDE,目前我用了好几个版本的eclipse都装不上破flex插件的

Re: maybe by Zhuang Johnny

你装不上就说Flex破,那我可以说你垃圾不呢?

Re: 不看好! by 涛 陈

你先用了再说吧,什么不看好,用么没用过,乱说

flex太简单 by wang xin

flex太简单,可定制性不高,不适合创建复杂界面

flex 前景光明 by 胡 顺风

就像JVM之余java,可以让java无限的发挥它的威力,既然flash player已经占领用户的客户端,那flex的潜力无穷,只要adobe运作的好,只要能够持续的挖掘flex的潜力,那flex极有前景

Flex 不看好 by tang daibing

对这个东西不怎么看好。

Re: 不看好! by shen bona

重复写代码?如果配置上的重复,我建议你去看看spring-flex这个项目,文章上也写有。

如果是代码的重复追求完全工业化的生产方式,去看看spring的mvc框架。

剩下来唯一的重复就是一个java pojo对应一个as pojo的问题。
本人觉得根本就不是一个问题。看看dto模式再回头想这个问题吧

你可以尝试看看Granite Data Service,其中就有一个工具支持自动产生AS代码,尤其是领域模型。

说实话,说不好用的,肯定是flex完全没入门的 by qi li

对于一知半解的东西,这些人根本没有发言权

Flex by fan fan

等html5出来了,flex会很痛苦。不是标准就是让人不放心啊

Re: Flex by Lin Magix

HTML5的出世将加速FLEX的淘汰.

另一个编程玩具吗 by Wang Lei

Flex接触不多,还没投入时间玩,不知道是不是另一个玩具,对于具体定制的需求是否难以实现或会用一些不得已的丑陋的办法。

Re: Flex by bin zhang

用过FLEX吗

Re: 不看好! by bin zhang

好好Google 1下看看谁在用
不知道Oracle 和SAP 算不算公司

Re: maybe by bin zhang

相当有道理!Windows XP 能装上吧?MS Office能装上吗?

基于RIA Flex Flash 平台开发的进销存企业信息管理系统开发经验 by tangu soft

基于RIA Flex Flash 平台开发的进销存企业信息管理系统开发经验
(欢迎转载,转载请注明作者,尊重版权)

关键字: RIA Flex 应用成功案例 实际项目

四,基于Flex的进销存系统演示地址

www.tangusoft.com/Demo/

作者www.tangusoft.com

一. 中小企业进销存系统和运行平台以及技术架构

1. 中小企业进销存系统特点:
a. 目标客户
零售批发中小企业,企业规模人数500人以下,销售额1500万元以下。
b. 数据操作频繁
每天频繁操作销售和采购以及仓库出入库,经常需要查看企业基本信息,包括商品信息,客户供应商信息,应收应付。并且需要快捷的操作系统。
c.存储数据量有限
商品信息大概5000条,客户供应商大概1000,
每天单据信息大概50条,每年单据信息大概20000条
d.并发操作用户数量固定
销售员,采购员,经理,财务,大概20人左右。
e. 用户使用地点不同
需要直接方便浏览器访问系统
f. 客户浏览器处理功能强大
目前客户电脑普遍内存1G, 处理器 双核2.0 以上
g.中小企业普遍软件预算不高
同时也尽量避免盗版软件引起的法律诉讼和纠纷。

2. 运行平台和系统架构
根据中小企业进销存系统的众多特点,同时考虑技术成熟度和新技术风险,我们决定采取以下运行平台和系统架构
运行平台 Linux Apache Tomcat Mysql
系统架构
表现层Flex 3
数据处理和控制层Blazds + Spring + Ibatis

Flex/Flash 具有以下优点
客户端 界面友好,数据表现能力强大,处理能力强大,有一定的缓存数量的能力,减少服务器请求次数,节省不必要的网络传输。
BlazDS 能够处理并发用户的请求,并且能够压缩数据。
Spring 声明性的代码配置,减少系统维护工作量
Ibatis 减少实际编码,考虑以后支持多种商业数据库

运行平台免费,企业零预算。

二,框架和代码生成器
1. 选择成熟的Flex 框架

cairngorm 和 pure MVC 是目前成熟的open source 框架。
基于Adobe 支持和维护cairngorm,所以采用cairngorm
同时cairngorm 对view 表现层 和 control 控制层 的 隔离和耦合没有成熟的解决方案,开发过程我们曾经使用ViewControllerHelper ,用addListener监听器监听event 事件的执行,实际过程发现代码维护成本太高,遂中途放弃。
最后我们同时引进universal mind cairngorm作为补充辅助框架。
2. Ibatis 代码生成器
选择Abator
三,解决方案
1. 客户端尽可能使用单例模式
减少不必要的客户端内存开销
2. 适度利用客户端缓存
对于商品以及客户供应商, Flex 缓存这些数据,各模块共享数据。
3. 尽可能的采用lazy load 惰性载入数据
很多Flex 系统采用初始化时候一次性载入系统所需要数据,结果导致延长用户登录时间,用户体验非常的差。
4. 不要过度依赖客户端处理能力
特别是大数据排序或者处理请求大数据能力的时候,flex 很容易导致浏览器停顿和不响应。请把大数据排序放在Java或者数据库端,适度的分页分段向服务器请求数据。
5. 最大有效的利用Flex 3新的类库。
减少开发工作量。
例如利用arraycollection 内置的filerfunction 进行查找数据。
6. 定制开发一些特有的控件
带合计栏的datagrid
能模糊查询的combobox
7.报表开发
使用成熟的jasper report 框架。
8. 用户权限的开发
动态创建用户所能操作的模块,而不是简单控制模块的可见和不可见属性
9. 减少生成swf 大小
使用runtime shared library 编译swf
10. 开发模块组件化
判断标准是没有出现冗余重复模块代,application mxml 文件代码简洁
11. 模块之间的数据和方法调用

A模块引用B模块的数据d和方法f,避免简单的调用B.d 和 B.f
需要采用数据和方法的传递,以免多层次的模块数据和方法调用导致代码的复杂。
12 使用resource bundle
标签和文本以及提示从resource 文件读取。

Re: 基于RIA Flex Flash 平台开发的进销存企业信息管理系统开发经验 by 胡 元龙

有没有源代码,跪求,

Re: 基于RIA Flex Flash 平台开发的进销存企业信息管理系统开发经验 by 胡 元龙

我的邮箱yuanlonghuly@163.com

Re: 基于RIA Flex Flash 平台开发的进销存企业信息管理系统开发经验 by 董 萬鹏

能否谈谈你实际的应用效果啊?谢谢!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

28 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT