查看: 2522|回复: 0

Flash AS3中数据发送与接收

[复制链接]
发表于 2009-5-15 02:05:21 | 显示全部楼层 |阅读模式
先回顾一下as2中相关的解决办法<br /><br />相信大部分人用的都是LoadVars类吧<br /><br />1 var xianshi_lv = new LoadVars();<br />2 xianshi_lv.bianliang1 = &quot;变量一&quot;;<br />3 xianshi_lv.bianliang2 = &quot;变量二&quot;;<br />4 xianshi_lv.bianliang3 = &quot;变量三&quot;;<br />5 xianshi_lv.sendAndLoad(&quot;http://10.7.87.222/show.asp? bianliang=&quot;+random(9999), xianshi_lv, &quot;post&quot;);<br />6 xianshi_lv.onLoad = function(chenggong:Boolean) {<br />7   if (chenggong) {<br />8    trace(xianshi_lv)<br />9          };<br />                                                                        }<br /><br />第1行:定义LoadVars对象,这家伙在as2时代几乎把所有连接外部数据的事情都做完了。无敌!<br />第2 3 4 行:在LoadVars对象中存储变量,直接发送到外部脚本中。<br />第5行:执行sendAndLoad方法,意思是send后,load回调的数据。<br />第6行:onLoad事件,判断load回调数据,<br />第7行:判断load回调是否成功。<br />在as2时代,LoadVars类把存储变量,连接外部数据,接受回调数据这些事情都做完了。笔者也弄很久的as2,觉得这方法不错,学习起来也很简单。<br />但是as3不同,为了分工清晰,把上面的存储变量,连接外部数据,接受回调数据这几个事情都分散开了。一定程度上,本人觉得有点麻烦。不知道adobe是怎么想的。也许是本人还没发现adobe的真正意图·<br />既然as3来了,还是按他的规矩办吧<br />他是什么规矩呢?<br /><br />第一部分:准备发送数据<br /><br />1:考虑连接的外部url地址了。<br /><br />as2中把url地址,变量,通通写到LoadVars类里面。变量少没什么,要是变量多起来,那就有点麻烦,遇上要动态修改变量那更加麻烦了。as3索性把把这一部分又分为两块,统一到URLRequest对象里面。单纯的url地址用URLRequest.url表示,变量用URLRequest.data表示。修改起来方便许多。<br /><br />注意url地址也可以在使用URLRequest构造函数的时候写进去。<br /><br />2:数据传送方法,post还是get。<br /><br />as3狠了心了,要把它分的彻彻底底。把传送方法也弄到URLRequest对象里面去。用URLRequest对象的method属性表示。<br /><br />同时也有两种定义改属性的方法:<br /><br />request.method = URLRequestMethod.POST;//帮助文件中多用这种定义方式<br />request.method = &quot;post&quot;;<br /><br />以上两句是等效的。你可以试试trace(URLRequestMethod.POST)。输入是 post。<br />由于as3的默认method是get,建议都显示定义为post。<br /><br />第二部分:发送数据<br /><br />1:整合send和load,就用一个load()。<br />as2中,有单独的load()和send(),还有sendAnaLoad()。个人觉得前两个函数没用,既然是和外部数据通讯,每一个与外部的连接中,都需要检查flash的状态和外部数据的状态,才能保证双方的通信正常。那么load()和send()就丢掉,用一个就行了。ADOBE把剩下的sendAndLoad()统一改成load(),不仅逻辑结构上更加合理,就连书写都简单了一半。<br /><br />相关语法:<br />URLLoader () 构造函数 <br />public 函数 URLLoader(request:URLRequest = null)<br /><br />注意括号中是个URLRequest对象。已经把url地址,变量,方法都包括进去了。URLLoader对象现在执行的就是连接数据,接受数据两个事情,其他的都交给URLRequest对象管理。因为URLLoader对象还有很多事情要做,比如侦听连接数据和接受数据的情况,是否已经完成操作,或者已经完成到什么程度。在这里就大有文章了,各种各样的loading都需要URLLoader对象的bytesLoaded属性和bytesTotal 属性实现。所以说,as3的分工还是很有道理的。<br />  <br /><br />下面给出准备数据,连接外部数据的典型代码.接受数据处理数据将在下一步讨论<br />var request:URLRequest = new URLRequest(&quot;http://10.7.87.222/test.asp&quot;);<br />//request.contentType = &quot;text/xml&quot;;//这句代码可以自己单独尝试一下。笔者初学,也没详细去研究这个。只知道传递接收xml数据的时候有用。呵呵<br />request.data = &quot;bianliang=100&quot;;<br />request.method = &quotOST&quot;;<br />var loader:URLLoader = new URLLoader();<br />loader.load(request);<br /><br />附asp代码,需要在iis5以上服务器上测试.保存文件为 UTF-8编码,文件名为test.asp.位于站点根目录下.<br /><br /><br /><br />第三部分:接受数据<br /><br />我想提示的有两点是:<br />1 数据需要加载完成以后,才能被flash使用.<br />   所以一定要判断是否加载完成<br />   但是所用的语句与as2已经完全不同了.<br />   as2使用onLoad事件<br />   as3代码如下<br /><br />loader.addEventListener(Event.COMPLETE,completeHandler);<br />   function completeHandler(event:Event):void {<br />       trace(loader.data);<br />   }<br /><br />目前大家只要认识到数据的加载情况必须用事件侦听就行了.<br /><br />其实as3中的交互事件,都已经采用上面代码所有的事件侦听模式.<br /><br />2 需要区分 URLRequest类的data属性与URLLoader类的data属性<br />   前者是表示传递变量的一个集合,后者是接受到的数据的一个集合.<br />   别搞混就行了.<br /><br />   如果这一部分要深入下去,涉及的东西就比较多了.<br />   包括xml的处理,和字符串的处理.<br />   各位可以先把上面说的东西先弄熟悉了.<br />   然后再学习怎么处理数据,以便flash使用.<br />   再此就不再过多叙述了,因为已经跑题了.<br />差不多讲完了?<br />NO ,我想还有个东西需要单独提出来说说<br /><br />第四部分:如何组织发送的变量?<br /><br />as2中的loadvars类,它是用n个属性保存变量<br />as3使用URLRequest类的data属性保存变量.<br />使用一个属性保存变量?<br />更绝的是,该data属性是一个object值.靠!<br />理论上说,我们已经可以把as3中的任意东西传送给外部脚本.<br />现实一点来说,<br />将data属性定义为一个string类型,<br />就已经能实现我们的简单需求了<br />比如传递多个变量<br />URLRequest.data=&quot;变量1=1&amp;变量2=2&amp;变量3=3&quot;,<br />只要会一定的字符串操作,就能很好的组织自己想发送的数据了.<br />站巨人肩上,我们再想一下<br />如果有n个变量,(n的值可以让人操作n个字符串的时候发狂.呵呵)<br />如果是loadvars类,那没办法,还是老老实实的一个一个写吧<br />as3中,怎么弄?怎么弄?怎么弄?怎么弄?怎么弄?怎么弄?<br />既然data属性是个object值.<br />又需要保存很多数据.<br />那么有个词已经呼之欲出了<br />数组!<br />说到这里我就卡住了,<br />我再考虑,数组这部分究竟就该详细的说一下 ,还是略去.<br />考虑2分钟.................<br /><br />既然能学到今天的as3想必已经是as2老手了,数组操作不讲也罢了<br />如果是新手刚入门,估计您应该先去as2版块找找数组的资料<br />呵呵 小弟这里就偷偷懒 见谅了<br /><br />最后提示一个:<br />如果你还是喜欢as2的书写方式。<br />as3还是可以满足你的。<br />参考URLVariables类。<br />代码如下:<br />var variables:URLVariables = new URLVariables();<br />            variables.exampleSessionId = new Date().getTime();<br />            variables.exampleUserLabel = &quot;guest&quot;;<br />            request.data = variables;<br /><br />前面3句代码似曾相识吧<br />完全和as2的loadvars类一样,<br />只不过最后还是需要把URLVariables对象赋值给URLRequest对象的data属性。<br />URLRequest.data中大有文章,它是一个Object值。理论上来说就可以传递任何东西,无论是可视对象还是不可视的其他对象(各种类),但是对于与外部脚本通信来说,我们需要的仅仅是name=value 如此格式的字符串,然后用 &amp;符号连接而已。<br />在As3中组织需要传递的变量,推荐的做法是用URLVariables类。<br />说白了,就是剥夺了政治权利的 LoadVars类,然后给改名成了URLVariables类。<br />详细的方法和属性,参考一下帮助文件就行了<br />下面给出一个范例代码,也是在上文中出现过的:<br /><br />var request:URLLoader=new URLLoader<br />var variables:URLVariables = new URLVariables();<br />variables.变量一 =  &quot;变量一&quot;<br />variables.变量一 =  &quot;变量二&quot;;<br />request.data = variables;<br />trace(variables)<br />trace(request.data)<br />从trace的结果应该知道,variables已经将自己的几个属性以及属性值用&amp;连接起来了。<br />当初我还以为可以在URLRequest.data上大做文章,随着进一步的学习和实验,发现,其实用数组来组织需要传递的变量其实没什么必要了,也不能直接实现。<br />为什么说不能直接实现呢?看一个例子就知道了<br />下面我们令URLRequest.data等于一个数组,看代码:<br />var my_arr:Array=new Array();<br />my_arr[0]= &quot;123&quot;<br />my_arr[1]= &quot;456&quot;<br />var request:URLLoader=new URLLoader<br />request.data=my_arr<br />trace(my_arr)<br />trace(request.data)<br />Trace结果都是 123,456<br /><br />这样的结果用于传递变量到外部脚本肯定是不能用的。<br />外部脚本能够接受的变量形式首先要求是name=value配对,然后是用&amp;连接。<br />相对于能自动组织变量的URLVariables类来说,用数组的方法真是有点麻烦。<br />但是我们还是要看到数组操作的好处,能遍历,能循环操作。<br />所以,小弟认为只要您需要的数据能用一个通项(或者多个参数)来表示或者具有一定的规律,可以用数学关系描述,用数组也能为你提高工作效率。<br />但是我们还需要对数组进行一定的加工,才能用。<br />加工步骤一:<br /><br />var my_arr:Array=new Array();<br />my_arr[0]= &quot;变量一=123&quot;;<br />my_arr[1]= &quot;变量二=456&quot;; <br />数组各项采用name=value形式,<br /><br />加工步骤二:<br /><br />var a:Number=my_arr.length;<br />var i:Number<br />my_arr[a]=&quot;&quot;;<br />for (i=0; i<br />    my_arr[a]= my_arr[a]+ my_arr+&quot;&amp;&quot;;<br />}<br />trace(my_arr[a]);<br /><br />遍历所有数组项,用&amp;符号连接各项,并添加到该数组的最后一项。<br />Trace得到变量一=123&amp;变量二=456&amp;,这样就已经得到符合要求的字符串了。<br /><br />加工步骤三:<br />var my_urlloader:URLLoader=new URLLoader()<br />my_urlloader.data=my_arr[a]<br />trace(my_urlloader.data)<br /><br />将上面数组的最后一项赋值,即变量一=123&amp;变量二=456&amp;,给my_urlloader.data<br /><br />初看起来,确实很麻烦。<br />偶无聊,于是给Array类prototype了一个新方法toloadvars,把上面说到的几个步骤,进行了一定的集成,如下:<br /><br />Array.prototype.toloadvars=function(URLrequest:URLRequest){<br />       var i:Number<br />       var a:Number=this.length<br />       this[a]=&quot;&quot;<br />       for(i=0;i<br />       this[a]=this[a]+this+&quot;&amp;&quot;<br />       }<br />       URLrequest.data=this[a]<br />      return URLrequest.data<br />  };<br /><br />看看怎么用吧?新手又必要看,老鸟别笑我<br />举个例子:<br />Array.prototype.toloadvars=function(URLrequest:URLRequest){<br />       var i:Number<br />       var a:Number=this.length<br />       this[a]=&quot;&quot;<br />       for(i=0;i<br />       this[a]=this[a]+this+&quot;&amp;&quot;<br />       }<br />       URLrequest.data=this[a]<br />      return URLrequest.data<br />  };<br />var arr:Array=new Array();<br />arr[0]=&quot;a=123&quot;<br />arr[1]=&quot;b=456&quot;<br />arr[2]=&quot;c=789&quot;<br />arr[3]=&quot;d=abc&quot;<br />var my_url:URLRequest=new URLRequest()<br />arr.toloadvars(my_url);<br />trace(my_url.data)<br /><br />第一步:把新定义的toloadvars方法复制到动作面板顶部,<br />第二步:定义数组,用来组织变量,注意格式。这里就看个人发挥了。用的好,能大大提高效率。<br />第三步:定义URLRequest对象<br />第四步:调用数组的toloadvars方法,传递参数是my_url对象。<br />然后就开始执行自定义的toloadvars方法了,<br />该方法将自动将数组中定义的每一个变量,用&amp;连接起来,然后将连接后的结果送到URLrequest.data属性里面。<br />最后提示:最好将URLRequest对象的url,method都定义好,然后用数组组织变量,然后用toloadvars方法。这个思路会稍微清晰点,不会混乱。<br /><br /><blockquote class="blockquote">From: http://www.photoep.cn/read.php?tid=110  Powered by PHPWind.com</blockquote>
回复

使用道具 举报

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部