處理外部數(shù)據(jù)ActionScript 3.0 包含用于從外部源加載數(shù)據(jù)的機制。這些源可以是靜態(tài)內(nèi)容(如文本文件),也可以是動態(tài)內(nèi)容(如從數(shù)據(jù)庫檢索數(shù)據(jù)的 Web 腳本)。可以使用多種不同的方法來設(shè)置數(shù)據(jù)的格式,并且 ActionScript 提供了用于解碼和訪問數(shù)據(jù)的功能。也可以在檢索數(shù)據(jù)的過程中將數(shù)據(jù)發(fā)送到外部服務(wù)器。 子主題使用 URLLoader 類和 URLVariables 類ActionScript 3.0 使用 URLLoader 和 URLVariables 類來加載外部數(shù)據(jù)。URLLoader 類以文本、二進制數(shù)據(jù)或 URL 編碼變量的形式從 URL 下載數(shù)據(jù)。URLLoader 類用于下載文本文件、XML 或其它要用于數(shù)據(jù)驅(qū)動的動態(tài) ActionScript 應(yīng)用程序中的信息。URLLoader 類使用 ActionScript 3.0 高級事件處理模型,使用該模型可以偵聽諸如 與早期版本 ActionScript 中的 XML 和 LoadVars 類非常相似,URLLoader URL 的數(shù)據(jù)在下載完成之前不可用。盡管如果文件加載速度太快,可能不會調(diào)度
例如,要將 XML 數(shù)據(jù)包上載到服務(wù)器端腳本,您可以使用下面的 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.");
}
上面的代碼片段創(chuàng)建了一個名為 可以使用三種方式指定要在 URL 請求中傳遞的參數(shù):
當(dāng)定義 URLVariables 構(gòu)造函數(shù)或 從外部文檔加載數(shù)據(jù)當(dāng)使用 ActionScript 3.0 生成動態(tài)應(yīng)用程序時,最好從外部文件或服務(wù)器端腳本加載數(shù)據(jù)。這樣,您不必編輯或重新編譯 ActionScript 文件,即可生成動態(tài)應(yīng)用程序。例如,如果生成“每日提示”應(yīng)用程序,您可以編寫一個服務(wù)器端腳本,該腳本每天從數(shù)據(jù)庫檢索一次隨機提示并將其保存到文本文件。然后,ActionScript 應(yīng)用程序可以加載靜態(tài)文本文件的內(nèi)容,而不必每次查詢數(shù)據(jù)庫。 下面的片斷創(chuàng)建 URLRequest 和 URLLoader 對象,用于加載外部文本文件 params.txt 的內(nèi)容: var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);
可以將上面的片斷簡化如下: var loader:URLLoader = new URLLoader(new URLRequest("params.txt"));
默認情況下,如果您未定義請求方法,F(xiàn)lash Player 將使用 HTTP var request:URLRequest = new URLRequest("sendfeedback.cfm");
request.method = URLRequestMethod.POST;
在運行時加載的外部文檔 params.txt 包含以下數(shù)據(jù): monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday 該文件包含兩個參數(shù),即
加載數(shù)據(jù)后,將調(diào)度 private function completeHandler(event:Event):void
{
var loader2:URLLoader = URLLoader(event.target);
trace(loader2.data);
}
如果遠程文檔包含名稱-值對,您可以通過傳入加載文件的內(nèi)容,使用 URLVariables 類來分析數(shù)據(jù),如下所示: private function completeHandler(event:Event):void
{
var loader2:URLLoader = URLLoader(event.target);
var variables:URLVariables = new URLVariables(loader2.data);
trace(variables.dayNames);
}
外部文件中的每個名稱-值對都創(chuàng)建為 URLVariables 對象中的一個屬性。在上面的代碼范例中,變量對象中的每個屬性都被視為字符串。如果名稱-值對是一個項目列表,您可以通過調(diào)用 var dayNameArray:Array = variables.dayNames.split(",");
無需將遠程文件的內(nèi)容作為字符串加載和新建 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);
}
}
}
如下面的實例所示,從外部文件加載 XML 與加載 URLVariables 相同??梢詣?chuàng)建 URLRequest 和 URLLoader 實例,然后使用它們下載遠程 XML 文檔。文件完全下載后,調(diào)度 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());
}
}
}
與外部腳本進行通信除了加載外部數(shù)據(jù)文件,還可以使用 URLVariables 類將變量發(fā)送到服務(wù)器端腳本并處理服務(wù)器的響應(yīng)。這是非常有用的,例如,如果您正在編寫游戲,想要將用戶的得分發(fā)送到服務(wù)器以計算是否應(yīng)添加到高分列表中,也可以將用戶的登錄信息發(fā)送到服務(wù)器以進行驗證。服務(wù)器端腳本可以處理用戶名和密碼,向數(shù)據(jù)庫驗證用戶名和密碼,然后返回用戶提供的憑據(jù)是否有效的確認。 下面的片斷創(chuàng)建一個名為 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 文檔的內(nèi)容: <cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0>
<cfset Form.Name = "Stranger" />
</cfif>
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)#
</cfoutput>
|
||||||||||||||||||||||||
|
|