建立動態應用程式時,從外部檔案或伺服器端指令碼載入資料非常有用。這讓您不需要編輯或重新編譯應用程式,就可以建立動態應用程式。例如,如果要建置「本日小秘訣」應用程式,您可以撰寫一個伺服器端指令碼,每天從資料庫隨機擷取一個提示,再將它儲存成文字檔案。然後您的 應用程式就可以載入靜態文字檔案的內容,不需要每次都先查詢資料庫。
下列程式碼片段會建立 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()
) 將這些值轉換成數值。
您也可以將
URLLoader.dataFormat
屬性設為 URLLoaderDataFormat 類別的其中一個靜態屬性,而不要載入遠端檔案的內容做為字串,然後建立新的 URLVariables 物件。
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());
}
}
}