flash 高级编程指南
此篇教程由本人在法国的朋友章鑫杰为本站提供,所有内容均由作者本人手书.网站:http://www.openvue.net btw:作者本人现从移动领域的开发,原本应还有更多的章节,但由于工作较忙,不能完成后续的章节.些教程中的四节,主要是针对macromedia组件的探讨.假如你对macromedia组件有爱好或是对你现有的开发不知到底使用哪一种方法来做,兴许会适合你.
我向来觉得Flash MX 2004是一个面向程序员,尤其是Java,C#程序员的产品,从这款产品你可以看出Macromedia的发展方向,它要让Flash及其配套的服务器端产品成为电子商务的主要开发平台。从程序员的角度学Flash MX 2004,我最关注的是它背后的程序设计模式,它用XML异常好的融合了表现层,中间层,和数据库层,是设计数据库网络应用程序,或者说电子商务类程序很好的开发平台,并提供了一套异常强盛的组件来加速开发进程,很多人学MX2004,只关注它的UI Component,这是皮毛,它的精髓在于和数据库相关的几个组件。
让我们站在高处来看一看这几个异常重要组件,大致了解一下在Flash MX 2004这么个环境下,一个典型的数据库应用程序应该怎么编。
首先,用Connector(包括XMLConnector, WebServiceConnector,RemotingConnector)来连接服务器,取得原始数据,这些原始数据一般要求是XML格式的,RemotingConnector除外,这些数据取得后,进入DataSet做一个缓存和数据格式的转变,这就是.NET和J2EE里面的Offline Database的概念,这不但可以融合不同数据源的数据,而且通过缓存可以大大提高效率。DataSet里面的数据可以通过Binding连接到UI Component上去,每个UI Component都有一个Binding面板,你可以把它们关联到DataSet。这样你只需要写一行代码就可以把数据展现给你的用户,就是:xmlconnector.trigger() 或者webservice.trigger()。Trigger命令会连接服务器并取得数据,剩下的工作因为你已经设置了Binding,所以数据自动在组件中间流动。
那么数据在客户端被修改后怎么传回服务器,进而把这些修改反映在数据库呢?Flash MX 2004为我们提供两个异常强悍的组件:RDBMSResolver和XUpdateResolver,这连个组件可以和DataSet关联,DataSet会把用户修改的数据按特定的格式传到这两个Resolver上去,RDBMSResolver用的格式是Macromedia自己定义的,很简朴的格式,你可以在他们网站上找到参考资料。XUpdateResolver用的是XUpdate格式,是一种标准格式,很多Xml数据库都用它作数据库更新语言。这样DataSet可以自动通过Resolver连接服务器来修改数据。
你看,整个过程实际上不用怎么写代码,只需要设置一些属性,拖拉一些组件,把它们邦定一下就可以了,是不是很简朴呢?
在(一)中我讲到Flash MX 2004有三种Connector,即XMLConnector, WebServiceConnector,RemotingConnector,假如你的Flash编辑环境中没有RemotingConnector,请到Macromedia的网站上去下载。
XMLConnector是最简朴的一种连接器,服务器端可以是任何语言的脚本,ASP,PHP,JSP等都可以,它的好处是服务器程序不需要加载额外的库,只要你返回的内容是XML的就可以了。这样实际上方便了程序员用最少的成本将原有的服务器端脚本稍作更新,以配合Flash富客户端。它的坏处在于,这样的脚本使前后台程序员之间的配合比较困难,因为它的接口是隐藏的,因为假如你不能和脚本开发人员密切沟通,你对接口和参数的信息就一无所知,至少不全面,甚至不知道其中是否有后门。但假如你既开发前台又开发后台另当别论,另外很多习惯于传统的Web服务器脚本开发的人员也可以比较快的上手。
我们跳过WebServiceConnector,讲讲RemotingConnector,这个连接器基于Flash Remoting 技术,有不少的朋友很热衷于Remoting技术,但我并不是很看好它。应该说Remoting 技术的设计思想和Flash的SWF文件格式的设计思想是一脉相承的。它们都极力的强调带宽的重要,对于在Internet上传输的内容要尽量的精简,压缩。因为前一阵子,我曾经想开发一个J2ME版的Flash Player,所以我对SWF格式做过比较深入的研究,它在压缩方面做的相称到位,每一个bit都尽量利用,Remoting也是希望通过二进制字节流减少传输量来提高效率,所以我说它们的出发点是相同的。Remoting在本质上属于RPC的一种,它和DCOM,CORBA,JAVA RMI属于一类的技术,不同之处在于Remoting 的通讯协议采用HTTP,这样它就具备了WebService这样的跨越多个域,跨越防火墙的功能。在效率上Remoting毋庸置疑要高于WebService,但这不是我们取舍一个技术的决定因素,要不然,DCOM,CORBA这些东西的性能更强悍,但他们在Web时代却得不到广泛的使用。另外,Remoting是Macromedia的“私有财产”,MM拥有绝对的主动权对它进行修改和扩充,就像MM对Flash格式和AS进行大刀阔斧的改革相同,开发人员是很忌讳这种事情的。虽然MM公开了Remoting AMF通讯协议的大部分内容,但它实际上故意对媒体流的传输协议秘而不宣。很多人热衷Remoting很大程度上受了MM那个视频聊天DEMO的诱惑,而实际上为了要视频聊天,你需要付出惨重的代价,首先服务器必须用MM的软件,因为没有第三方知道怎么和Flash客户端交流媒体流,而MM的服务器软件按照connection收钱,贵的吓死你,用盗版另当别论。基于以上原因,我个人比较不赞成使用Remoting.
WebServiceConnector我放在最后讲。这是目前最有前途的RPC技术,有人说WebService 是个很糟糕的技术,因为Microsoft的极力推广才有它的今天。我对此不以为然,抛开对Microsoft的成见,它所推出的技术一般都相称成功,就像现在的.NET, C#,作为一个程序员,我只能用艺术品来形容它们。WebService 也许不是一个最完美的技术,但在当下,它最适合Web分布式计算。时至今日,它已经越来越成熟,而且在很多世界级的大型项目中得到了应用和考验。一个技术它被应用的越广泛,其价值也就水涨船高,它带来的一个显著的好处在于,你可以不用被绑死在一个开发平台上,无论是服务器端还是客户端,比如假如有一天你的客户要求你用SVG或者Java Applet开发客户端,因为你在服务器端采用了WebService,就可以很快的跨越到另一个客户端技术。不要以为这种情况不太会发生,实际上假如你看过SVG 2的技术文档,你就会发现Flash有一天很可能会被它取而代之,它真的很强盛,也很适合开发富客户端应用程序,这时候你的服务器脚本假如采用了Remoting 技术,你可惨大了。再者,从开发环境而言,象VisualStudio.NET,WebSphere,JBuilder 等都对WebService提供了相称好的开发和调试环境。相对于XMLConnector,WebServiceConnector的长处还在于答应你在设计时(DesignTime)绑定(Binding)它的参数(Paremeters )和结果(Results)。比如你可以绑定你的复选框(CheckBox)到WebService的一个参数上,复选框里的选择内容被改变时,WebService被触发(Trigger),WebService连接服务器从数据库中取回新的数据更新DataSet,然后DataSet又更新和它邦定的其他组件,你看一个Master-Detail结构的数据库应用程序就这么简简朴单的生成了,这个过程你真正要动手编的程序可能只有3,4而已。
总结:假如服务器端答应,你也具备一定的WebService编程经验,最好采用WebServiceConnector。尽量避免使用Flash Remoting。XMLConnector的使用取决于你项目的详细情况,比如规模,开发模式,是否需要重用大量的已有脚本等。
我在这个教程的前几篇里面,我尽量让大家站在高处看Flash MX 2004在数据库编程方面框架性的东西,知其然知其所以然,帮大家逐步分析每一个组件它的功能和MM为什么会推出这些组件,而不是其他的。在教程的最后我会给出一个比较复杂的例子让大家动动手。
这节,我们来分析Dataset这个东西,这是MX 2004数据库编程框架里面灵魂性的组件,是核心。MM的Flash 2004出来的很晚,故此它有机会从微软的.NET和Sun的J2EE中吸取了不少养分。Dataset就是MM博采众长后搞出来的一个异常棒的数据库组件。
(1)Dataset的首要功能是在内存中部分或全部的缓存数据库镜像,缓存是提高数据库应用程序性能的最主要的途径,也是Flash应用程序区别于HTML类应用程序的一个重要特征,HTML是无状态(Stateless)语言,当你哀求下一个页面的时候,前面的状态就不存在了,由服务器从新产生所有的状态,它的坏处很多,比如我们常常遇到这样的情况,某网站让你填大堆的注册信息,一页一页,好多页,你填到一半的时候,突然网络延时,表单发不出去,怎么办?退回上一页吗?不行了,因为安全性的缘故,上一页已经过期(Expired)了,你进也不行,退也不行,怎么办?只好从头填起。还好你只是在填你的注册信息,要是你正在在线做笔交易,那方方面面的问题就大了。这也是HTML最被人诟病的地方,Flash 程序就没有这个问题,因为只要你不关了它,它的状态一直保持。Dataset就是用来保持本地数据库状态的一个很好的途径,网络延时或者暂时网络不通,没问题,咱等网络好了,再和远程数据库进行同步,你不用担心会丢失重要的数据。
(2)Dataset的另一个功能是将不同质的数据库同质化。比如一个大公司,以前它的各子公司各自为政,分别做了一套治理系统,数据区也千差万别,从Access, MySQL,SQLServer到DB2千七百怪的都有,总公司要统一做一套治理系统,但把所有数据库升级的代价很大,怎么办呢?我们可以在通过第二节所说的连接器,把不同数据源的原始数据读到Dataset中,那么对于客户端而言,数据源的差别就被弥合了,它们就被同质化,你就像操作单个数据库相同,方便得对多个数据库进行操作。
(3)数据格式转变,数据库里的原始数据往往不能直接显示,而需要经过转变,最简朴的例子就是日期,数据库返回回来的日期往往是一串长长的精确到毫秒的甚至带有时区的字符串,通常你要对它处理一下,插进去“年”,“月”,“日”等符合国人阅读习惯的文字,在Dataset中,你可以对每一个字段指定一个编码(Encoding),它可以帮你把原始数据翻译成你想要的格式。你也可以订制编码器,比如:
if (积分 < 20) return 菜鸟; else reutrn 老鸟;
这样“积分”这个字段通过编码器就被转变成了大家更能理解的文字。
(4)Dataset最强悍的功能当属它自动产生更新脚本这一项。通常的数据库应用程序,当用户做了一些修改后,你需要逐一的把它们更新到数据库里去,其过程用伪代码可能如下: for (被修改的每一行) 假如它的状态是“新增”,就执行Server.AddNew(...) 假如它的状态是“被删除”,就执行Server.Delete(...) 假如它的状态是“被更新”,就执行Server.Update(...) Dataset则不然,你把它里面的字段绑定到UI Component上后,在UI Component上做修改,Dataset会在相应的纪录(Record)和字段(Field)上做标志,然后当用户要求将修改保存到数据库的时候,Dataset把所有的修改打包,假设你事先已经将Dataset的dataPacket属性和XUpdateResolver的dataPacket属性绑定,那么当程序执行到resolver.ApplyUpdate()的时候,resolver会把DataSet的修改脚本转化成XUpdate命令发送到服务器,让服务器端程序执行相应的修改命令,并返回结果。
你有没有注重过DataHolder这个组件呢?我想看这个教程的大多数人都没有用过这个东西。我不是说它是一个和Dataset相同的异常核心的组件,但是假如你善用这个组件会有意想不到的效果。
我在学每个组件的时候都会问自己一个问题,为什么是它?MM在开发Flash MX 2004的时候,实际上网上已经有了针对Flash的大量形形色色的组件,MM在开发标准组件的时候,肯定要考虑到它要有广阔的适用范围,那么DataHolder这个玩艺儿有什么本事让MM把它纳入到标准组件里呢?在前面的几个教程里面,我一直在重复一个词:绑定。它可以让我们少写n多的代码,而且使程序易于维护。但是有些东西你没法通过绑定来实现,比如有一个文本框,它是某几个字段经过复杂计算后的结果,这时候,你一般要写些代码来手工修改这个文本框的内容。再比如,你调用一个传统的Web服务器脚本,来读取数据的时候可能需要传入参数,象这样 http://www.openvue.net/getOrderDetails.php?OrderID=233&CustomerID=8324 请注重,当你为XMLConnector设置这样的连接参数的时候,其中的OrderID和CustomerID在程序执行期间是要变化的,不是固定的,你可能需要在程序里面手工写一个字符串连接代码来设定准确的参数。
上面所说的不是一般的绑定能够实现的,DataHolder就是把这些“不可能的任务”变为可能。DataHolder相称于一个提供动态绑定的杂货铺,你可以在里面放任何东西,来提供绑定到其他组件的数据源,
以前面所举的两个例子做一下说明: (1)有一个叫“总数”的文本框,它是一个叫“单价“的文本框和一个叫“数量”的NumericStepper(这个组件中文不知道怎么叫,不好意思)乘积,那么你设置一个DataHolder,它里面放三个变量,一个叫“UnitPrice ”(单价),一个叫“Quantity ”(数量)一个叫“Total ”(总数),把“单价“文本框绑定到“UnitPrice ”,把“数量”NumericStepper绑定到“Quantity ”,把“总数”文本框绑定到“Total ”,然后写一个触发器,当UnitPrice 或者Quantity 变化时自动计算Total:
var calculateTotal = function() { dataholder.Total = dataholder.UnitPrice * dataholder.Quantity; } dataholder.AddEventListener("UnitPrice", calculateTotal); dataholder.AddEventListener("Quantity", calculateTotal);
好,现在当用户在“单价“文本框里输入数字,或者当NumericStepper里面的数值被改变时,“总数”文本框里面的数值会跟着变动。看上去还蛮智能的:) (2)连接参数的动态绑定,拖个DataHolder到Form上,DataHolder中设置3个参数(OrderID,CustomerID和OrderDetailsURL),设置一个XMLConnector,他的URL绑定到DataHolder的OrderDetailsURL上面,然后为DataHolder写个触发器:
var generateURL= function() { dataholder.OrderDetailsURL= "http://www.openvue.net/getOrderDetails.php?OrderID=" + dataholder.OrderID + "&CustomerID=" + dataholder.CustomerID; } dataholder.AddEventListener("OrderID", generateURL); dataholder.AddEventListener("CustomerID", generateURL);
这个有什么用呢,好,让我加入两个分别叫OrderID和CustomerID的文本框,这两个组件分别绑定到DataHolder中的OrderID和CustomerID,现在当用户在OrderID和CustomerID输入数字的时候你的程序就会自动产生合适的URL去到服务器上作查询,返回相应的OrderDetails。
返回类别: Flash教程 上一教程: Flash MX行为功能初体验:相册的制作 下一教程: FlashMX 视频教程(31)-实例10绘制花朵
您可以阅读与"flash 高级编程指南"相关的教程: · Flash动态遮罩高级教程 · Flash入门及学ActionScript编程的准确途径 · 了解在Flash中的编程工作 · Flash声音高级篇:NullSound技术-1 · Flash高级知识学习:ActionScript扫盲
|