Wer kennt das Problem
nicht, man erzeugt auf einer ColdFusion-Seite komplexe Datenstrukturen die Structures
und Arrays oder holt sich Recordsets aus der Datenbank und möchte diese Daten
eigentlich auf der nächsten Seite nochmal auslesen. Oder man möchte ein Recordset
im Browser mit Javascript weiterbenutzen um z.B. dynamisch eine Selectbox zu
füllen.
Auch kann es sich mal ergeben, strukturierte Daten an ein COM-Objekt weiterleiten
zu müssen. Es gibt sicher viele Möglichkeiten, diese Aufgaben zu bewerkstelligen.
Man kann die Strukturen zerlegen und im anderen System wieder selbst zusammenbauen
oder auch Session-Variablen benutzen (solange man in ColdFusion bleibt). Man
kann aber auch das für diesen Zweck geschaffene WDDX (Web Dynamic Data Exchange)
nutzen.
Dass WDDX nichts hochkomplexes ist, soll dieses kurze Einführungsbeispiel (anstatt einer langatmigen Einführung) zeigen. Die WDDX-Technologie in ihrer Mächtigkeit wird aber später noch ausführlicher erläutert.
Diese Zeilen erzeugen eine recht einfache Struktur und füllt sie mit Werten:
<cfset Auto=StructNew()>
<cfset Auto.Typ="bmw neu">
<cfset Auto.Fenster="sauber">
<cfset Auto.Raeder=4>
Diese Daten möchten wir jetzt in möglichst einfacher Weise über die URL an eine zweite Seite übermitteln. ColdFusin bietet dazu das WDDX-Tag, dass den Datensatz in ein Datenpaket konvertiert. Das sieht dann so aus:
<cfwddx action= "CFML2WDDX" input= "#Auto#" output= "WddxAuto" >
Das Action-Attribut
gibt durch den Wert "CFML2WDDX" an, dass wir einen
ColdFusion-Datensatz in ein WDDX-Paket konvertieren wollen. Die Inputvariable
(die Variable, die den Ausgangs-Datensatz enthält) wird im INPUT-Attribut angegeben,
die Variable, die das WDDX-Paket erhalten soll wird im CFOUTPUT-Attribut
spezifiziert.
Nach Abarbeitung dieser
Zeile enthält also die Variable WddxAuto ein Datenpaket, das wir jetzt
auf dem üblichen Weg zur nächsten Seite transferieren können.
<a href="2.cfm?p=
<cfoutput>
#URLEncodedFormat(WddxAuto)#
</cfoutput>
">weiter</a>
Wir übergeben das Paket in der URL-Variable p. Das Datenpaket muss natürlich URL-Codiert werden. Den Vorgang des Umwandelns einer Datenstruktur in ein WDDX-Datenpaket nennt sich übrigens Serializierung.
Auf der Seite 2.cfm
bekommt man jetzt also die Variable URL.p übergeben und man muss aus
dem WDDX-Paket jetzt wieder durch eine Konvertierung (deserializieren) die alte
Datenstruktur herstellen.
Auch dazu ist
nur eine Zeile Programmcode und das CFWDDX-Tag nötig:
<cfwddx action= "WDDX2CFML" input= "#URL.p1#" output= "Auto2" >
Wir wollen ein WDDX-Paket in eine ColdFusion-Variable konvertieren und geben als Action-Attribut deshalb "WDDX2CFML" an. Die Inputvariable (die Variable, die den WDDX-Datensatz enthält) wird im INPUT-Attribut angegeben, die Variable, die den ursprünglichen Datensatz erhalten soll wird im CFOUTPUT-Attribut festgelegt. Nach Abarbeitung dieser Zeile enthält also die Variable Auto2 ein Datenpaket, dass die gleiche Struktur und Daten wie die Ausgangsvariable hat. Die neue Variable muss also auch nicht den Namen der alten Variable tragen. Bedingt durch eine skeptische Grundhaltung geben wir also nochmal die einzelnen Elemente des Autos aus und müssen feststellen, dass alles noch so vorhanden ist wie es sein sollte.
<cfoutput>
Auto2.Typ=#Auto2.Typ# <br>
Auto2.Fenster=#auto2.Fenster# <br>
Auto2.Raeder=#auto2.Raeder# <br>
</cfoutput>
WDDX funktioniert also wirklich...
Einen Punkt gilt es noch zu beachten. Strings können auch doppelte Hochkommas (") enthalten, die bei Zuweisung an ein Feld in einem Formular Probleme machen. In diesem Fall kann man mittels der Funktion HTMLEditFormat() das Packet vorher konvertieren und dann dem Formularelement, z.B. einem Hiddenfeld, zuweisen. Das so bearbeitete Packets lässt sich dann trotzdem problemlos zurück-deserialisieren.
<cfoutput>
<input type="hidden" value="
#HTMLEditFormat(WddxAuto)#
" name="data">
</cfoutput>