외부 데이터 로드

Flash Player 9 이상, Adobe AIR 1.0 이상

ActionScript 3.0에는 외부 소스에서 데이터를 로드하기 위한 메커니즘이 있습니다. 외부 소스는 텍스트 파일과 같은 정적 내용 또는 웹 스크립트에서 생성한 동적 내용을 제공할 수 있습니다. 데이터의 형식은 다양한 방법으로 지정할 수 있으며 ActionScript는 데이터의 암호를 해독하고 데이터에 액세스하는 기능을 제공합니다. 데이터를 가져오는 프로세스의 일환으로 데이터를 외부 서버에 보낼 수도 있습니다.

URLRequest 클래스 사용

외부 데이터를 로드하는 많은 API는 URLRequest 클래스를 사용하여 필요한 네트워크 요청 속성을 정의합니다.

URLRequest 속성

보안 샌드박스에 URLRequest 객체의 다음 속성을 설정할 수 있습니다.

속성

설명

contentType

URL 요청과 함께 전송되는 데이터의 MIME 내용 유형입니다. contentType에 아무 값도 설정되어 있지 않으면 값이 application/x-www-form-urlencoded 로 전송됩니다.

data

URL 요청과 함께 전송될 데이터를 포함하는 객체입니다.

digest

Adobe® Flash® Player 캐시에 저장(또는 캐시에서 검색)할 서명된 Adobe 플랫폼 구성 요소를 고유하게 식별하는 문자열입니다.

method

GET 또는 POST 작업과 같은 HTTP 요청 메서드입니다. AIR 응용 프로그램 보안 도메인에서 실행되는 내용은 "GET" 또는 "POST" 이외의 문자열을 method 속성으로 지정할 수 있습니다. 모든 HTTP 동사가 허용되며 "GET" 이 기본 메서드입니다. 자세한 내용은 AIR 보안 을 참조하십시오.

requestHeaders

HTTP 요청에 추가할 HTTP 요청 헤더의 배열입니다. Flash Player 및 응용 프로그램 보안 샌드박스 외부에서 실행되는 AIR 내용에서는 일부 헤더를 설정하는 권한이 제한되어 있습니다.

url

요청할 URL을 지정합니다.

AIR에서는 URLRequest 클래스의 추가 속성을 설정할 수 있습니다. 이러한 속성은 응용 프로그램 보안 샌드박스에서 실행되는 AIR 내용에만 사용할 수 있습니다. 응용 프로그램 샌드박스의 내용은 file http 와 같은 표준 스킴 외에도 새로운 URL 스킴을 사용하여 URL을 정의할 수 있습니다.

속성

설명

followRedirects

리디렉션을 수행할지( true , 기본값) 아니면 수행하지 않을지( false )를 지정합니다. 이 속성은 AIR 응용 프로그램 샌드박스에서만 지원됩니다.

manageCookies

HTTP 프로토콜 스택에서 이 요청에 대한 쿠키를 관리할지( true , 기본값) 아니면 관리하지 않을지( false )를 지정합니다. 이 속성은 AIR 응용 프로그램 샌드박스에서만 설정할 수 있습니다.

authenticate

이 요청에 대한 인증 요청을 처리할지( true ) 여부를 지정합니다. 이 속성은 AIR 응용 프로그램 샌드박스에서만 설정할 수 있습니다. 기본값은 요청을 인증하는 것입니다. 이 경우 서버에서 자격 증명 표시를 요구하면 인증 대화 상자가 표시될 수 있습니다. 또한 URLRequestDefaults 클래스를 사용하여 사용자 이름과 암호를 설정할 수도 있습니다. 자세한 내용은 URLRequest 기본값 설정(AIR만 해당) 을 참조하십시오.

cacheResponse

이 요청에 대해 응답 데이터를 캐시할지 여부를 지정합니다. 이 속성은 AIR 응용 프로그램 샌드박스에서만 설정할 수 있습니다. 기본값( true )은 응답을 캐시하는 것입니다.

useCache

이 URLRequest에서 데이터를 페치하기 전에 로컬 캐시를 참조할지 여부를 지정합니다. 이 속성은 AIR 응용 프로그램 샌드박스에서만 설정할 수 있습니다. 기본값( true )은 사용 가능한 경우 캐시된 로컬 버전을 사용하는 것입니다.

userAgent

HTTP 요청에 사용할 사용자 에이전트 문자열을 지정합니다.

참고: HTMLLoader 클래스에는 HTMLLoader 객체가 로드한 내용과 관련된 설정에 대한 관련 속성이 있습니다. 자세한 내용은 HTMLLoader 클래스 를 참조하십시오.

URLRequest 기본값 설정(AIR만 해당)

URLRequestDefaults 클래스를 사용하여 URLRequest 객체의 응용 프로그램별 기본 설정을 정의할 수 있습니다. 예를 들어 다음 코드에서는 manageCookies useCache 속성의 기본값을 설정합니다. 모든 새 URLRequest 객체는 일반적인 기본값 대신 이러한 속성에 지정된 값을 사용합니다.

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
참고: URLRequestDefaults 클래스는 Adobe AIR에서 실행되는 내용에 대해서만 정의되며 Flash Player에서는 지원되지 않습니다.

URLRequestDefaults 클래스에는 특정 호스트에 사용할 기본 사용자 이름과 암호를 지정할 수 있는 setLoginCredentialsForHost() 메서드가 포함되어 있습니다. 메서드의 hostname 매개 변수에 정의된 호스트는 "www.example.com" 과 같은 도메인이거나 "www.example.com:80" 과 같은 도메인과 포트 번호일 수 있습니다. "example.com" , "www.example.com" "sales.example.com" 은 각각 고유한 호스트로 간주됩니다.

이러한 자격 증명은 서버에서 요구하는 경우에만 사용됩니다. 사용자가 인증 대화 상자 등을 통해 이미 인증한 경우 setLoginCredentialsForHost() 메서드를 호출해도 인증된 사용자가 변경되지 않습니다.

다음 코드에서는 www.example.com에 보내는 요청에 사용되는 기본 사용자 이름 및 암호를 설정합니다.

URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); 

URLRequestDefaults 설정은 현재 응용 프로그램 도메인에만 적용되지만, 한 가지 예외가 있습니다. setLoginCredentialsForHost() 메서드에 전달된 자격 증명은 AIR 응용 프로그램 내의 모든 응용 프로그램 도메인에서 발생하는 요청에 사용됩니다.

자세한 내용은 Adobe Flash Platform용 ActionScript 3.0 참조 설명서 에서 URLRequestDefaults 클래스를 참조하십시오.

URI 스킴

모든 보안 샌드박스에서 이루어지는 요청에는 다음과 같은 표준 URI 스킴을 사용할 수 있습니다.

http: 및 https:

웹 브라우저에 사용되는 것과 같은 방식으로 표준 인터넷 URL에 사용합니다.

file:

file: 은 로컬 파일 시스템에 있는 파일의 URL을 지정하는 데 사용합니다. 예를 들면 다음과 같습니다.

file:///c:/AIR Test/test.txt 

AIR에서는 응용 프로그램 보안 샌드박스에서 실행되는 내용에 대한 URL을 정의할 때 다음과 같은 스킴도 사용할 수 있습니다.

app:

app: 는 설치된 응용 프로그램의 루트 디렉토리에 상대적인 경로를 지정하는 데 사용합니다. 예를 들어 다음 경로는 설치된 응용 프로그램 디렉토리의 resources 하위 디렉토리를 가리킵니다.

app:/resources 

ADL(AIR Debug Launcher)을 통해 AIR 응용 프로그램을 실행하는 경우 응용 프로그램 설명자 파일이 포함된 디렉토리가 응용 프로그램 디렉토리입니다.

File.applicationDirectory 를 사용하여 만든 File 객체의 URL 및 url 속성은 다음과 같이 app URI 스킴을 사용합니다.

var dir:File = File.applicationDirectory; 
dir = dir.resolvePath("assets"); 
trace(dir.url); // app:/assets 

app-storage:

app-storage: 는 응용 프로그램의 데이터 저장소 디렉토리에 상대적인 경로를 지정하는 데 사용합니다. 설치된 각 응용 프로그램 및 사용자에 대해 AIR은 해당 응용 프로그램 관련 데이터를 저장하기에 적절한 장소인 고유한 응용 프로그램 저장소 디렉토리를 만듭니다. 예를 들어 다음 경로는 응용 프로그램 저장소 디렉토리의 settings 하위 디렉토리에 있는 prefs.xml 파일을 가리킵니다.

app-storage:/settings/prefs.xml 

File.applicationStorageDirectory 를 사용하여 만든 File 객체의 URL 및 url 속성은 다음과 같이 app-storage URI 스킴을 사용합니다.

var prefsFile:File = File.applicationStorageDirectory; 
prefsFile = prefsFile.resolvePath("prefs.xml"); 
trace(dir.prefsFile); // app-storage:/prefs.xml 

mailto:

navigateToURL() 함수에 전달된 URLRequest 객체에 mailto 스킴을 사용할 수 있습니다. 다른 응용 프로그램에서 URL 열기 를 참조하십시오.

이러한 URI 스킴 중 하나를 사용하는 URLRequest 객체를 사용하여 FileStream 또는 Sound 객체와 같은 다양한 객체에 대한 URL 요청을 정의할 수 있습니다. AIR에서 실행되는 HTML 내용에서도 이러한 스킴을 사용할 수 있습니다. 예를 들어 img 태그의 src 특성에서 이러한 스킴을 사용할 수 있습니다.

그러나 응용 프로그램 보안 샌드박스에 있는 내용에서만 이러한 AIR 관련 URI 스킴( app: app-storage: )을 사용할 수 있습니다. 자세한 내용은 AIR 보안 을 참조하십시오.

URL 변수 설정

URL 문자열에 변수를 직접 추가할 수도 있지만 URLVariables 클래스를 사용하여 요청에 필요한 모든 변수를 정의하는 것이 더 쉽습니다.

다음 세 가지 방법으로 URLVariables 객체에 매개 변수를 추가할 수 있습니다.

  • URLVariables 생성자 내에서 지정

  • URLVariables.decode() 메서드를 사용하여 지정

  • URLVariables 객체 자체에 포함된 동적 속성에 따라 지정

다음 예제에서는 세 가지 방법 모두와 URLRequest 객체에 변수를 할당하는 방법을 보여 줍니다.

var urlVar:URLVariables = new URLVariables( "one=1&two=2" ); 
urlVar.decode("amp=" + encodeURIComponent( "&" ) ); 
urlVar.three = 3; 
urlVar.amp2 = "&&"; 
trace(urlVar.toString()); //amp=%26&amp2=%26%26&one=1&two=2&three=3 
 
var urlRequest:URLRequest = new URLRequest( "http://www.example.com/test.cfm" ); 
urlRequest.data = urlVar;

URLVariables 생성자 또는 URLVariables.decode() 메서드 내에 변수를 정의할 때는 URI 문자열에서 특별한 의미를 갖는 문자를 URL 인코딩해야 합니다. 예를 들어 매개 변수 이름 또는 값에 앰퍼샌드를 사용하는 경우 앰퍼샌드를 & 에서 %26 으로 인코딩해야 합니다. 이는 앰퍼샌드가 매개 변수 구분자 역할을 하기 때문입니다. 이를 위해 최상위 수준 encodeURIComponent() 함수를 사용할 수 있습니다.

URLLoader 클래스 사용

URLLoader 클래스를 사용하면 서버에 요청을 보내고 반환된 정보에 액세스할 수 있습니다. 또한 URLLoader 클래스를 사용하면 로컬 파일 액세스가 허용되는 상황(예: Flash Player local-with-filesystem 샌드박스 및 AIR 응용 프로그램 샌드박스)에서 로컬 파일 시스템에 있는 파일에 액세스할 수 있습니다. URLLoader 클래스는 URL에서 텍스트, 이진 데이터 또는 URL 인코딩된 변수 형식으로 데이터를 다운로드합니다. URLLoader 클래스는 complete , httpStatus , ioError , open , progress , securityError 등의 이벤트를 전달합니다.

ActionScript 3.0 이벤트 처리 모델은 ActionScript 2.0 모델과 많은 차이가 있습니다. 2.0 모델의 경우 LoadVars.onData , LoadVars.onHTTPStatus LoadVars.onLoad 이벤트 핸들러를 사용했습니다. ActionScript 3.0에서의 이벤트 처리에 대한 자세한 내용은 이벤트 처리 를 참조하십시오.

다운로드되는 데이터는 다운로드가 완료될 때까지 사용할 수 없습니다. progress 이벤트를 수신하여 전달되는 다운로드의 진행률(로드된 바이트 및 총 바이트)을 모니터링할 수 있습니다. 그러나 파일이 너무 빠르게 로드되면 progress 이벤트가 전달되지 않을 수 있습니다. 파일이 성공적으로 다운로드되면 complete 이벤트가 전달됩니다. URLLoader dataFormat 속성을 설정하면 데이터를 텍스트, 원시 이진 데이터 또는 URLVariables 객체로 받을 수 있습니다.

URLLoader.load() 메서드 및 URLLoader 클래스 생성자(선택 항목)는 URLRequest 객체인 request 하나만 매개 변수로 사용합니다. URLRequest 객체에는 대상 URL, 요청 메서드( GET 또는 POST ), 추가 헤더 정보 및 MIME 유형과 같은 단일 HTTP 요청의 모든 정보가 들어 있습니다.

예를 들어 XML 패킷을 서버측 스크립트에 업로드할 때 다음과 같은 코드를 사용할 수 있습니다.

var secondsUTC:Number = new Date().time; 
var dataXML:XML =  
    <clock> 
        <time>{secondsUTC}</time> 
    </clock>; 
var request:URLRequest = new URLRequest("http://www.yourdomain.com/time.cfm"); 
request.contentType = "text/xml"; 
request.data = dataXML.toXMLString(); 
request.method = URLRequestMethod.POST; 
var loader:URLLoader = new URLLoader(); 
loader.load(request); 

앞의 코드 예제에서는 dataXML 이라는 XML 문서(서버에 보낼 XML 패킷 포함)를 만듭니다. 예제에서는 먼저 URLRequest contentType 속성을 "text/xml" 로 설정하고 XML 문서를 URLRequest data 속성에 할당합니다. 마지막으로, URLLoader 객체를 생성하고 load() 메서드를 사용하여 원격 스크립트로 요청을 보냅니다.

URLStream 클래스 사용

URLStream 클래스는 데이터가 도착하면 다운로드 중인 데이터에 대한 액세스를 제공합니다. URLStream 클래스를 사용하면 다운로드가 완료되기 전에 스트림을 닫을 수도 있습니다. 다운로드된 데이터는 원시 이진 데이터로 사용할 수 있습니다.

URLStream 객체에서 데이터를 읽을 때는 먼저 bytesAvailable 속성을 통해 충분한 데이터를 사용할 수 있는지 확인합니다. 사용할 수 있는 데이터 이상으로 데이터를 읽으려고 하면 EOFError 예외가 발생합니다.

httpResponseStatus 이벤트(AIR)

Adobe AIR에서 URLStream 클래스는 httpStatus 이벤트 이외에 httpResponseStatus 이벤트를 전달합니다. httpResponseStatus 이벤트가 전달된 후 응답 데이터(있는 경우)가 전달됩니다. HTTPStatusEvent 클래스로 표현된 httpResponseStatus 이벤트에는 응답이 반환된 URL인 responseURL 속성과 응답을 반환한 응답 헤더를 나타내는 URLRequestHeader 객체의 배열인 responseHeaders 속성이 포함됩니다.

외부 문서에서 데이터 로드

동적 응용 프로그램을 작성하는 경우 외부 파일 또는 서버 측 스크립트에서 데이터를 로드하는 것이 좋을 수 있습니다. 그러면 응용 프로그램을 편집하거나 다시 컴파일하지 않고도 동적 응용 프로그램을 작성할 수 있습니다. 예를 들어 "오늘의 팁"을 표시하는 응용 프로그램을 작성하는 경우 하루에 한 번씩 데이터베이스에서 임의로 하나의 팁을 가져와 텍스트 파일로 저장하는 서버 측 스크립트를 작성할 수 있습니다. 그러면 응용 프로그램에서 매번 데이터베이스를 쿼리하지 않고 정적 텍스트 파일의 내용을 로드할 수 있습니다.

다음 코드 예제에서는 외부 텍스트 파일인 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()); 
        } 
    } 
}

외부 스크립트와 통신

외부 데이터 파일 로드 외에 URLVariables 클래스를 사용하여 변수를 서버측 스크립트로 전송하고 서버의 응답을 처리할 수도 있습니다. 예를 들어 이 방법은 게임을 프로그래밍하는 경우 사용자의 점수를 서버에 전송하여 고득점 목록에 추가할지 여부를 계산하거나 사용자 로그인 정보를 서버에 전송하여 확인하려는 경우에 유용합니다. 서버측 스크립트는 사용자 이름과 암호를 처리하고, 데이터베이스에서 해당 이름과 암호의 유효성을 검사하며, 사용자가 제공한 자격 증명이 유효한지 여부를 확인하여 반환할 수 있습니다.

다음 코드 예제에서는 variables 라는 URLVariables 객체를 만듭니다. 이 객체는 name 이라는 새 변수를 만듭니다. 다음으로, 변수를 보낼 서버측 스크립트의 URL을 지정하는 URLRequest 객체를 만듭니다. 그런 다음 URLRequest 객체의 method 속성을 설정하여 변수를 HTTP POST 요청으로 보냅니다. URLVariables 객체를 URL 요청에 추가하려면 URLRequest 객체의 data 속성을 이전에 만든 URLVariables 객체로 설정합니다. 마지막으로 URLLoader 인스턴스가 만들고 URLLoader.load() 메서드를 호출하여 요청을 시작합니다.

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 문서의 내용이 포함되어 있습니다.

<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> 
    <cfset Form.Name = "Stranger" /> 
</cfif> 
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# 
</cfoutput>