收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 8064|回复: 20

[AS3] ★数据发送,接受学习笔记<完成>(URLLoader类,URLRequestl类,URLVariables类)

[复制链接]
发表于 2007-10-5 22:44:33 | 显示全部楼层 |阅读模式
昨天晚上开始写的这个东西,
写完了发现原来mirycat已经写过了
使用 URLRequest 和 URLLoader 与服务器交互     
http://bbs.blueidea.com/viewthread.php?tid=2643833

不过我发现我和mirycat写的有不同的特点
所以还是发出来,呵呵 希望能对学习as3的新手有点帮助.
===========================================================
===========================================================
===========================================================
先回顾一下as2中相关的解决办法
相信大部分人用的都是LoadVars类吧

  1. 1 var xianshi_lv = new LoadVars();
  2. 2 xianshi_lv.bianliang1 = "变量一";
  3. 3 xianshi_lv.bianliang2 = "变量二";
  4. 4 xianshi_lv.bianliang3 = "变量三";
  5. 5 xianshi_lv.sendAndLoad("http://10.7.87.222/show.asp? bianliang="+random(9999), xianshi_lv, "post");
  6. 6 xianshi_lv.onLoad = function(chenggong:Boolean) {
  7. 7   if (chenggong) {
  8. 8        trace(xianshi_lv)
  9. 9              };
  10.                                                                         }
复制代码

第1行:定义LoadVars对象,这家伙在as2时代几乎把所有连接外部数据的事情都做完了。无敌!
第2 3 4 行:在LoadVars对象中存储变量,直接发送到外部脚本中。
第5行:执行sendAndLoad方法,意思是send后,load回调的数据。
第6行:onLoad事件,判断load回调数据,
第7行:判断load回调是否成功。

在as2时代,LoadVars类把存储变量,连接外部数据,接受回调数据这些事情都做完了。笔者也弄很久的as2,觉得这方法不错,学习起来也很简单。
但是as3不同,为了分工清晰,把上面的存储变量,连接外部数据,接受回调数据这几个事情都分散开了。一定程度上,本人觉得有点麻烦。不知道adobe是怎么想的。也许是本人还没发现adobe的真正意图·
既然as3来了,还是按他的规矩办吧
他是什么规矩呢?
============================================================
第一部分:准备发送数据

1:考虑连接的外部url地址了。
   as2中把url地址,变量,通通写到LoadVars类里面。变量少没什么,要是变量多起来,那就有点麻烦,遇上要动态修改变量那更加麻烦了。as3索性把把这一部分又分为两块,统一到URLRequest对象里面。单纯的url地址用URLRequest.url表示,变量用URLRequest.data表示。修改起来方便许多。
   注意url地址也可以在使用URLRequest构造函数的时候写进去。
2:数据传送方法,post还是get。
   as3狠了心了,要把它分的彻彻底底。把传送方法也弄到URLRequest对象里面去。用URLRequest对象的method属性表示。
   同时也有两种定义改属性的方法,
  1. request.method = URLRequestMethod.POST;//帮助文件中多用这种定义方式
  2.    request.method = "post";
复制代码

   以上两句是等效的。你可以试试trace(URLRequestMethod.POST)。输入是 post。
   由于as3的默认method是get,建议都显示定义为post。

第二部分:发送数据
1:整合send和load,就用一个load()。
as2中,有单独的load()和send(),还有sendAnaLoad()。个人觉得前两个函数没用,既然是和外部数据通讯,每一个与外部的连接中,都需要检查flash的状态和外部数据的状态,才能保证双方的通信正常。那么load()和send()就丢掉,用一个就行了。ADOBE把剩下的sendAndLoad()统一改成load(),不仅逻辑结构上更加合理,就连书写都简单了一半。
相关语法:

  1. URLLoader () 构造函数
  2. public 函数 URLLoader(request:URLRequest = null)
复制代码

注意括号中是个URLRequest对象。已经把url地址,变量,方法都包括进去了。URLLoader对象现在执行的就是连接数据,接受数据两个事情,其他的都交给URLRequest对象管理。因为URLLoader对象还有很多事情要做,比如侦听连接数据和接受数据的情况,是否已经完成操作,或者已经完成到什么程度。在这里就大有文章了,各种各样的loading都需要URLLoader对象的bytesLoaded属性和bytesTotal 属性实现。所以说,as3的分工还是很有道理的。
   
下面给出准备数据,连接外部数据的典型代码.接受数据处理数据将在下一步讨论

  1. var request:URLRequest = new URLRequest("http://10.7.87.222/test.asp");
  2. //request.contentType = "text/xml";//这句代码可以自己单独尝试一下。笔者初学,也没详细去研究这个。只知道传递接收xml数据的时候有用。呵呵
  3. request.data = "bianliang=100";
  4. request.method = "POST";

  5. var loader:URLLoader = new URLLoader();
  6. loader.load(request);
复制代码


附asp代码,需要在iis5以上服务器上测试.保存文件为 UTF-8编码,文件名为test.asp.位于站点根目录下.

  1. <%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
  2. <%
  3. var bianliang=Request("bianliang")
  4. Response.Write("&biangliang="+bianliang)
  5. Response.Write("&chenggong=chenggong")
  6. %>
复制代码


第三部分:接受数据
我想提示的有两点是:
1 数据需要加载完成以后,才能被flash使用.
   所以一定要判断是否加载完成
   但是所用的语句与as2已经完全不同了.
   as2使用onLoad事件
   as3代码如下
  
  1. loader.addEventListener(Event.COMPLETE,completeHandler);
  2.    function completeHandler(event:Event):void {
  3.            trace(loader.data);
  4.    }
复制代码

   目前大家只要认识到数据的加载情况必须用事件侦听就行了.
   其实as3中的交互事件,都已经采用上面代码所有的事件侦听模式.
2 需要区分 URLRequest类的data属性与URLLoader类的data属性
   前者是表示传递变量的一个集合,后者是接受到的数据的一个集合.
   别搞混就行了.
====================================
   如果这一部分要深入下去,涉及的东西就比较多了.
   包括xml的处理,和字符串的处理.
   各位可以先把上面说的东西先弄熟悉了.
   然后再学习怎么处理数据,以便flash使用.
   再此就不再过多叙述了,因为已经跑题了.

差不多讲完了?
NO ,我想还有个东西需要单独提出来说说
第四部分:如何组织发送的变量?
as2中的loadvars类,它是用n个属性保存变量
as3使用URLRequest类的data属性保存变量.
使用一个属性保存变量?
更绝的是,该data属性是一个object值.靠!
理论上说,我们已经可以把as3中的任意东西传送给外部脚本.
现实一点来说,
将data属性定义为一个string类型,
就已经能实现我们的简单需求了
比如传递多个变量
URLRequest.data="变量1=1&变量2=2&变量3=3",
只要会一定的字符串操作,就能很好的组织自己想发送的数据了.
站巨人肩上,我们再想一下
如果有n个变量,(n的值可以让人操作n个字符串的时候发狂.呵呵)
如果是loadvars类,那没办法,还是老老实实的一个一个写吧
as3中,怎么弄?怎么弄?怎么弄?怎么弄?怎么弄?怎么弄?
既然data属性是个object值.
又需要保存很多数据.
那么有个词已经呼之欲出了
数组!
说到这里我就卡住了,
我再考虑,数组这部分究竟就该详细的说一下 ,还是略去.
考虑2分钟.................

既然能学到今天的as3想必已经是as2老手了,数组操作不讲也罢了
如果是新手刚入门,估计您应该先去as2版块找找数组的资料
呵呵 小弟这里就偷偷懒 见谅了

最后提示一个:
如果你还是喜欢as2的书写方式。
as3还是可以满足你的。
参考URLVariables类。
代码如下:

  1. var variables:URLVariables = new URLVariables();
  2.             variables.exampleSessionId = new Date().getTime();
  3.             variables.exampleUserLabel = "guest";
  4.             request.data = variables;
复制代码

前面3句代码似曾相识吧
完全和as2的loadvars类一样,
只不过最后还是需要把URLVariables对象赋值给URLRequest对象的data属性。


小弟 第一次规规矩矩的写教程,贻笑大方了
其实我也不知道算不算是个教程。只不过是自己的一个学习笔记
在此帖出来,请各位指正。

======================续续续续续续续续续续续续==================
========================================================

上文说道,URLRequest.data中大有文章,它是一个Object值。理论上来说就可以传递任何东西,无论是可视对象还是不可视的其他对象(各种类),但是对于与外部脚本通信来说,我们需要的仅仅是name=value 如此格式的字符串,然后用 &符号连接而已。
在As3中组织需要传递的变量,推荐的做法是用URLVariables类。
说白了,就是剥夺了政治权利的 LoadVars类,然后给改名成了URLVariables类。
详细的方法和属性,参考一下帮助文件就行了
下面给出一个范例代码,也是在上文中出现过的。

  1. var request:URLLoader=new URLLoader
  2. var variables:URLVariables = new URLVariables();
  3. variables.变量一 =  "变量一"
  4. variables.变量一 =  "变量二";
  5. request.data = variables;
  6. trace(variables)
  7. trace(request.data)
复制代码

从trace的结果应该知道,variables已经将自己的几个属性以及属性值用&连接起来了。
当初我还以为可以在URLRequest.data上大做文章,随着进一步的学习和实验,发现,其实用数组来组织需要传递的变量其实没什么必要了,也不能直接实现。
为什么说不能直接实现呢?看一个例子就知道了
下面我们令URLRequest.data等于一个数组,看代码

  1. var my_arr:Array=new Array();
  2. my_arr[0]= "123"
  3. my_arr[1]= "456"
  4. var request:URLLoader=new URLLoader
  5. request.data=my_arr
  6. trace(my_arr)
  7. trace(request.data)
复制代码

Trace结果都是 123,456
这样的结果用于传递变量到外部脚本肯定是不能用的。
外部脚本能够接受的变量形式首先要求是name=value配对,然后是用&连接。
相对于能自动组织变量的URLVariables类来说,用数组的方法真是有点麻烦。

但是我们还是要看到数组操作的好处,能遍历,能循环操作。
所以,小弟认为只要您需要的数据能用一个通项(或者多个参数)来表示或者具有一定的规律,可以用数学关系描述,用数组也能为你提高工作效率。
但是我们还需要对数组进行一定的加工,才能用。
加工步骤一:
   
  1. var my_arr:Array=new Array();
  2. my_arr[0]= "变量一=123";
  3. my_arr[1]= "变量二=456";
复制代码

   数组各项采用name=value形式,
加工步骤二:

  1. var a:Number=my_arr.length;
  2. var i:Number
  3. my_arr[a]="";
  4. for (i=0; i<a; i++) {
  5.         my_arr[a]= my_arr[a]+ my_arr[i]+"&";
  6. }
  7. trace(my_arr[a]);
复制代码


遍历所有数组项,用&符号连接各项,并添加到该数组的最后一项。
Trace得到变量一=123&变量二=456&,这样就已经得到符合要求的字符串了。
加工步骤三:

  1. var my_urlloader:URLLoader=new URLLoader()
  2. my_urlloader.data=my_arr[a]
  3. trace(my_urlloader.data)
复制代码

将上面数组的最后一项赋值,即变量一=123&变量二=456&,给my_urlloader.data


初看起来,确实很麻烦。
偶无聊,于是给Array类prototype了一个新方法toloadvars,把上面说到的几个步骤,进行了一定的集成,如下

  1. Array.prototype.toloadvars=function(URLrequest:URLRequest){
  2.        var i:Number
  3.            var a:Number=this.length
  4.            this[a]=""
  5.            for(i=0;i<a;i++){
  6.            this[a]=this[a]+this[i]+"&"
  7.            }
  8.            URLrequest.data=this[a]
  9.           return URLrequest.data
  10.   };
复制代码

看看怎么用吧?新手又必要看,老鸟别笑我
举个例子

  1. Array.prototype.toloadvars=function(URLrequest:URLRequest){
  2.        var i:Number
  3.            var a:Number=this.length
  4.            this[a]=""
  5.            for(i=0;i<a;i++){
  6.            this[a]=this[a]+this[i]+"&"
  7.            }
  8.            URLrequest.data=this[a]
  9.           return URLrequest.data
  10.   };
  11. var arr:Array=new Array();
  12. arr[0]="a=123"
  13. arr[1]="b=456"
  14. arr[2]="c=789"
  15. arr[3]="d=abc"
  16. var my_url:URLRequest=new URLRequest()
  17. arr.toloadvars(my_url);
  18. trace(my_url.data)
复制代码

第一步:把新定义的toloadvars方法复制到动作面板顶部,
第二步:定义数组,用来组织变量,注意格式。这里就看个人发挥了。用的好,能大大提高效率。
第三步:定义URLRequest对象
第四步:调用数组的toloadvars方法,传递参数是my_url对象。
然后就开始执行自定义的toloadvars方法了,
该方法将自动将数组中定义的每一个变量,用&连接起来,然后将连接后的结果送到URLrequest.data属性里面。

最后提示,最好将URLRequest对象的url,method都定义好,然后用数组组织变量,然后用toloadvars方法。这个思路会稍微清晰点,不会混乱。

[[i] 本帖最后由 daozi2 于 2007-10-10 14:55 编辑 ]

评分

参与人数 1威望 +3 收起 理由
mirycat + 3 原创内容

查看全部评分

发表于 2007-10-6 08:49:02 | 显示全部楼层
学习!!谢谢楼主,空了把它打印出来,嘿嘿,还可以推荐给其它朋友继续学。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-7 12:46:01 | 显示全部楼层
顶   来点反应呢~?  不然都没信心了
回复 支持 反对

使用道具 举报

发表于 2007-10-8 17:53:30 | 显示全部楼层
不错哦......不过你怎么又吊人引啊...提到了重点不把重点也说完..晕S...
数组啊....补上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-8 18:19:05 | 显示全部楼层
数组操作不难吧
那过几天就补上

我第一次写东西啊
不是量产写手
课余时间上来说,限制比较大
偶尽快  多谢
回复 支持 反对

使用道具 举报

发表于 2007-10-8 21:34:40 | 显示全部楼层
棒  就一个字  

///////////////////////////////


没什么好说的
回复 支持 反对

使用道具 举报

发表于 2007-10-9 17:57:09 | 显示全部楼层
顶!你的讲解很流畅易懂!
再顶!
回复 支持 反对

使用道具 举报

发表于 2007-10-9 18:18:57 | 显示全部楼层
学习 收藏了
呵呵
谢谢楼主!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-10 14:53:34 | 显示全部楼层
对不起,今天又把组织变量的部分,完成了.
很遗憾的是,和以前估计的方法有些出入,有点失望
还把编译器弄出错了一次
重新安了flash cs3
回复 支持 反对

使用道具 举报

发表于 2007-10-10 16:30:43 | 显示全部楼层
好,这几天正在研究这些东西呢!
回复 支持 反对

使用道具 举报

发表于 2007-11-10 16:10:29 | 显示全部楼层
lz的教程很到位,赞一个。
回复 支持 反对

使用道具 举报

发表于 2007-11-11 16:12:45 | 显示全部楼层
很好很强大
回复 支持 反对

使用道具 举报

发表于 2007-11-17 23:37:43 | 显示全部楼层
赞! 顶一个! 但是最后Array那段好像没有什么必要哦~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-18 09:19:35 | 显示全部楼层
恩  我想多了
一个urlrequest类完全可以搞定的
我想太多了  呵呵
回复 支持 反对

使用道具 举报

发表于 2007-11-20 23:02:49 | 显示全部楼层
不错!!最近想学这个东西,可是一直没有时间.收下慢慢看了.
FLASH交互...   还是有点晕.
回复 支持 反对

使用道具 举报

发表于 2007-11-22 11:33:26 | 显示全部楼层
写的不错,代码贴的很详细,多谢LZ!!!
回复 支持 反对

使用道具 举报

发表于 2007-11-25 14:16:20 | 显示全部楼层
不错,有学到了
回复 支持 反对

使用道具 举报

发表于 2007-11-25 14:42:51 | 显示全部楼层
mirycat当时的还只是翻译为主,你的有比较多自己的东西,当然不同啦
回复 支持 反对

使用道具 举报

发表于 2007-11-26 18:03:22 | 显示全部楼层
这方面知识在前几天才从黑羽大哥那里看过,楼主写得更详细,加深理解.支持一下.
回复 支持 反对

使用道具 举报

发表于 2009-2-17 12:22:47 | 显示全部楼层
不错,学习了啊!
回复 支持 反对

使用道具 举报

发表于 2009-2-17 15:53:30 | 显示全部楼层

回复 5# daozi2 [楼主] 的帖子

比我第一次写强多了
顶你一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 京ICP备05002321号  

GMT+8, 2017-5-25 10:03 , Processed in 0.137730 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表