分享

ActionScript 3.0 读txt

 乐乐妈 2010-06-10

处理外部数据

ActionScript 3.0 包含用于从外部源加载数据的机制。这些源可以是静态内容(如文本文件),也可以是动态内容(如从数据库检索数据的 Web 脚本)。可以使用多种不同的方法来设置数据的格式,并且 ActionScript 提供了用于解码和访问数据的功能。也可以在检索数据的过程中将数据发送到外部服务器。

子主题

使用 URLLoader 类和 URLVariables 类
从外部文档加载数据
与外部脚本进行通信

使用 URLLoader 类和 URLVariables 类

ActionScript 3.0 使用 URLLoader 和 URLVariables 类来加载外部数据。URLLoader 类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据。URLLoader 类用于下载文本文件、XML 或其它要用于数据驱动的动态 ActionScript 应用程序中的信息。URLLoader 类使用 ActionScript 3.0 高级事件处理模型,使用该模型可以侦听诸如 completehttpStatusioErroropenprogresssecurityError 等事件。新事件处理模型在 ActionScript 2.0 的基础上大大改进了对 LoadVars.onDataLoadVars.onHTTPStatusLoadVars.onLoad 事件处理函数的支持,可以更高效地处理错误和事件。有关处理事件的详细信息,请参阅处理事件.

与早期版本 ActionScript 中的 XML 和 LoadVars 类非常相似,URLLoader URL 的数据在下载完成之前不可用。尽管如果文件加载速度太快,可能不会调度 ProgressEvent.PROGRESS 事件,但您可以通过侦听要调度的 flash.events.ProgressEvent.PROGRESS 事件来监视下载进度(已加载的字节数和总字节数)。成功下载文件后,将调度 flash.events.Event.COMPLETE 事件。加载的数据将从 UTF-8 或 UTF-16 编码被解码为字符串。

注意

 

如果没有为 URLRequest.contentType 设置值,则以 application/x-www-form-urlencoded 的形式发送值。

URLLoader.load() 方法(以及 URLLoader 类的构造函数,可选)使用一个参数,即 request,该参数是一个 URLRequest 实例。URLRequest 实例包含单个 HTTP 请求的所有信息,如目标 URL、请求方法(GETPOST)、附加标头信息以及 MIME 类型(例如,当上载 XML 内容时)。

例如,要将 XML 数据包上载到服务器端脚本,您可以使用下面的 ActionScript 3.0 代码:

var secondsUTC:Number = new Date().time;
var dataXML:XML =
<login>
<time>{secondsUTC}</time>
<username>Ernie</username>
<password>guru</password>
</login>;
var request:URLRequest = new URLRequest("http://www./login.cfm");
request.contentType = "text/xml";
request.data = dataXML.toXMLString();
request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader();
try
{
loader.load(request);
}
catch (error:ArgumentError)
{
trace("An ArgumentError has occurred.");
}
catch (error:SecurityError)
{
trace("A SecurityError has occurred.");
}

上面的代码片段创建了一个名为 dataXML 的 XML 实例,其中包含要发送到服务器的 XML 数据包。接下来,将 URLRequest contentType 属性设置为“text/xml”,将 URLRequest data 属性设置为 XML 数据包的内容(通过 XML.toXMLString() 方法将该内容转换为字符串)。最后,创建一个新的 URLLoader 实例,并使用 URLLoader.load() 方法将请求发送到远程脚本。

可以使用三种方式指定要在 URL 请求中传递的参数:

  • 在 URLVariables 构造函数中
  • URLVariables.decode() 方法中
  • 作为 URLVariables 对象本身中的特定属性

当定义 URLVariables 构造函数或 URLVariables.decode() 方法中的变量时,需要确保对“and”符进行 URL 编码,因为它具有特殊含义并作为分隔符使用。例如,由于与号作为参数的分隔符使用,当传递与号时,需要将与号从 & 更改为 %26 来对与号进行 URL 编码。

从外部文档加载数据

当使用 ActionScript 3.0 生成动态应用程序时,最好从外部文件或服务器端脚本加载数据。这样,您不必编辑或重新编译 ActionScript 文件,即可生成动态应用程序。例如,如果生成“每日提示”应用程序,您可以编写一个服务器端脚本,该脚本每天从数据库检索一次随机提示并将其保存到文本文件。然后,ActionScript 应用程序可以加载静态文本文件的内容,而不必每次查询数据库。

下面的片断创建 URLRequest 和 URLLoader 对象,用于加载外部文本文件 params.txt 的内容:

var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);

可以将上面的片断简化如下:

var loader:URLLoader = new URLLoader(new URLRequest("params.txt"));

默认情况下,如果您未定义请求方法,Flash Player 将使用 HTTP GET 方法加载内容。如果要使用 POST 方法发送数据,则需要使用静态常量 URLRequestMethod.POSTrequest.method 属性设置为 POST,如下面的代码所示:

var request:URLRequest = new URLRequest("sendfeedback.cfm");
request.method = URLRequestMethod.POST;

在运行时加载的外部文档 params.txt 包含以下数据:

monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

该文件包含两个参数,即 monthNamesdayNames。每个参数包含一个逗号分隔列表,该列表被分解为字符串。可以使用 String.split() 方法将此列表拆分为数组。

提示

 

不要将保留字或语言构造作为外部数据文件中的变量名称,因为这样做会使代码的读取和调试变得更困难。

加载数据后,将调度 Event.COMPLETE 事件,现可以在 URLLoader 的 data 属性中使用外部文档的内容,如下面的代码所示:

private function completeHandler(event:Event):void
{
var loader2:URLLoader = URLLoader(event.target);
trace(loader2.data);
}

如果远程文档包含名称-值对,您可以通过传入加载文件的内容,使用 URLVariables 类来分析数据,如下所示:

private function completeHandler(event:Event):void
{
var loader2:URLLoader = URLLoader(event.target);
var variables:URLVariables = new URLVariables(loader2.data);
trace(variables.dayNames);
}

外部文件中的每个名称-值对都创建为 URLVariables 对象中的一个属性。在上面的代码范例中,变量对象中的每个属性都被视为字符串。如果名称-值对是一个项目列表,您可以通过调用 String.split() 方法将字符串转换为数组,如下所示:

var dayNameArray:Array = variables.dayNames.split(",");

提示

 

如果从外部文本文件加载数值数据,则需要使用顶级函数(如 int()uint()Number())将这些值转换为数值。

无需将远程文件的内容作为字符串加载和新建 URLVariables 对象,您可以将 URLLoader.dataFormat 属性设置为在 URLLoaderDataFormat 类中找到的静态属性之一。URLLoader.dataFormat 属性的三个可能值如下:

  • URLLoaderDataFormat.BINARYURLLoader.data 属性将包含 ByteArray 对象中存储的二进制数据。
  • URLLoaderDataFormat.TEXTURLLoader.data 属性将包含 String 对象中的文本。
  • URLLoaderDataFormat.VARIABLESURLLoader.data 属性将包含 URLVariables 对象中存储的 URL 编码的变量。

下面的代码说明了通过将 URLLoader.dataFormat 属性设置为 URLLoaderDataFormat.VARIABLES,您可以自动将加载的数据分解为 URLVariables 对象:

package
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
public class URLLoaderDataFormatExample extends Sprite
{
public function URLLoaderDataFormatExample()
{
var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt");
var variables:URLLoader = new URLLoader();
variables.dataFormat = URLLoaderDataFormat.VARIABLES;
variables.addEventListener(Event.COMPLETE, completeHandler);
try
{
variables.load(request);
}
catch (error:Error)
{
trace("Unable to load URL: " + error);
}
}
private function completeHandler(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
trace(loader.data.dayNames);
}
}
}

注意

 

URLLoader.dataFormat 的默认值为 URLLoaderDataFormat.TEXT

如下面的实例所示,从外部文件加载 XML 与加载 URLVariables 相同。可以创建 URLRequest 和 URLLoader 实例,然后使用它们下载远程 XML 文档。文件完全下载后,调度 Event.COMPLETE 事件,并将外部文件的内容转换为可使用 XML 方法和属性分析的 XML 实例。

package
{
import flash.display.Sprite;
import flash.errors.*;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
public class ExternalDocs extends Sprite
{
public function ExternalDocs()
{
var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml");
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, completeHandler);
try
{
loader.load(request);
}
catch (error:ArgumentError)
{
trace("An ArgumentError has occurred.");
}
catch (error:SecurityError)
{
trace("A SecurityError has occurred.");
}
}
private function completeHandler(event:Event):void
{
var dataXML:XML = XML(event.target.data);
trace(dataXML.toXMLString());
}
}
}

与外部脚本进行通信

除了加载外部数据文件,还可以使用 URLVariables 类将变量发送到服务器端脚本并处理服务器的响应。这是非常有用的,例如,如果您正在编写游戏,想要将用户的得分发送到服务器以计算是否应添加到高分列表中,也可以将用户的登录信息发送到服务器以进行验证。服务器端脚本可以处理用户名和密码,向数据库验证用户名和密码,然后返回用户提供的凭据是否有效的确认。

下面的片断创建一个名为 variables 的 URLVariables 对象,该对象创建称为 name 的新变量。接下来,创建一个 URLRequest 对象,该对象指定变量要发送到的服务器端脚本的 URL。然后,设置 URLRequest 对象的 method 属性,以便将变量作为 HTTP POST 请求发送。为了将 URLVariables 对象添加到 URL 请求,需要将 URLRequest 对象的 data 属性设置为早先创建的 URLVariables 对象。最后,创建 URLLoader 实例并调用 URLLoader.load() 方法,此方法用于启动该请求。

var variables:URLVariables = new URLVariables("name=Franklin");
var request:URLRequest = new URLRequest();
request.url = "http://www.[yourdomain].com/greeting.cfm";
request.method = URLRequestMethod.POST;
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, completeHandler);
try
{
loader.load(request);
}
catch (error:Error)
{
trace("Unable to load URL");
}
function completeHandler(event:Event):void
{
trace(event.target.data.welcomeMessage);
}

下面的代码包含上面的示例中使用的 Adobe ColdFusion? greeting.cfm 文档的内容:

<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0>
<cfset Form.Name = "Stranger" />
</cfif>
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)#
</cfoutput>
相关主题
Popup
Popup


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多