Ładowanie danych zewnętrznych

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Język ActionScript 3.0 udostępnia mechanizmy przeznaczone do wysyłania danych ze źródeł zewnętrznych. Te źródła mogą udostępniać treści statyczne, np. pliki tekstowe, lub dynamiczne, wygenerowane przez skrypt sieci Web. Dane mogą mieć różne formaty, a język ActionScript udostępnia funkcje przeznaczone do dekodowania i uzyskiwania dostępu do danych. W ramach procesu pobierania danych można wysyłać dane na serwer zewnętrzny.

Korzystanie z klasy URLRequest

Wiele interfejsów API służących do ładowania danych zewnętrznych wykorzystuje klasę URLRequest w celu zdefiniowania właściwości wymaganego żądania sieci.

Właściwości klasy URLRequest

Następujące właściwości obiektu URLRequest można ustawić w dowolnym zabezpieczonym obszarze izolowanym.

Właściwość

Opis

contentType

Typ zawartości MIME dowolnych danych wysyłanych za pomocą żądania URL. Jeśli nie zostanie ustawiona żadna wartość właściwości contentType, wówczas wartości są wysyłane jako application/x-www-form-urlencoded .

data

Obiekt zawierający dane, które będą przesyłane razem z żądaniem URL.

digest

Ciąg znaków jednoznacznie określający oznaczony składnik platformy Adobe, który ma być przechowywany w (lub pobierany z) pamięci podręcznej programu Adobe® Flash® Player.

method

Metoda żądania HTTP, np. GET lub POST. (Zawartość działająca w domenie zabezpieczeń aplikacji AIR może określać ciągi znaków inne niż "GET" lub "POST" jako właściwość method . Dozwolona jest dowolna komenda HTTP, a metoda "GET" jest metodą domyślną. Patrz Zabezpieczenia w środowisku AIR ).

requestHeaders

Tablica nagłówków żądania HTTP, które mają być dołączone do żądania HTTP. Uprawnienia do niektórych nagłówków są ograniczone w treściach środowisk Flash Player i AIR działających poza zabezpieczonym obszarem izolowanym aplikacji.

url

Określa żądany adres URL.

W środowisku AIR można ustawić dodatkowe właściwości klasy URLRequest, które będą dostępne tylko dla treści środowisk AIR działających w zabezpieczonym obszarze izolowanym aplikacji. Treść w obszarze izolowanym aplikacji może także definiować adresy URL przy użyciu nowych schematów URL (oprócz schematów standardowych, takich jak file i http ).

Właściwość

Opis

followRedirects

Określa, czy śledzone są przekierowania ( true — wartość domyślna) czy nie ( false ). Ta możliwość występuje tylko w obszarze izolowanym aplikacji AIR.

manageCookies

Określa, czy stos protokołu HTTP zarządza plikami cookie ( true — wartość domyślna) lub nie ( false ) w danym żądaniu. Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR.

authenticate

Określa, czy dla danego żądania będą obsługiwane żądania uwierzytelniania ( true ). Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR. Domyślnie żądania są uwierzytelniane — to może powodować wyświetlanie okna dialogowego uwierzytelniania, jeśli serwer wymaga referencji. Można również ustawić nazwę użytkownika i hasło za pomocą klasy URLRequestDefaults. Zobacz Ustawianie wartości domyślnych dla obiektu URLRequest (tylko środowisko AIR) .

cacheResponse

Określa, czy dane odpowiedzi powinny być zapisane w pamięci podręcznej dla tego żądania. Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR. Domyślnie odpowiedź jest zapisywana w pamięci podręcznej ( true ).

useCache

Określa, czy wymagane jest sprawdzenie lokalnej pamięci podręcznej zanim klasa URLRequest pobierze dane. Ustawianie tej właściwości jest możliwe tylko w obszarze izolowanym aplikacji AIR. Ustawienie domyślne ( true ) określa używanie lokalnej wersji danych z pamięci podręcznej, jeśli są tam dostępne.

userAgent

Określ ciąg znaków użytkownik-agent, który powinien być używany w żądaniu HTTP.

Uwaga: Klasa HTMLLoader zawiera powiązane właściwości przeznaczone dla ustawień dotyczących treści ładowanej przez obiekt HTMLLoader. Szczegółowe informacje zawiera sekcja Informacje o klasie HTMLLoader .

Ustawianie wartości domyślnych dla obiektu URLRequest (tylko środowisko AIR)

Klasa URLRequestDefaults umożliwia zdefiniowanie domyślnych ustawień aplikacji dla obiektów URLRequest. Na przykład: poniższy kod ustawia domyślne wartości dla właściwości manageCookies i useCache . Wszystkie nowe obiekty URLRequest będą korzystać z określonych wartości dla tych właściwości zamiast normalnych ustawień domyślnych:

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
Uwaga: Klasa URLRequestDefaults jest zdefiniowana dla treści działających tylko w środowisku Adobe AIR. Nie jest obsługiwana w programie Flash Player.

Klasa URLRequestDefaults zawiera metodę setLoginCredentialsForHost() , która umożliwia określenie domyślnej nazwy użytkownika oraz hasła, które będą używane dla określonego hosta. Host, zdefiniowany w parametrze hostname metody, może być domeną, np. "www.example.com" , lub domeną i numerem portu, np. "www.example.com:80" . Nazwy "example.com" , "www.example.com" oraz "sales.example.com" stanowią unikalne nazwy różnych hostów.

Te referencje są używane tylko wówczas, gdy serwer tego wymaga. Jeżeli użytkownik został już uwierzytelniony (na przykład poprzez skorzystanie z okna dialogowego uwierzytelniania), wówczas wywołanie metody setLoginCredentialsForHost() nie zmieni uwierzytelnionego użytkownika.

Za pomocą poniższego kodu ustawiana jest domyślna nazwa użytkownika i hasło dla żądań wysyłanych do www.example.com:

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

Ustawienia URLRequestDefaults dotyczą wyłącznie domeny bieżącej aplikacji, z jednym wyjątkiem. Poświadczenia przekazane do metody setLoginCredentialsForHost() są wykorzystywane dla żądań wykonywanych w domenie dowolnej aplikacji w obrębie aplikacji środowiska AIR.

Więcej informacji zawiera opis klasy URLRequestDefaults w Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash .

Schematy URI

Standardowe schematy URI takie jak te przedstawione poniżej, mogą być wykorzystywane w żądaniach wykonywanych z dowolnego zabezpieczonego obszaru izolowanego:

http: i https:

Tych schematów należy użyć dla standardowych adresów URL sieci WWW (w taki sam sposób, jak są one wykorzystywane w przeglądarce WWW).

file:

Schematu file: należy użyć w celu określenia adresu URL pliku położonego w lokalnym systemie plików. Na przykład:

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

W środowisku AIR w przypadku definiowania adresów URL dla zawartości działającej w obszarze izolowanym aplikacji można również używać następujących schematów:

app:

app: służy do określania ścieżki względem katalogu głównego zainstalowanej aplikacji. Przykład: poniższa ścieżka wskazuje na podkatalog resources katalogu zainstalowanej aplikacji:

app:/resources 

Gdy aplikacja środowiska AIR jest uruchamiana za pomocą programu AIR Debug Launcher (ADL), katalogiem aplikacji jest katalog zawierający plik deskryptora dla aplikacji.

Adres URL (i właściwość url ) obiektu File utworzonego przy użyciu właściwości File.applicationDirectory korzysta ze schematu URI app w następujący sposób:

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

app-storage:

app-storage: służy do określania ścieżki względem katalogu przechowywania danych aplikacji. Dla każdej zainstalowanej aplikacji (i użytkownika) środowisko AIR definiuje unikalny katalog przechowywania danych aplikacji, który jest miejscem użytecznym do zapisu danych charakterystycznych dla danej aplikacji. Na przykład poniższa ścieżka wskazuje na plik prefs.xml w podkatalogu settings katalogu magazynu aplikacji.

app-storage:/settings/prefs.xml 

Adres URL (i właściwość url ) dla obiektu File utworzonego w katalogu File.applicationStorageDirectory korzysta ze schematu URI app-storage , co przedstawiono poniżej:

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

mailto:

Schematu mailto można używać w obiektach URLRequest przekazywanych do funkcji navigateToURL() . Zobacz Otwieranie adresu URL w innej aplikacji .

Istnieje możliwość użycia obiektu URLRequest, który będzie korzystał z dowolnego ze schematów URI w celu zdefiniowania żądania URL dla pewnej liczby innych obiektów, takich jak FileStream lub Sound. Możliwe jest także użycie tych schematów w treści HTML działającej w środowisku AIR; na przykład: te schematy mogą być używane w atrybucie src znacznika img .

Jednak możliwe jest używanie tych schematów URI właściwych dla środowiska AIR ( app: i app-storage: ) tylko w treści w bezpiecznym obszarze izolowanym aplikacji. Więcej informacji zawiera sekcja Zabezpieczenia w środowisku AIR .

Ustawianie zmiennych URL

Chociaż możliwe jest dodawanie zmiennych bezpośrednio do ciągów URL, łatwiejszym sposobem jest użycie klasy URLVariables w celu zdefiniowania dowolnych zmiennych wymaganych dla żądania.

Istnieją trzy sposoby dodawania parametrów do obiektu URLVariables:

  • W konstruktorze URLVariables

  • Za pomocą metody URLVariables.decode()

  • Jako dynamicznych właściwości samego obiektu URLVariables

W poniższym przykładzie przedstawiono wszystkie trzy metody oraz sposób przypisania zmiennych do obiektu 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;

Podczas definiowania zmiennych w konstruktorze URLRequest lub w metodzie URLVariables.decode() należy upewnić się, że znaki o specjalnym znaczeniu w ciągu URI zostały zakodowane jako adresy URL. Na przykład, w przypadku użycia znaku ampersand (&) w nazwie lub wartości parametru należy go zakodować, zmieniając z & na %26 , ponieważ znak ampersandu pełni rolę separatora w parametrach. W tym celu można wykorzystać funkcję najwyższego poziomu encodeURIComponent() .

Korzystanie z klasy URLLoader

Klasa URLLoader umożliwia wysyłanie żądania na serwer i uzyskiwanie dostępu do zwracanych informacji. Klasę URLLoader można również wykorzystać w celu uzyskania dostępu do plików z lokalnego systemu plików w sytuacjach, gdy dozwolony jest dostęp do plików lokalnych (np. obszar izolowany lokalny z systemem plików Flash Player oraz obszar izolowany aplikacji AIR). Klasa URLLoader pozwala pobierać dane spod adresu URL; można je pobierać w postaci tekstu, danych binarnych i zakodowanych zmiennych. Klasa URLLoader wywołuje takie zdarzenia, jak complete , httpStatus , ioError , open , progress i securityError .

Model obsługi zdarzeń ActionScript 3.0 znacznie różni się od modelu ActionScript 2.0, w którym były wykorzystywane moduły obsługi zdarzeń LoadVars.onData , LoadVars.onHTTPStatus i LoadVars.onLoad . Więcej informacji na temat obsługiwania zdarzeń w ActionScript 3.0 zawiera sekcja Obsługa zdarzeń

Pobrane dane nie są dostępne do czasu zakończenia pobierania. Postęp pobierania (liczbę bajtów pobranych i całkowitą liczbę bajtów) można monitorować, wykrywając wywołanie zdarzenia progress . Jeśli jednak plik zostanie załadowany bardzo szybko, zdarzenie progress może nie zostać wywołane ani razu. Po pomyślnym pobraniu pliku następuje wywołanie zdarzenia complete . Poprzez ustawienie właściwości dataFormat klasy URLLoader można otrzymywać dane jako obiekty tekstowe, surowe dane binarne lub obiekt URLVariables.

Metoda URLLoader.load() (i opcjonalnie konstruktor klasy URLLoader) przyjmuje pojedynczy parametr request , który jest obiektem URLRequest. Obiekt URLRequest zawiera wszystkie informacje dla pojedynczego żądania HTTP, takie jak docelowy adres URL, metoda żądania ( GET lub POST ), dodatkowe informacje nagłówka, a także typ MIME.

Na przykład: aby wysłać pakiet XML do skryptu po stronie serwera, można użyć poniższego kodu:

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); 

Poprzedni urywek tworzy dokument XML o nazwie dataXML , który zawiera pakiet XML przeznaczony do wysłania na serwer. W przykładzie ustawiono właściwość contentType klasy URLRequest na wartość „text/xml" i przypisano dokument XML do właściwości data klasy URLRequest. Na końcu przykładu utworzono obiekt URLLoader i wysłano żądanie do zdalnego skryptu poprzez zastosowanie metody load() .

Korzystanie z klasy URLStream

Klasa URLStream zapewnia dostęp do pobieranych danych w miarę ich ładowania. Klasa URLStream umożliwia również zamknięcie strumienia przed zakończeniem ładowania. Pobrane dane są dostępne jako surowe dane binarne.

Podczas odczytu danych z obiektu URLStream należy użyć właściwości bytesAvailable w celu określenia, czy dostępna jest wystarczająca ilość danych przed ich odczytaniem. W przypadku podjęcia próby odczytu większej ilości danych niż dostępna wywoływany jest wyjątek EOFError.

Zdarzenie httpResponseStatus (środowisko AIR).

W środowisku Adobe AIR klasa URLStream poza zdarzeniem httpStatus wywołuje jeszcze zdarzenie httpResponseStatus . Zdarzenie httpResponseStatus jest dostarczane przed wszystkimi danymi odpowiedzi. Zdarzenie httpResponseStatus (reprezentowane przez klasę HTTPStatusEvent) zawiera właściwość responseURL . Jest to adres URL, z którego została zwrócona odpowiedź. Zawiera ono też właściwość responseHeaders , która jest tablicą obiektów URLRequestHeader reprezentujących nagłówki odpowiedzi zwrócone w odpowiedzi.

Wysyłanie danych z dokumentów zewnętrznych

W aplikacjach dynamicznych stosuje się często technikę ładowania danych z plików zewnętrznych lub skryptów serwerowych. Umożliwia to budowanie dynamicznych aplikacji bez konieczności edycji lub ponownego kompilowania aplikacji. Przykład: w przypadku tworzenia aplikacji „wskazówka dnia” można napisać skrypt serwerowy, który będzie losowo pobierał wskazówkę z bazy danych i zapisywał ją w pliku tekstowym raz dziennie. Następnie aplikacja może wysłać treść statycznego pliku tekstowego zamiast generowania zapytania do bazy danych za każdym razem.

Poniższy urywek tworzy obiekt URLRequest i URLLoader, który ładuje treść zewnętrznego pliku tekstowego params.txt:

var request:URLRequest = new URLRequest("params.txt"); 
var loader:URLLoader = new URLLoader(); 
loader.load(request);
Jeśli nie zostanie zdefiniowana metoda żądania, wówczas domyślnie program Flash Player lub Adobe AIR wysyła treść za pomocą metody HTTP GET . Aby wysłać żądanie za pomocą metody POST , należy ustawić właściwość request.method na POST , korzystając ze stałej statycznej URLRequestMethod.POST , co ilustruje poniższy przykład:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); 
request.method = URLRequestMethod.POST;

Zewnętrzny dokument — params.txt — ładowany w czasie wykonywania, zawiera następujące dane:

monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

Plik zawiera dwa parametry: monthNames i dayNames . Każdy parametr zawiera rozdzielaną przecinkami listę, której elementy są analizowane jako ciągi znaków. Listę można rozdzielić na tablicę, korzystając z metody String.split() .

Nazwy zmiennych w plikach zewnętrznych nie powinny zawierać słów zarezerwowanych ani konstrukcji językowych, ponieważ może to spowodować utrudnienie odczytywania i debugowania kodu.
Po załadowaniu danych następuje wywołanie zdarzenia complete , a treść zewnętrznego dokumentu staje się dostępna do użytku we właściwości data URLLoader, jak w poniższym kodzie:
function completeHandler(event) 
{ 
    var loader2 = event.target; 
    air.trace(loader2.data); 
}

Jeśli zdalny dokument zawiera pary nazwa-wartość, można analizować dane za pomocą klasy URLVariables, przekazując zawartość wysłanego pliku, jak poniżej:

private function completeHandler(event:Event):void 
{ 
    var loader2:URLLoader = URLLoader(event.target); 
    var variables:URLVariables = new URLVariables(loader2.data); 
    trace(variables.dayNames); 
}

Każda para nazwa-wartość z zewnętrznego pliku jest tworzona jako właściwość w obiekcie URLVariables. Każda właściwość w obiekcie zmiennych z poprzedniego kodu jest traktowana jako ciąg znaków. Jeśli wartością pary nazwa-wartość jest lista elementów, ciąg znaków można zamienić na tablicę poprzez wywołanie metody String.split() w następujący sposób:

var dayNameArray:Array = variables.dayNames.split(",");
W przypadku wysyłania danych liczbowych z zewnętrznych plików tekstowych wymagana jest konwersja wartości na wartości liczbowe za pomocą funkcji najwyższego poziomu, takiej jak int() , uint() lub Number() .

Zamiast wysyłania treści pliku zdalnego w postaci ciągu znaków i tworzenia nowego obiektu URLVariables można ustawić właściwość URLLoader.dataFormat na jedną z właściwości statycznych dostępnych w klasie URLLoaderDataFormat. Trzy możliwe wartości właściwości URLLoader.dataFormat są następujące:

  • URLLoaderDataFormat.BINARY — właściwość URLLoader.data będzie zawierała dane binarne zapisane w obiekcie ByteArray.

  • URLLoaderDataFormat.TEXT — właściwość URLLoader.data będzie zawierała tekst w obiekcie String.

  • URLLoaderDataFormat.VARIABLES — właściwość URLLoader.data będzie zawierała zmienne (zakodowane w adresie URL) zapisane w obiekcie URLVariables.

Poniższy kod przedstawia sposób, w jaki ustawienie URLLoaderDataFormat.VARIABLES dla właściwości URLLoader.dataFormat umożliwia automatyczne analizowanie wysłanych danych na obiekt 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); 
        } 
    } 
}
Uwaga: Domyślną wartością URLLoader.dataFormat jest URLLoaderDataFormat.TEXT .

W poniższym przykładzie przedstawiono ładowanie danych XML z zewnętrznego pliku w ten sam sposób, jak wysyłanie URLVariables. W celu pobrania zdalnego dokumentu XML można utworzyć instancję URLRequest oraz instancję URLLoader. Po pobraniu całego pliku następuje wywołanie zdarzenia Event.COMPLETE , a treść zewnętrznego pliku zostaje przekonwertowane na instancję XML, którą można przeanalizować za pomocą metod i właściwości 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()); 
        } 
    } 
}

Komunikacja ze skryptami zewnętrznymi

Oprócz wysyłania zewnętrznych plików danych klasa URLVariables może również służyć do wysyłania zmiennych do skryptów serwerowych oraz przetwarzania odpowiedzi serwera. Jest to użyteczne szczególnie w przypadku programowania gry, gdy wymagane jest przesyłanie punktacji użytkownika na serwer w celu obliczenia, czy punktacja powinna zostać dodana do listy rekordów, a także w przypadku wysyłania danych logowania użytkownika na serwer w celu sprawdzenia poprawności. Skrypt serwerowy może przetworzyć nazwę i hasło użytkownika, sprawdzić jego poprawność w bazie danych, a następnie zwrócić potwierdzenie dotyczące tego, czy dane wprowadzone przez użytkownika są poprawne.

Poniższy urywek tworzy obiekt URLVariables o nazwie variables, , który tworzy nową zmienną o nazwie name . Następnie zostaje utworzony obiekt URLRequest, który określa adres URL skryptu serwerowego, do którego wysyłane są zmienne. Następnie użytkownik ustawia właściwość method obiektu URLRequest w celu wysłania zmiennych w postaci żądania HTTP POST . Aby dodać obiekt URLVariables do żądania URL, należy ustawić dla właściwości data obiektu URLRequest obiekt URLVariables utworzony wcześniej. Na koniec następuje utworzenie instancji URLLoader oraz wywołanie metody URLLoader.load() , która inicjuje żądanie.

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); 
}

Poniższy kod zawiera treść dokumentu Adobe ColdFusion® greeting.cfm, który został wykorzystany w poprzednim przykładzie:

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