面向java开发人员的flex开发指南-亚博电竞手机版
除非你过去四年的编程生涯都是在五行山下度过的,否则必定对”富互联网应用”——或按潮人的叫法“ria”——略有所闻。万一你真是如前所述的隐居型开发者,那我把重任交给google,请它帮你找出ria的正式定义。我们暂且把它定义成,具有在设计上更注重更操作性和效率的用户界面,不同于传统web应用那种“输入地址,等待网络传输一个web页面,填写表格,点击按钮,等待网络传输另一个web页面”的交互循环。ajax是一种ria,silverlight也是,但比它们出现早得多的,是adobe的flash。
因为新鲜感,对ria的关注重心,大都集中在ajax和老朋友javascript等工具。但是过去三年里,apple迅速且戏剧化崛起,并在移动市场占有主导地位,对此产生了极大挑战。以最新的浏览器技术和宽带连接为前提来建立web应用是不够的,因为连美国政府自己都做不到这两点。实际上,即使有最新的浏览器技术和最快的连接,只要开发人员打算用超越基本html的技术来开发web应用,就会突然发现自己掉进了一个泥潭,互相冲突的浏览器实现、网络延迟、几十种javascript库、错估的用户预期,劈头盖脸而来。
起源…个人选择
作为一个职业生涯中大部分时间都在关注后端的开发者,我从来都不太关心前端开发者使用的工具和技术。实际上我曾经把前端贬得一文不值,说那一头的大部分开发”除了看看像素变颜色就没有什么了”。这话比较难听,我承认,但你也应该承认,除开最近几年,传统应用的ui设计一向不是业内的时尚话题:放个表单,用户填两下子,然后提交给服务器,实质工作都是我们后端人员做的。所谓实质工作包括:验证所有的输入(免得万一用户真的是一名黑客,企图用telnet伪装浏览器来跳过所有”完美的”javascript验证逻辑);调用一些数据库和web服务,说不定还是并行的;纠合一些模板技术或视图生成技术,准备好将要返回的各种html、css和javascript片段,组装起来;最后传输回去给浏览器渲染和显示。
多美好的时光。
不过最近有几件事情发生,迫使我重新认清ui行业的现状:
- 移动设备市场——iphone、android还有windows phone——火热到如果忽视它们就意味着从软件开发行业中退休。虽然我挺想提前退休的,不过短时间内经济上不可行,还有两个小孩要上大学呢。
- 说到孩子,我的大儿子非常热衷于成为一名游戏开发者,对父子携手完成一两个游戏构想也很有兴趣。当然,对于我们这些做“大事”、搞“企业”开发的人,游戏一般不是我们关心的主题……但是除了想多花点时间跟我儿子在一起,把应用”游戏化”的概念在网络经营和市场营销的圈子里正迅速走红,因此是值得多探讨一些。
- 说到游戏,游戏有许多有意思的情况:与传统基于表单的应用相比,它们有各种各样的沟通和展示需求。当然游戏不是个例——如果能加快响应速度,甚或实现离线使用,那么很多商业应用也会受益。不管我们多么希望可以假定每个用户有永久在线的宽带连接,严峻的现实是飞机上的互联网连接十分罕见,宾馆的isp经常无缘无故消失,会议现场的无线连接太难以捉摸。事实上,公平地说,虽然我们在各种场合见到的网络连接多了,可是优质的的连接更难找了。 这种状况严重损害了传统浏览器客户端的效果。
- 最后,adobe找到了我,问我是否有兴趣从一个java开发者的角度探讨flex,深入了解它并反馈结果。充分披露原则要求我申明他们付费让我写这批文章,但是基于个人诚实原则,其实我一直想找个借口来好好了解一下flex,所以他们的邀请乐得我“屁颠儿屁颠儿的”,可以这么说。
所以,我的计划就是照他们的要求,在infoq设一个专栏,以java从业人员的眼光(而不是艺术家打扮画flash故事板的web设计师的眼光)来介绍flex,观察的角度不限于呆板的传统业务应用,还有各种不同的角度,包括游戏/游戏化,与已有的java应用程序集成,以及作为移动设备客户端技术的适用性。
我们可以开始了吗?
入门
flash平台(flex的基础)几乎像浏览器一样普及,已经安装到全世界的浏览器中接近十年时间。它被当作一种透过浏览器向不知情大众强行送上可爱动画短片、视频剪辑和奇怪游戏的手段。多年以来,要想完成html规范规定之外的任何事情,这是除java applet以外的唯一方法,而java applet的问题一点也不少。显然,flash要求用户安装一个本地插件,但这是必要的代价,况且很多用户早就为了看跳舞仓鼠或者玩其他什么可爱游戏,已经下载安装过了。
不幸,很多开发者仍将flash拒之千里,因为它最初是按照”创意”类用户的习惯设计的,采用了美工人员比较熟悉的概念,例如故事板、时间轴、动画效果等。完全没有什么表单栏、对象模型、核心验证逻辑组件之类的东西。这意味着,如果一位开发者想要利用这个平台,将不得不面对各种模样怪异的工具,陌生的术语,还有一帮子不灌可乐品咖啡的用户群。
除了外表的差异,flash平台其实和它的java表亲很相似,都有一个基于字节码的执行引擎,都被移植到多种平台。(从很多方面来看,如果java“一次编写,处处运行”的口号没有那么多“如果”,真能在客户端成为现实,那差不多就应该是flash插件的样子。)flash执行.swf(读作”swiff”)文件而不是.class或.jar文件,这种文件格式也像.class文件一样是公开的。而且几年前,adobe通过flex开发包进一步开放了flash平台,提供flex的目的是让开发者不需要使用面向美工人员的flash工具,也能轻松地创建swf。
因此,第一步是获取sdk,这个可以在adobe的网站找到。稍微观察下就可以发现,flex有几种下载,主要的不同点是授权协议模式 – 最大的”adobe flex sdk”包含若干基于adobe自定开源协议的软件,有可能不被某些组织接受,所以adobe提供了另一种下载”open source flex sdk”,基于mpl授权协议的。一般来说,除非你的组织有特殊严格要求,否则”adobe flex sdk”完全适合研究和原型开发用途,但是如果想投入商业产品应用,那么需要请律师先看一下授权协议。我们将用最新发布的flex 4.5 sdk来进行讲解;如果你还没有准备好,花点时间完成下载吧。
下载回来的sdk是一个简单的zip文件,解压到你硬盘中任何方便的位置,最好放到离其他开发工具近的地方。在我的系统里,我喜欢把所有工具都放在”prg”目录下,所以flex sdk在我的windows电脑里就放在”c:\prg\flex-4.5″的位置;请看图1-1。在该目录下存放了一系列工具和文件,看过jdk目录的开发者会觉得它的目录结构很熟悉。”bin”目录存放着开发者心爱的各种工具(所以应该将其路径放进“path”环境变量),”samples”目录下有各种示例应用,还有其他目录就不一一说明了。
图1-1
(提醒:看看图1-1中列出来的目录,文件”env.bat”是我自己创建的,用于快速设置flex命令行开发环境。它是一个简单的批处理文件,里面设置path环境变量和终端窗口标题,在windows下其内容如图1-2。它假定同一个终端窗口下已经配置好jdk和相关工具。)
图1-2
[blockquote]@set ant_home=c:\prg\apache-ant @set java_home=c:\prg\jdk_1.6.0 @set flex_home=c:\prg\flex_sdk_4.5.0.20967 @path=%flex_home%\bin;%ant_home%\bin;%java_home%\bin;%path% @title flex 4.5 prompt[/blockquote]
检验flex是否已经安装好,最快最简单的办法是运行一下”bin”里面的一个工具——mxmlc,也就是我们马上就会认识的flex编译器。所以,假设 c:\prg\flex-4.5\bin已经加到path变量,直接输入”mxmlc”,看看有没有反应;如果一切都没问题,你就会看到传统编译器”我其实没有做任何事情”的响应,看图1-3。
图1-3
代码拿来(还有工具)!
开发者遇到新平台,写的第一个程序必然是”hello world”,不仅是向先驱(kernighan和ritchie)致敬,也因为它展示了我们可以用新平台写出的最简单的程序。对于某些平台,像最初的c编译器,只要三行文本和一次命令行调用就完成了一个有意义的可执行程序;当平台变得更复杂,构建的步骤也越来越复杂。(java开发者回想起“hello,ejb!”所需的步骤,依然会不寒而栗。)flex还是比较简单的,虽然不至于只用一个文本文件就变出花来。
先搭脚手架
flex和flash之间的关系非常像java和jvm — flex是一个工具(一整套sdk,如果我们准确完整描述的话),用于生成字节码,然后和资源一起打包成适合在flash平台上运行的.swf文件。按照flash的执行方式,它需要某种执行引擎或者叫虚拟机来执行swf文件。一般来说,当遇到swf文件时,用户机器上已经安装好必要引擎/vm,但也不一定;因此,要么让用户提前安装flash平台,要么开发者在第一次运行的时候为用户即时安装平台。
从实际操作来说,前一段描述可以这么总结:对于web应用程序,swf文件需要某种类型的html脚手架来帮助它“导入”flash vm,很像java applet加载jvm的情况。以前用applet的时候,要告诉浏览器”这儿有一个applet”,然后说明jar文件的位置,最后启动正确的类。flash的所用的html脚手架与此类似,见代码段2-1,它告诉浏览器”这儿有一个flash”,然后指明要加载的swf以及相关的具体环境。
代码段 2-1
我们暂时可以忽略例中的大部分html基本骨架——关键元素在中间部分即