构建动态应用程序时,从外部文件或从服务器端脚本加载数据会很有用。这样,您不必编辑或重新编译应用程序,即可生成动态应用程序。例如,如果您要构建一个“每日提示”应用程序,就可以编写一个服务器端脚本,该脚本每天从数据库检索一次随机提示并将其保存到文本文件。然后,应用程序可以加载静态文本文件的内容,而不必每次查询数据库。
下面的片断创建 URLRequest 和 URLLoader 对象,用于加载外部文本文件 params.txt 的内容:
var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);
默认情况下,如果您未定义请求方法,则 Flash Player 和 Adobe AIR 会使用 HTTP
GET
方法加载内容。要使用
POST
方法发送请求,可使用静态常量
URLRequestMethod.POST
将
request.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
该文件包含两个参数,即
monthNames
和
dayNames
。每个参数包含一个逗号分隔列表,该列表被分析为字符串。可以使用
String.split()
方法将此列表拆分为数组。
不要将保留字或语言构造作为外部数据文件中的变量名称,因为这样做会使代码的读取和调试变得更困难。
加载数据后,将调度
complete
事件,随后就可以在 URLLoader 的
data
属性中使用外部文档的内容,如以下代码所示:
function completeHandler(event)
{
var loader2 = event.target;
air.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.BINARY
—
URLLoader.data
属性包含 ByteArray 对象中存储的二进制数据。
-
URLLoaderDataFormat.TEXT
—
URLLoader.data
属性包含 String 对象中的文本。
-
URLLoaderDataFormat.VARIABLES
—
URLLoader.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());
}
}
}