동적 응용 프로그램을 작성하는 경우 외부 파일 또는 서버 측 스크립트에서 데이터를 로드하는 것이 좋을 수 있습니다. 그러면 응용 프로그램을 편집하거나 다시 컴파일하지 않고도 동적 응용 프로그램을 작성할 수 있습니다. 예를 들어 "오늘의 팁"을 표시하는 응용 프로그램을 작성하는 경우 하루에 한 번씩 데이터베이스에서 임의로 하나의 팁을 가져와 텍스트 파일로 저장하는 서버 측 스크립트를 작성할 수 있습니다. 그러면 응용 프로그램에서 매번 데이터베이스를 쿼리하지 않고 정적 텍스트 파일의 내용을 로드할 수 있습니다.
다음 코드 예제에서는 외부 텍스트 파일인 params.txt의 내용을 로드하는 URLRequest 및 URLLoader 객체를 만듭니다.
var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);
기본적으로 요청 메서드를 정의하지 않으면 Flash Player 및 Adobe AIR에서 HTTP
GET
메서드를 사용하여 내용을 로드합니다.
POST
메서드를 사용하여 요청을 보내려면 다음 코드와 같이 정적 상수를 사용하여
request.method
속성을
POST
URLRequestMethod.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
- ByteArray 객체에 저장된 이진 데이터가
URLLoader.data
속성에 포함됩니다.
-
URLLoaderDataFormat.TEXT
- 문자열 객체의 텍스트가
URLLoader.data
속성에 포함됩니다.
-
URLLoaderDataFormat.VARIABLES
- URLVariables 객체에 저장된 URL 인코딩된 변수가
URLLoader.data
속성에 포함됩니다.
다음 코드는
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());
}
}
}