用Prism把网络应用本地化
较早之前听说Firefox也要效仿Chrom支持多进程浏览网页了。不过凭Mozilla的底子,要实现应该是相当容易了。这不?Mozilla现在硬生生地把网络应用变成了本地应用!
Prism就是这样一个应用转换器,她可以把GMail,Greader等变成本地的应用程序,以后我不需要在浏览器中打开Gmail也可以收Email了。用Firefox实现这个太简单了,凭她强大的XUL。
先试试创建一个Reader应用。先安装Prism的Firefox插件。
打开googleReader后,展开工具菜单,点选Convert website to Application。

弹出配置窗口,并于程序界面、快捷方式和程序图标的一些设置。。为了让它看起来更像桌面程序,我就不选生成导航栏,甚至状态栏我也不要了。最后创建程序到桌面。

确定后在桌面生成一个google reader.app的应用程序,双击打开就是一个本地的Google Reader应用程序了。。界面截图如下:

此刻我想起了Adobe Air,诞生时让无数人惊艳的RIA神器,我开始知道,原来网络应用也可以变成桌面应用。
我知道Prism和Air是两款截然不同的产品,他们主要面对的用户群体也不一样,Prism对网络应用的最终用户友好,而Air是对网络应用的开发者友好,只是我想说,她们的最终目的都是为了最终客户。
Prism + Gear > Air?
不是开玩笑。Prism + Gear组合,仅需要开发一次,网络、桌面版应用均可使用,而Air只适合开发桌面应用,如桌面版的Ebay,就是用Air重新开发一套本地UI的。Prism + Gear(或其他嵌入式DB)后,Air只剩下“用户界面在本地”的优势了。
也许我不应该就Prism这么小的产品长篇大论,因为现在,桌面应用与网络应用的界限已经越来越模糊了。其实Prims只是给每个应用程序创建了一个独立进程罢了。。呵呵。
关于AMF与BlazeDS
AMF是Action Message Format的简称,它是flash专有的数据传输格式,简单的可以理解为类似XML这样的数据格式,不过XML是纯文本,任何一种语言都通用,而AMF是二进制数据,为flash专用.
为什么又有新的数据格式?
有XML不够么?跨语言,世界范围的标准.而且一直以来,我们都是使用XML作为Flash与服务器端通讯的,这个AMF好在哪里,而且还是专用的!
AMF在作为一种数据结构,从通用性上来讲,肯定比不过XML,不过这种协议是专门服务于flash的客户端应用程序,它有两个大优点:
一,比XML等传输协议更优秀的传输性能.AMF能够缓解由基于文本导致的传输瓶颈问题.这可以有证据的哦.
二,更少的数据层抽象代码,甚至不需要反序列化的代码.使用XML类的协议编程时,避免不了有一个数据反序列化的过程,使无意义的数据片段变成有意义的Flash对象,数据模型多的时候可不是一件轻松的事情,想象一下,现在完全不用去管XML,只需要定义一个远程对象即可马上调用,这个过程节省多少成本?!
下图是XML与AMF传输过程的对照:

基于上面两个优点,AMF如今获得许多开发人员的认可,不少服务器端语言也提供了AMF的适配框架,如pythonAMF和下面要介绍的BlazeDS.
BlazeDS
BlazeDS是Adobe公司亲自开发并开源的AMF-Java适配框架.为flash提供java服务器端的简单远程调用能力和实现java对象与actionScript对象的转换.
使用BlazeDS很简单,其核心是一个服务器端的主配置文件:WEB-INF/flex下面的config.xml.示例片断如下:
xml 代码
- <destination id="HelloWorld">
- <properties>
- <source>HelloWorld</source>
- </properties>
- </destination>
这样在flash客户端可以通过声明一个远程对象"HelloWorld"来调用服务器端的方法获得返回值.
更详细的使用说明有兴趣的同学看文档吧.
另外不得不提的是BlazeDS在消息处理上面比较优秀,客户端可以发送消息到服务器端的同时,BlazeDS会在服务器端把消息主动push到客户端.具体实现暂时没有考究,不过用来做即时通讯的客户端支持还是挺有用的.
问题
被Spring和hibernate惯坏了的java程序员一定很关心:
BlazeDS的配置文件里面可以使用Spring Bean吗?这是我最关心的事情,因为现在的java web程序大部分都采用spring作为基础架构了,许多第三方的工具和框架都提供了spring的兼容方法.这是BlazeDS不能避免的.不过,现在的blazeDS还不是成熟的版本,不知道以后会不会提供?
使用BlazeDS肯定享受不了hibernate的lazyload了!目前看来是不行的.
flex编程小心得
从真正学到初步完成作品不过就两天半,大气不敢出,先记一记过程的一些所得.
一,当你用Shape画完一个矩形后,想要给它加上一些类如mouseOver,mouseOut的事件,你发现这个图形居然不支持.其实你需要的是InteractiveObject类或及子类.嗯.有交互性质的对象才会提供这样的事件.可以使用Sprite来代替掉Shape哦.
二,通过设置useHandCursor=true以及buttonMode=true,可使光标移到该对象上面时光标变为手状.
三,其实Dictionary并不比Object好用.new Object()完全当字典用.Dictionary有点娇气.
四,as3解释xml很好很强大.
tag.subtag 获得子结点
tag.@attribute 获得结点属性值
tag.(@id=1).subtag 按条件查找某一个结点
等等...
我是把整个xml加载到内存当作活生生的业务对象来使用了,动不动就查找一下.很过瘾.
五,Shape,Sprite等非控件类的元件不能直接使用addChild()方法将其加到application下面,在flash cs3下可以,flex下的做法是创建一个UIComponent作为这些元件的容器,将这些元件加到该容器中才可行.新手最头疼的是这个,有可能半天搞不清楚为什么明明加了就是不显示,实际上提示了TypeError.
六,通常情况下可以忘记flash的层次结构,最后加进来的元件总在最上面.我的做法是把元件都初始化完,有需要的时候就addChild,需要隐藏就removeChild完事.省去设置层数的烦恼.
七,可以这样来设置鼠标的样式,不过我试完之后发现不适合我 :)
[Embed(source="图标名")]
private var MouseIcon:Class;
private function iinitApp(event:Event):void{
CursorManager.setCursor(MouseIcon);
}
七,文档很重要,特别是livedoc和我最重要的api文档.
http://livedocs.adobe.com/flex/3/
http://livedocs.adobe.com/flex/3/langref/index.html
空气啊空气
毫无疑问,Adobe Air的凌空出世绝对是给RIA领域注入了新鲜血液,名副其实,给开发者带来了新鲜空气。
几天前得知Air的1.0版本的释出,看了些Demo,大喜过望,然后翘起二郎腿就暇想着以后桌面程序开发的几种杀手技:
一、使用现有的浏览器端的Ajax技术开发桌面应用程序。用已经很成熟的Extjs2.0.2来开发可以一举两得,既可在Web上跑,又可在桌面上跑。如果没用过Extjs,没所谓,最原始的Html + Js + Css就可以了,不过为了可以使用离线存储和更多的UI功能,建议使用Adobe自家的spry框架。
二、如果你早早你学了Flex,那也没关系,Air对Flex的兼容更好,毕竟Air和Flex是同门师兄弟。
三、Flash?Action Script?太好了,还是自家人。
四、远程调用方面,Ajax够用了,非得要Webservice的话,还不如用现在流行的REST风格(流行得有点畸形了,都是为REST而REST)的Webservice,基于HTTP,对于Javascript而言,还是XMR罢了。
可以看出Air的野心有多大了吧,直接把Web移到桌面上来了,开发者还不需要学习新的语言或框架,仅对我而言,吸引力还是相当大的。
可是我测试Air应用的时候(包括Extjs2.0.2的Air Sample及著名的Agile Agenda)发现都不能接受中文输入,我使用的是五笔加加和Google拼音。居然连粘贴也不行。不知是否和我机器有关系,真宁愿是我RP有问题。如果真的是不兼容中文输入法,那么,这个“空气”就真的变成空气了。。只能下回再见了~~~