AS3 CookBook学习整理(十五)

1. 通过URLLoader读取文本数据

URLLoader可以读取三种格式的数据,分别为URLLoaderDataFormat的枚举值:BINARY(二进制)、TEXT(普通文本)、VARIABLES(URL编码)

URLLoader.data 属性的数据类型是根据dataFormat 属性的设置而决定的,如果设置为DataFormat.TEXT,则data 属性的值为String 类型,如果设置DataFormat.VARIABLES,则是Object 类型,如果设置为DataFormat.BINARY,则data 的数据类型为flash.util.ByteArray

当设置loader.dataFormat = URLLoaderDataFormat.VARIABLES时,源数据必须为符合规范的URL编码数据,需要遵循下面几个规则:

* 以 name=hxw&age=27 这样的形式出现

* 空格被替换成"+"符号,不是%20,例如:name=bill+gates (空格和%20也可以用,但是用"+"兼容性更好)

* 其它都与.net的URL编码一致

URLLoader读取数据时,会触发一系列的事件:

Event.OPEN -- 开始从服务器下载数据时加载一次,此时的URLLoader.bytesLoaded一定是0

Event.COMPLETE -- 数据完全加载完毕时触发, 通常如果能够触发这个事件的话, 说明你的程序没有问题

ProgressEvent.PROGRESS -- 在从服务器下载数据的过程中持续触发, 通过侦听它的变化我们可以很方便的为 URLLoader 做加载状态的显示

IOErrorEvent.IO_ERROR -- 当遇到致命错误导致下载终止

SecurityErrorEvent.SECURITY_ERROR -- FlashPlayer 的安全错误,试图读取安全沙漏允许以外的域数据(跨域加载)

HTTPStatusEvent.HTTP_STATUS -- 获取 HTTP 状态代码时触发, 通过判断它的status属性我们可以获得远程文件的加载状态,成功 (200)、没有权限 (403)、找不到文件 (404)、服务器内部错误 (500) 等等。这个事件总是在 compelete 之前被触发

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.events.HTTPStatusEvent;
 flash.events.IOErrorEvent;
 flash.events.ProgressEvent;
 flash.events.SecurityErrorEvent;
 flash.net.URLLoader;
 flash.net.URLLoaderDataFormat;
 flash.net.URLRequest;
  Sample0707Sprite
 {
   Sample0707()
  {
   loader:URLLoader = URLLoader(URLRequest());
   loader.dataFormat = URLLoaderDataFormat.VARIABLES;
   
   loader.addEventListener(Event.OPEN,onOpen);
   loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,onHttpStatus);
   loader.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
   loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
   loader.addEventListener(ProgressEvent.PROGRESS,onProgress);
   loader.addEventListener(Event.COMPLETE,onComplete);
  }
  
   onOpen(event:Event):
  {
   ();
  }
  
   onComplete(event:Event):
  {
   ();
   loader:URLLoader = event.target    URLLoader;
   (str:String    loader.data)
   {
    (str +  + loader.data[str]);
   }
  }
  
   onProgress(event:ProgressEvent):
  {
   ();
  }
  
   onHttpStatus(event:HTTPStatusEvent):
  {
   ( + event.status);
  }
  
   onIOError(event:IOErrorEvent):
  {
   ();
  }
  
   onSecurityError(event:SecurityErrorEvent):
  {
   ();
  }
 }
}

2. 解决URLLoader读取数据的乱码问题

flash.system.System.useCodePage = true;

useCodePage -- Flash Player使用哪个代码页来解释外部文件,默认为false。为flase时,Flash Player使用Unicode解释外部文本文件。(保存这些文件时,必须使用Unicode对其进行编码);当该属性设置为true时,Flash Player使用运行播放器的操作系统的传统代码页来解释外部文本文件

如果将userCodePage设置为true,应注意:在运行播放器的操作系统的传统代码页中必须包括您的外部文本文件中使用的字符,这样才能显示文本。为确保所有平台上的用户都能查看您的swf文件中使用的外部文本文件,应将所有外部文本文件按Unicode进行编码,并保留useCodePage为false

3. 边下载边访问数据(URLStream)

使用flash.net.URLStream可以在下载的过程中立即读取二进制数据

URLLoader必须等数据全部下载完才能读取数据,当URLLoader的dataFormat属性为URLLoaderDataFormat.BINARY时和URLStream非常类似,它们有相同的事件,关键的区别是处理progress事件的方式不同而已

在URLStream中的progress事件允许使用bytesAvailable属性来得到可用的数据,然后调用readInt()、readByte()和readBoolean()等方法来读取数据

当访问的数据都是二进制时最好使用URLStream

PS: 在进行读取数据时,需要检测一下bytesAvailable的值,如果读取的字节超出缓冲的结果则会抛出EOFError异常

 {
 flash.display.*;
 flash.events.ProgressEvent;
 flash.net.URLLoaderDataFormat;
 flash.net.URLRequest;
 flash.net.URLStream;
  Sample0707Sprite
 { 
   Sample0707()
  {
   loader:URLStream = URLStream();
   loader.load(URLRequest());
   loader.addEventListener(ProgressEvent.PROGRESS,onProgress);
  }
  
   onProgress(event:ProgressEvent):
  {
   loader:URLStream = event.target    URLStream;
   
   while ( loader.bytesAvailable > 0 ) 
   {
    ( + String.fromCharCode(loader.readByte()));
   }
  }
 }
}

4. 发送数据给服务端页面

调用sendToURL(urlRequest)或navigateToURL(urlRequest, windowLocation)

这两种方法都无法返回结果,如果要返回结果可以使用URLLoader

可以利用sendToURL(urlRequest)来做插入数据库的操作

 {
 flash.display.Sprite;
 flash.net.URLRequest;
 flash.net.URLRequestMethod;
 flash.net.URLVariables;
 flash.net.sendToURL;
  Sample0708Sprite
 {
   Sample0708()
  {
   variables:URLVariables = URLVariables();
   variables.userName = ;
   
   request:URLRequest = URLRequest();
   request.url = ;
   request.data = variables;
   request.method = URLRequestMethod.POST;
   
   sendToURL(request);
  }
 }
}

可以利用navigateToURL(urlRequest, windowLocation)来做查询

 {
 flash.display.Sprite;
 flash.net.URLRequest;
 flash.net.URLRequestMethod;
 flash.net.URLVariables;
 flash.net.navigateToURL;
 flash.system.System;
  Sample0708Sprite
 {
   Sample0708()
  {
   flash.system.System.useCodePage = ;
   
   variables:URLVariables = URLVariables();
   variables.wd = ;
   
   request:URLRequest = URLRequest();
   request.url = ;
   request.data = variables;
   request.method = URLRequestMethod.POST;
   
   navigateToURL(request,);
  }
 }
}

PS:如果是以URLRequestMethod.GET的形式传递数据,则后台需要用Request.QueryString["keyword"]来获取;如果是以URLRequestMethod.POST的形式传递,则后台需要用Request.Form["keyword"]来获取

5. 发送数据并返回结果

使用URLLoader来实现

服务器端代码(.net)

override void Render(HtmlTextWriter writer)
{
    
    string id = Request.Form[];
    SqlConnection conn = SqlConnection();
    conn.Open();
    SqlCommand cmd = SqlCommand( + id, conn);
    string resultValue = cmd.ExecuteScalar().ToString();
    conn.Close();
    Response.Write( + resultValue);
}

flex代码:

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.net.URLLoader;
 flash.net.URLLoaderDataFormat;
 flash.net.URLRequest;
 flash.net.URLRequestMethod;
 flash.net.URLVariables;
 
  Sample0708Sprite
 {
   Sample0708()
  {
   infoObj:URLVariables = URLVariables();
   infoObj.userID = 3;
   
   request:URLRequest = URLRequest();
   request.url = ;
   request.method = URLRequestMethod.POST;
   request.data = infoObj;
   
   loader:URLLoader = URLLoader();
   loader.dataFormat = URLLoaderDataFormat.VARIABLES;
   loader.load(request);
   loader.addEventListener(Event.COMPLETE,onComplete); 
  }
  
   onComplete(event:Event):
  {
   loader:URLLoader = event.target    URLLoader;
   (loader.data.name);
  }
 }
}

6. 创建XML对象

方法一:创建XML对象并直接用XML进行赋值

str:String = ;
xml:XML = <menu><item>{str}</item><item>栏目B</item></menu>;

方法二:传递XML字符串给XML构造函数

str:String = ;
xml:XML = XML(str);

7. 为XML添加节点

可以直接用E4X语法添加新节点,有两种方式:xml.newNode = "content" 和 xml["newNode"] = "content",区别在于假如出现xml.my-item这样的节点会编译出错,只能用xml["my-item"]

xml:XML = <menu />;
xml.item1 = ;
xml.item2 = ;
xml[] = ;
 
xml[] = ;

还可以使用XML对象的insertChildBefore()和insertChildAfter()方法来动态插入节点

insertChildBefore(child1, child2) -- 在child1节点之前插入child2节点,如果child1为null,则在所有子项之后插入child2节点(理解为"不在任何节点之前,即在最后")

insertChildAfter(child1, child2) -- 在child1节点之后插入child2节点,如果child1为null,则在所有子项之前插入child2节点(理解为"不在任何节点之后,即在最前")

prependChild(child) -- 在xml最前面插入新节点

appendChild(child) -- 在xml最后面插入新节点

 {
 flash.display.Sprite;
 
  Sample0708Sprite
 {
   Sample0708()
  {
   xml:XML =  <menu>
      <item>栏目A</item>
      <item>栏目B</item>
      <distinctItem>特别栏目</distinctItem>
      <item>栏目C</item>
     </menu>;
   
    
   xml.insertChildBefore(null,<itemAAA />);
   
    
   xml.insertChildAfter(null,<itemBBB>栏目BBB</itemBBB>);
   
    
   xml.insertChildBefore(xml.item[1],<itemCCC />);
   
    
   xml.insertChildAfter(xml.distinctItem,<itemDDD />);
   
    
   xml.prependChild(<firstItem />);
   
    
   xml.appendChild(<lastItem />);
   
   (xml);
  }
 }
}

8. 为XML元素添加属性

使用E4X的@操作符

需要注意的是,如果出现"s-title"、"click"+num这样形式的属性名,使用node.@attribute会编译错误,需要使用node.@["attribute"]的方式

 {
 flash.display.Sprite;
 
  Sample0708Sprite
 {
   Sample0708()
  {
   xml:XML =  <menu>
      <item>栏目A</item>
      <item>栏目B</item>
      <distinctItem>特别栏目</distinctItem>
      <item>栏目C</item>
     </menu>;
   
   xml.item[1].@title = ;
   xml.distintItem.@[] = ;
   
   num:int = 101;
   xml.item[0].@[+num] = 0;
   
   (xml);
  }
 }
}

9. 读取XML树中的元素

使用xml.elements()方法范围XMLList类型的所有元素,并用for each循环遍历,注意调用一次elements只能返回下一级的子元素节点,要访问整个XML结构,需要进行递归处理

 {
 flash.display.Sprite;
 
  Sample0708Sprite
 {
   Sample0708()
  {
   xml:XML =  <menu>
     <item>栏目A</item>
     <item title=>栏目B</item>
     <distinctItem><subItem>特别栏目</subItem></distinctItem>
     <item>栏目C</item>
     </menu>;
   
   getNode(xml);
  }
  
   getNode(node:XML):
  {
   nodeList:XMLList = node.elements();
   (subNode:XML    nodeList)
   {
    (subNode.toXMLString());
    (subNode.@title);
   }
  }
 }
}

10. 查找XML元素节点

使用E4X的操作符(.)加上属性名语法来查找元素,也可以使用操作符(..)来访问第二级的节点(跳过一级)

如果有多个同名的节点,可以使用item[index]来访问

需要注意的是:[]操作符不能和双点操作符一起使用,例如fruit..[nodeName];是错误的

 {
 flash.display.Sprite;
  Sample0709Sprite
 {
   Sample0709()
  {
   xml:XML =  <menu>
      <item>栏目A</item>
      <item>栏目B</item>
      <distinctItem title=>
<subItem>
<park>特别栏目</park>
</subItem>
</distinctItem> <item>栏目C</item> </menu>; (xml.item[1]); (xml..subItem.park); } } }

 

转载于:https://www.cnblogs.com/CoderWayne/archive/2010/07/15/1778083.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值