動的なアプリケーションを作成する場合、外部のファイルまたはサーバーサイドスクリプトからデータをロードするようにすると、アプリケーションの編集と再コンパイルを必要としない動的なアプリケーションを実現できます。例えば、「今日の一言」アプリケーションを作成する場合、サーバーサイドスクリプトで、データベースからランダムに選んだ一言を取得して 1 日 1 回テキストファイルに保存するようにします。そうすれば、 アプリケーションでは静的なテキストファイルをロードするだけでよく、毎回データベースへのクエリを発行する必要はなくなります。
次のコードでは、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
の 2 つのパラメーターが含まれています。各パラメーターの内容は、ストリングとして解析されるカンマ区切りリストです。このリストは
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 オブジェクトの個別のプロパティが作成されます。このコード例にある variables オブジェクトの各プロパティは、ストリングとして扱われます。名前/値ペアの値がアイテムのリストである場合は、次のように
String.split()
メソッドを呼び出すことでストリングから配列に変換できます。
var dayNameArray:Array = variables.dayNames.split(",");
外部テキストファイルから数値データをロードするには、トップレベル関数の
int()
、
uint()
、
Number()
などを使用して値を数値に変換します。
リモートファイルの内容を文字列としてロードして新しい URLVariables オブジェクトを作成する方法とは別に、
URLLoader.dataFormat
プロパティを URLLoaderDataFormat クラスの静的プロパティのいずれかに設定する方法もあります。
URLLoader.dataFormat
プロパティに設定できる値は次の 3 つのうちいずれかです。
-
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());
}
}
}