Steffen Goldfuß Christoph Schmitz
Web Application Development mit ColdFusion 4.5 Paralax em
Bitte beachten Sie: Der originalen Printversion liegt eine CD-ROM bei. In der vorliegenden elektronischen Version ist die Lieferung einer CD-ROM nicht enthalten. Alle Hinweise und alle Verweise auf die CD-ROM sind ungültig.
An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam
Die Deutsche Bibliothek - CIP-Einheitsaufnahme Ein Titeldatensatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich.
Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Falls alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden. Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt. Die Einschrumpffolie – zum Schutz vor Verschmutzung – ist aus umweltfreundlichem und recyclingfähigem PE-Material. The word »Allaire«, the Allaire »A« logo, the »« tag logo, the word ColdFusion and the ColdFusion »hand clutching lightning bolt« logo are registered trademarks of Allaire Corporation. Autor und Verlag bedanken sich bei Allaire Corporation für die Genehmigung, die Sprachrefernz übernehmen zu dürfen.
10 9 8 7 6 5 4 3 2 1 04 03 02 01 ISBN 3-8273-1743-6 © 2001 by Addison-Wesley Verlag, ein Imprint der Pearson Education Deutschland GmbH, Martin-Kollar-Straße 10–12, D-81829 München/Germany Alle Rechte vorbehalten Einbandgestaltung: atelier für gestaltung, niesner & huber, Wuppertal Lektorat: Sylvia Hasselbach,
[email protected] Korrektorat: Johannes Gerritsen, Emmerich Herstellung: Anna Plenk,
[email protected] Satz: reemers publishing services gmbh, Krefeld Druck und Verarbeitung: Bercker Graphische Betriebe, Kevelaer Printed in Germany
Inhaltsverzeichnis Vorwort
13
Teil 1: Grundlagen
17
1 Einführung
19
1.1
1.2
Das World Wide Web – Grundlagen 1.1.1 Web-Dokumente und Webbrowser 1.1.2 Webserver
19 20 21
1.1.3 URLs Web-Applikationen
22 23
1.2.1
Common Gateway Interface (CGI)
23
1.2.2 1.2.3 1.2.4
Webserver-Erweiterungen ASP (Active Server Pages) PHP (PHP Hypertext Preprocessor)
24 24 25
1.2.5 1.2.6 1.2.7
ColdFusion Vor- und Nachteile des ColdFusion Application Servers Die Entwicklung von ColdFusion – die wichtigsten Eckpunkte Ausblick auf die Zukunft
25 26
1.2.8 1.3 1.4 1.5
27 28
Die unterschiedlichen ColdFusion Versionen Was braucht man, um ColdFusion verwenden zu können? Installation von ColdFusion
29 30 31
1.5.1 1.5.2
31 34
Installation unter Linux Installation unter Windows
2 Grundlagen
41
2.1
Templates
41
2.2
Variablen 2.2.1 Einfache Variablen
43 43
2.2.2
Ausgabe von Variablen
47
2.2.3 2.2.4
Existenz und Defaultwerte von Variablen URL-Parameter
48 51
2.2.5
Form-Variablen
57
5
Inhaltsverzeichnis
2.3
2.4
2.5 2.6
Operatoren 2.3.1 Arithmetische Operatoren
57 57
2.3.2 2.3.3 2.3.4
58 60 61
Vergleichsoperatoren Stringoperatoren Logikoperatoren
2.3.5 Bit-Operatoren Programmablaufsteuerung 2.4.1 Bedingte Programmausführung
62 64 64
2.4.2
67
Schleifen
Beispielprogramm – Loginsystem Komplexe Variablen 2.6.1 Arrays
74 76 76
2.6.2
Strukturen
83
2.6.3
Listen
87
3 Formulare und Form-Variablen 3.1 3.2 3.3
Aufbau von Formularen Besonderheiten bei Checkboxen und Radiobuttons Mehrfachselektion mit List- und Checkboxen
91 93 94
3.4
Die Fieldnames-Variable
96
3.5
Formularvalidierung 3.5.1 Serverseitige Formularvalidierung
97 98
3.5.2
Clientseitige Formularvalidierung mit
99
3.5.3
Serverseitige Validierung oder doch clientseitig?
4 Datenbankzugriff
104 105
4.1
Wozu Datenbanken im Internet
105
4.2 4.3
Relationale Datenbanken SQL 4.3.1 Daten mit SELECT ausgeben
106 109 110
4.3.2
Neue Daten einfügen mit INSERT
113
4.3.3 4.3.4 4.3.5
Daten mit UPDATE ändern Daten mit DELETE löschen Daten aus mehreren Tabellen ausgeben
114 116 116
4.4
6
91
Verbindungsaufbau zur Datenbank 4.4.1 Zugriff über ODBC 4.4.2 Zugriff über OLEDB (Windows)
118 118 126
Inhaltsverzeichnis
4.5
4.6
Datenbankzugriff mit 4.5.1 Datenbankabfragen mit
128 130
4.5.2 4.5.3 4.5.4
Datenmanipulation mit CFQUERY Beispielapplikation: SQL-Monitor Dynamisches Einfügen von Daten mit
144 144 150
4.5.5 Dynamisches Ändern von Daten mit 4.5.6 Gruppiertes Ausgeben von Datensätzen Benutzung von gespeicherten Prozeduren
153 155 156
4.6.1
Was sind gespeicherte Prozeduren?
156
4.6.2 4.6.3
Vorteile gespeicherter Prozeduren Erzeugung gespeicherter Prozeduren mit MS SQL-Server 7
157
Benutzung gespeicherter Prozeduren
161
4.6.4 4.7
Beispielapplikation Mitarbeiterverwaltung
5 Dateien und Verzeichnisse 5.1
5.2
5.3
5.4
178 189
Arbeiten mit Dateien
189
5.1.1
Dateien kopieren
190
5.1.2
Dateien verschieben
191
5.1.3 5.1.4
Dateien umbenennen Dateien löschen
191 192
Dateien lesen und schreiben mit
192
5.2.1 5.2.2
192 192
Dateien einlesen Binäre Dateien einlesen
5.2.3 Schreiben von Dateien 5.2.4 Inhalte an Dateien anfügen 5.2.5 Dateien uploaden mit CFFILE Verzeichnisoperationen mit
193 194 194 197
5.3.1
Verzeichnisse anlegen
197
5.3.2 5.3.3
Verzeichnisse umbenennen Verzeichnisse löschen
197 198
5.3.4
Verzeichnisinhalte auflisten
198
Beispielapplikation »Gästebuch«
6 Fehlermeldungen und Debugging von ColdFusion-Templates 6.1
159
Fehlermeldungen 6.1.1 Einige Fehlermeldungen im Detail
200 211 211 212
7
Inhaltsverzeichnis
6.2
Debug-Einstellungen im CF-Administrator 6.2.1 Die Debug-Einstellungen im Einzelnen
214 215
6.2.2
216
Wer darf die Debug-Informationen sehen?
Teil 2: Techniken für Fortgeschrittene 7 Das Application Framework 7.1 7.2
7.3
8.2
221 223
7.2.1 7.2.2 7.2.3
Eine Anwendung definieren Application-Variablen Client-Management
223 224 227
7.2.4 7.2.5
Session-Variablen Client-Variablen
228 230
7.2.6
Server-Variablen
233
Der sinnvolle Aufbau einer Anwendungs-Initialisierung
8
234 241
eMail versenden 8.1.1 Administrator-Einstellungen zum Versenden von eMails
242
8.1.2 8.1.3 8.1.4 8.1.5
243 245 246 247
Dynamisch erzeugte eMails Query-Ergebnisse mit versenden Attachments versenden Weitere Möglichkeiten mit
241
8.1.6 eMails an mehrere Empfänger eMails empfangen
247 248
8.2.1
Abruf der Nachrichten-Header
249
8.2.2 8.2.3
Abruf der vollständigen eMail eMails mit Attachments abrufen
250 252
8.2.4
eMails auf dem Server löschen
253
8.2.5
Das Datum-Problem mit eMails
254
9 Custom Tags 9.1 9.2
221
Anwendungsweit geltende Einstellungen und Funktionen mit Hilfe der Application.cfm Der Aufbau einer Application.cfm
8 eMail mit ColdFusion 8.1
219
Was sind Custom Tags? Unterschiede zwischen Custom Tags und
257 257 258
Inhaltsverzeichnis
9.3 9.4
Warum Custom Tags? Aufruf von Custom Tags
258 259
9.5 9.6 9.7
Der richtige Ort für Custom Tags Ein einfaches Custom Tag Parameter an Custom Tags übergeben
259 260 261
9.7.1 9.7.2
261
9.8
Attribute Ein einfaches Beispiel für die Verwendung von Attributen Optionale und Pflichtattribute
261 262
9.9
Caller-Variablen
263
9.10 Custom Tags mit Tag-Paaren 9.11 Geschachtelte Custom Tags
266 268
9.12 Beispielapplikation
270
10 Fehlerbehandlung 10.1 Fehlerbehandlung mit
279 279
10.1.1 10.1.2
280 283
10.1.3 10.1.4
284 288
10.2 Fehlerbehandlung mit
289
10.2.1 -Variablen 10.2.2 Selbstdefinierte Exceptions mit 10.3 Beispielapplikation Error-Statistik
289 294 296
11 WDDX in ColdFusion
311
11.1 Einführung 11.2 WDDX Intern
311 314
11.3 WDDX in der Anwendung
316
11.4 Transport von ColdFusion-Variablen nach JavaScript 11.5 Transport von ColdFusion-Querysets nach JavaScript
322 328
11.6 Dynamische Select-Boxen mit WDDX
333
12 Ansprechen externer Objekte 12.1 COM 12.2 Benutzung von COM-Objekten
341 341 342
12.2.1
Erzeugung einer Objekt-Instanz mit
342
12.2.2
Ansprechen von Objekt-Methoden und Eigenschaften
344
9
Inhaltsverzeichnis
12.2.3 12.2.4
Bedeutung der ProgID Registrieren von COM-Objekten
346 347
Cachen von COM-Objekten Konfiguration der Javaeinstellungen
348 350 352
12.3.2 Klassenaufruf mit 12.3.3 Cachen von Klassen-Instanzen 12.4 Beispielapplikation: Mailserver-Überprüfung
353 356 359
12.2.5 12.3 Java 12.3.1
13 Anwendungsoptimierung 13.1 Nicht alles in ColdFusion realisieren, was möglich ist 13.2 Datenbankzugriff 13.2.1
Richtiges Datenbank-Design
363 364 364 365
13.2.2 SQL und SQL ist ein Unterschied 13.3 CFML ist nicht gleich CFML 13.4 Custom Tags vs.
366 367 372
13.5 Caching 13.5.1 Page Output Caching 13.5.2 Page Level Caching
372 373 373
13.6 Einstellungen im CF-Administrator
373
13.6.1 13.6.2
Limit Simultaneous Requests Enforce Strict Attribute Validation
373 374
13.7 Zusammenfassung
374
Teil 3: Praxislösungen
375
14 Praxislösungen
10
377
14.1 Zeitmessung von Programmabschnitten 14.2 Ermittlung aller Application-, Session- und Client-Variablen
377 378
14.3 Querysetausgabe mit wechselnden Farben
379
14.4 Mehrspaltige Queryset-Ausgabe 14.5 Setzen des Content Types/MIME-Types eines Dokumentes
381 384
14.6 Zählen eines Banneraufrufes
385
14.7 Eigene Funktionen definieren 14.8 Cachen eines Dokumentes verhindern
386 389
14.9 Erzeugen eines DSN zur Laufzeit für MS-Access mit ADO
391
Inhaltsverzeichnis
14.10 Erzeugung von Word-Dokumenten 14.11 Erzeugung von Excel-Dokumenten
394 399
14.12 Importieren von CSV-Dateien 14.13 Auslesen einer Exceltabelle 14.13.1 Auslesen mit ODBC
401 404 404
14.13.2 Auslesen mit ADO 14.14 Echo-Back-Formulare 14.15 WAP mit ColdFusion
405 407 411
14.16 Rekursion
413
14.16.1 Verzeichnisstruktur auslesen 14.16.2 Programmierung von Baumstrukturen in einer Datenbank
413 415
14.17 Einfügen von Ausgaben in den HTML-HEAD-Bereich
419
14.18 Uploaden und Speichern von Bildern 14.18.1 Speichern im Filesystem 14.18.2 Speichern in der Datenbank 14.19 Kontrollieren von upgeloadeten Dateien
421 422 425 431
14.20 Setzen von Cookies vor einem
433
14.21 Next-N Ausgabe eines Querysets 14.22 Tabellarische Ausgabe eines Querysets mit Spaltensortierfunktion
434 438
14.23 Rückgabe von Dateien mit Dateinamenangabe 14.24 Zählung der Online User einer Website 14.24.1 Zählung über Client-Variablen 14.24.2 Zählung über Application-Variablen
441 442 443 443
14.25 Parsen von XML-Dateien 14.26 Erzeugen von XML-Dateien
446 452
Teil 4: Sprachreferenz
463
A ColdFusion-Tagreferenz
465
B ColdFusion Funktionsreferenz
609
B.1
Datenfeldfunktionen
609
B.2 B.3 B.4
Authentifizierungsfunktionen Datums- und Uhrzeitfunktionen Entscheidungsfunktionen
615 619 634
11
Inhaltsverzeichnis
12
B.5 B.6
Anzeige- und Formatierungsfunktionen Dynamische Auswertungsfunktionen
639 653
B.7 B.8 B.9
Internationale Funktionen Listenfunktionen Mathematische Funktionen
657 663 671
B.10 Suchanfragefunktionen B.11 Strukturfunktionen B.12 Systemfunktionen
680 683 687
B.13 Weitere Funktionen
691
Literaturempfehlungen und Links
697
Stichwortverzeichnis
699
Vorwort Bis zur Version 3.1 führte Cold Fusion in Deutschland noch ein Nischendasein und war vielerorts als Spielzeug für Internet-»Freaks« verschrieen. Erst mit ColdFusion 4.0 gelang, einhergehend mit der Änderung der Schreibweise, auch in Deutschland der eigentliche Durchbruch für das Flagschiff der Allaire Corporation. Aus einem kleinen Kreis eingeschworener ColdFusion-Fans wurde allmählich eine ernstzunehmende Entwickler-Community, und mittlerweile setzen immer mehr Firmen ColdFusion für ihre Internet-Dienstleistungen oder ihr Intranet ein. Als Hemmnis für die Akzeptanz von ColdFusion wirkte sich allerdings das Nichtvorhandensein eines deutschsprachigen Sachbuches zu diesem Thema aus. Die englischen Bücher Ben Fortas, der nach wie vor als DER ColdFusionGuru schlechthin gilt, sind zwar sehr umfassend, aber wer sich durch die insgesamt ca. 1700 Seiten arbeiten will, der muss bei dem gegenwärtigen Dollarkurs zunächst einmal knapp DM 250,- berappen, eine Investition, die oft auch jene zurückschrecken lässt, die der englischen Sprache mächtig sind. Ganz zu schweigen von jenen, die nun einmal nicht fließend Englisch sprechen. Der Markt war reif für ein deutsches Buch über ColdFusion. Diese Tendenz wurde auch an der Entwicklung von cfml.de deutlich; die 1999 von Steffen Goldfuß als Hobbyprojekt gegründete Site wurde schnell zu einem Zentrum der deutschsprachigen ColdFusion-Szene. Steffen initiierte auch das Buchprojekt, da einige Themen bereits in Form von Artikeln, die wir geschrieben hatten, auf http://cfml.de vorlagen. Das soll jetzt nicht bedeuten, dass dieses Buch das Buch zur Site sein soll :-). Wir haben uns bemüht, ein Buch auf die Beine zu stellen, das möglichst umfassend alle wichtigen Themen behandelt, ohne dabei dem Drang nachzugeben, auch wirklich ALLES beschreiben zu wollen, was uns in die Gefahr gebracht hätte, unsere eigentliche Zielgruppe aus den Augen zu verlieren: Die zukünftigen und die schon aktiven ColdFusion-Entwickler. Die Entscheidung, welche Themen wir NICHT behandeln, ist uns nicht leicht gefallen... Bis zuletzt haben wir immer wieder mit der Versuchung gekämpft, doch noch dieses oder jenes hinzuzufügen. Eine große Hilfe bei der Entscheidung, welches Thema denn nun wichtig sei und welches nicht, war uns das Hilfe-Forum von cfml.de: Die meistgestellten Fragen mussten ganz einfach mit Hilfe unseres Buches zu beantworten sein. Und so kommt es, dass Sie einiges eben nicht in diesem Buch finden werden wie z.B.: 왘 Administration des ColdFusion Servers
Selbstverständlich behandeln wir die wichtigsten Punkte, damit Ihre ColdFusion-Installation auch funktioniert und Sie eine Datenbank einbin-
13
Vorwort
den können, doch dieses Buch wurde für Entwickler geschrieben und soll kein Administrationshandbuch sein. 왘 Advanced Security
Zwar ist Sicherheit für Web-Applikationen ein extrem wichtiger Aspekt, doch eine wirklich umfassende Behandlung dieses Themas würde fast schon ein eigenes Buch rechtfertigen (na gut... ein Büchlein). 왘 Regular Expressions
Dies war keine leichte Entscheidung. In letzter Zeit wurden immer häufiger Fragen diesbezüglich gestellt, doch schließlich und endlich sind Regular Expressions unter ColdFusion gar nicht so anders als in anderen Sprachen, und es gibt hervorragende Bücher zu diesem Thema. Das alleine deutet schon an, wie umfassend dieser Bereich sein kann. Die Liste ließe sich noch fortsetzen, aber Sie sollen hier ja kein »Verzeichnis der nicht vorhandenen Themen« vorfinden. Wir möchten dem Anfänger (auch demjenigen ganz ohne Programmierkenntnisse) das nötige Rüstzeug mitgeben, um erfolgreich mit ColdFusion WebApplikationen zu entwickeln, und der Fortgeschrittene soll Techniken, Hilfen und Tipps finden, die ihm das Entwicklerleben erleichtern und seine Anwendungen schneller und stabiler machen können. Wir hoffen, das ist uns einigermaßen gelungen. Schreibweisen Der besseren Unterscheidung wegen haben wir in unseren Listings alle HTML-Tags geschrieben, während alle CFML-Tags und Attribute in gehalten sind. Variablennamen, Pfadangaben oder auch wichtige Stichworte stehen kursiv gedruckt, und einige ganz wichtige Punkte sind fett kenntlich gemacht worden. Hinweis: An einigen Stellen finden Sie Text in grauen Kästen, die auf besonders wichtige oder kritische Punkte hinweisen sollen. Insgesamt sind wir mit diesem Stilmittel aber eher sparsam umgegangen. Die CD zum Buch Was wäre ein Buch über eine Software ohne die dazugehörige CD? Selbstverständlich liegt auch unserem Buch eine bei. Im Verzeichnis \software finden Sie alle Software die Sie benötigen, um Ihre eigenen Web-Applikationen zu entwickeln: Den ColdFusion Application Server für verschiedene Betriebssysteme, das ColdFusion Studio sowie den Apache Web Server. Dass wir keine anderen Webserver beigelegt haben, hat nicht nur mit Lizenzrechten zu tun sondern außerdem mit der Tatsache, dass unter Linux ohnehin fast nur der Apache Server zum Einsatz kommt, während unter Windows der Personal Web Server bzw. der Internet Information Server von Hause aus mitgeliefert werden.
14
Im Verzeichnis \buch finden Sie alle größeren Beispiellistings nach Kapiteln geordnet, und selbstverständlich fehlen auch die Praxislösungen nicht. Für alle Listings gilt: Sie dürfen sie ganz nach eigenen Wünschen anpassen oder verändern und sie auch weitergeben. Die Listings dürfen nicht verkauft werden, aber die gezeigten Techniken dürfen selbstverständlich auch für kommerzielle Zwecke eingesetzt werden. Wenn Sie ein Listing fast unverändert übernehmen, dann bitten wir Sie der Fairness halber, dies als Kommentar im Sourcecode zu erwähnen. Das Entwicklerleben nach dem Buch Internettechnologien entwickeln sich in einem atemberaubenden Tempo, und wenn Sie sich weiter mit diesen Themen beschäftigen wollen, werden Sie nie aufhören können, sich weiterzubilden. Im Internet finden Sie dazu sehr viele Informationsquellen. Ein guter Ansatzpunkt zum Thema ColdFusion und allen verwandten Gebieten kann http://cfml.de, sein oder auch die ColdFusion-Mailingliste der deutschen ColdFusion Usergroup (CFUG), zu finden unter http://cfug.de. Für komplexe Web-Applikationen sind auf jeden Fall gute SQL- und Datenbankkenntnisse vonnöten. Auch eine intensive Beschäftigung mit JavaScript und DHTML kann Ihnen weiterhelfen, vor allem bei Themen wie dem Design des Userinterfaces. Im Anhang finden Sie ein kleines aber (wie wir hoffen) feines Literaturverzeichnis mit entsprechenden Fachbüchern und Links. Eines dürfte jedoch klar sein: Bei der rasanten Geschwindigkeit, mit der sich das Internet und seine Möglichkeiten weiterentwickeln, muss man fast schon froh sein, wenn ein Buch noch halbwegs aktuell ist, wenn man vom Buchladen nach Hause kommt. Feedback Für Fragen Anregungen, Kritik, Meinungen und Kommentare zu diesem Buch werden wir in jedem Falle ein offenes Ohr haben. Steffen Goldfuß erreichen Sie per eMail unter
[email protected], Christoph Schmitz unter
[email protected]. Für eine eMail, die sich ausschließlich auf das Buch bezieht, können Sie auch an
[email protected] schreiben. Die obligatorischen Danksagungen... dürfen natürlich auch nicht fehlen. Auf Seiten des Verlages wären da die Lektoren Frau Hasselbach und Herr Pakendorf zu nennen, die sich stets geduldig und verständnisvoll zeigten, wenn es wieder einmal zu Verzögerungen kam, Herr Gerritsen, der Korrektor dieses Buches, hat uns sicherlich vor manchem sprachlichen Fauxpas bewahrt.
15
Vorwort
Regards to Ben Forta and thanks for letting us use some material from the »Tips and Tricks of the ColdFusion Masters« demonstration and to Chie Gens of Allaire Corporation for supplying us with evaluation software und language reference. Steffen Goldfuß Christoph Schmitz Regensburg/Lichtenau Persönliche Danksagungen von Christoph Schmitz
Special Thanks to Vanessa Wade (Allaire Headquarters Europe) for opening some doors and helping me in many ways. Dank auch an Peter Haak, der mehr bewirkt hat, als er glaubt. Ein ganz, ganz dickes Danke an meine Lebensgefährtin Angela Lennertz, die stets verständnisvoll war, wenn ich Abend für Abend »noch mal eben etwas am Buch schreiben« wollte, und die in stunden- und teilweise nächtelanger Arbeit Formatierungen und Korrekturen eingepflegt hat. Ohne ihre Hilfe würde ich wahrscheinlich immer noch an diesem Buch arbeiten. Und zu guter Letzt ein Dank auch an Microsoft: MS Word ist nicht nur die erste Anwendungssoftware, die auf einem ansonsten stabilen System mit schöner Regelmäßigkeit zu reproduzierbaren Blue Screens unter Windows NT geführt und allen Updates und Service Packs getrotzt hat (ich soll einen Dank meines Internet Access Providers für gestiegene Onlinezeiten während der Bucherstellung aufgrund von Downloads ausrichten), sondern es hat auch für einige unerwartete Erheiterungen gesorgt, wenn z.B. die Rechtschreibkorrektur wieder mal standhaft beteuerte, dass auch eine Internetsoftware ein Faible für schmackhaftes Essen hat. (Aus »Browserunabhängigkeit« wurde »Browserhuhnabhängigkeit«. Gibt es tatsächlich eine Sucht einer Internetsoftware nach Geflügelfleisch???)
16
Teil 1: Grundlagen 1. Einführung 2. Grundlagen 3. Formulare und Form-Variablen 4. Datenbankzugriff 5. Dateien und Verzeichnisse 6. Fehlermeldungen und Debugging von ColdFusion-Templates
1 1.1
Einführung Das World Wide Web – Grundlagen
Als 1989 das World Wide Web (kurz Web oder WWW genannt) am Hochenergieforschungszentrum der Europäischen Organisation für Kernforschung (CERN) bei Genf entstand, ahnte noch niemand, wie rasant es sich schon bald entwickeln würde. Doch wie rasant die Entwicklung uns auch scheinen mag, sie befindet sich noch immer in den Kinderschuhen. Die wirklich umwälzenden Entwicklungen stehen uns noch bevor. Tim Berners-Lee, damals als Wissenschaftler am oben genannten Forschungszentrum in Genf beschäftigt, entwickelte dort die Grundlagen des Webs. Zusammen mit einigen Kollegen startete er eine Initiative, um das Internet, dessen Anfänge bis in das Jahr 1973 zurück reichen, für eine neue Art von Informationsaustausch zwischen Wissenschaftlern zu nutzen. Es war sein Ziel, wissenschaftliche Dokumente online für alle zugänglich zu machen, und das über eine einfache Textformatierung mit der Möglichkeit der Grafikeinbindung. Entscheidend für die weitere Entwicklung war aber die Idee der Hypertextfunktionalität, bei der Dokumente Verweise auf andere Dokumente enthalten können, und zwar unabhängig davon, auf welchem Server diese denn gespeichert waren. Dafür entwickelte Berners-Lee die Bausteine des späteren World-Wide-Web, wie das Übertragungsprotokoll HTTP, die Dokumentenbeschreibungssprache HTML und das Konzept der URLs. HTTP (Hypertext-Transfer-Protokoll) ist die Sprache der sich Webserver und Browser bei der Kommunikation bedienen. Mittels HTTP fordert der Browser die Dokumente und zugehörigen Elemente wie z.B. Grafiken oder Applets an. HTML (Hypertext Markup Language) ist die betriebssystemunabhängige Beschreibungs- und Formatierungssprache für Dokumente im Web. Mit ihr werden Texte, Grafiken, Formularelemente und vieles mehr in die Webseiten integriert und angeordnet. URLs (Uniform Ressource Locator) sind eindeutige Adressen im Web, die auf einem standardisierten Mechanismus aufbauen, über den man im Web eindeutig mitteilen kann, welches Dokument von welchem Server man sehen möchte. Sie sind die Voraussetzung, um innerhalb von HTML-Seiten andere HTML-Seiten zu referenzieren.
19
1 Einführung
Alle drei Bausteine sind für die reibungslose Funktion des World-Wide-Webs verantwortlich: URLs für die Formulierung eindeutiger Adressen, HTTP für den reibungslosen Transport der Daten und HTML für das systemunabhängige Anzeigen der Dokumente. Erst das Zusammenspiel aller drei Komponenten ermöglicht Ihnen das allseits bekannte Surfen im WWW. Realisiert sind diese Grundelemente vor allem in zwei Softwarekomponenten: dem Webserver und dem Browser. Durch den Webserver werden die Webdokumente auf Anforderung (Request) an den Browser gesendet. Der Browser stellt die übermittelten Inhalte dann auf dem Bildschirm dar. Er ist die Schnittstelle zum Benutzer und handelt auf dessen Anweisung. Der Benutzer gibt die zu ladenden Dokumente vor, indem er direkt URLs eingibt oder auf Verweise in dargestellten Dokumenten klickt. Starke Verbreitung erlangten die Browser, nachdem ein junger Mann namens Marc Andresen einen WWW-Browser mit grafischer Benutzeroberfläche entwickelte, den Mosaic Browser. Andresen witterte den kommenden Boom frühzeitig und gründete schließlich gemeinsam mit Jim Clark 1994 die Firma Netscape, heute ein führender Hersteller von Web-Software.
1.1.1
Web-Dokumente und Webbrowser
Normalerweise liegen Webseiten als HTML-Dokumente vor, also als reine Textdateien, die mit HTML formatierte Informationen enthalten. HTML besteht aus einer Reihe von Formatierungsanweisungen, die Tags genannt werden. Die HTML-Tags beschreiben die logische und physische Struktur eines WebDokumentes wie z.B. Textformatierungen, Absätze, Formulare, Farben usw. Zu Erkennen sind Tags daran, dass sie von einem Kleiner- und einem GrößerZeichen umrahmt sind, wie z.B. . Der Browser muss als Minimalleistung dieses HTML interpretieren können. In der heutigen multimedialen Welt reicht das aber bei weitem nicht mehr aus, und so entwickelten sich die Browser mittlerweile Allroundtalenten. Sie kommen problemlos mit verschiedenen Grafikstandards wie GIF oder JPEG zurecht, können Sounds abspielen und Java-Applets oder ActiveX-Objekte ausführen. Webbrowser gibt es für die unterschiedlichsten Plattformen, die mit dem Internet verbunden sind. Weit verbreitet sind vor allem die Browser der Firmen Netscape und Microsoft auf den Windows-Plattformen. Zwischen beiden Firmen tobt schon seit langem der so genannte »Browserkrieg«, und Sie werden als Web-Entwickler bald die kleinen Unterschiede der verschiedenen Browser kennen (und hassen) lernen (falls Sie diese Erfahrungen nicht schon gemacht haben!).
20
Das World Wide Web – Grundlagen
1.1.2
Webserver
Den Webbrowsern stehen die Webserver gegenüber. Sie werden mit den Anfragen der Webbrowser konfrontiert und bilden demnach zentrale Verteilerstellen für die auf ihrem jeweiligen lokalen Medium gespeicherten Dokumente. Der Webserver ist ein ständig laufendes Programm, das ununterbrochen auf Anfragen eines Clients wartet. Empfängt nun der Webserver eine solche Anfrage über HTTP, sucht er auf seinem lokalen Speichermedium nach den passenden Dokumenten und liefert sie dem Browser. Dabei muss es sich nicht zwangsläufig um HTML-Seiten handeln, auch Elemente des Webdokumentes wie Java-Applets, Grafiken oder Audio-Dateien werden einzeln durch den Browser (= Client) angefordert und vom Webserver zurückgeliefert. Webserver müssen die angeforderten Dokumente nicht interpretieren. Sie müssen nichts von Grafikformaten, HTML oder Applets verstehen. Entscheidendes Kriterium eines Webservers ist es, in möglichst kurzer Zeit möglichst viele Anfragen von verschiedenen Clients beantworten zu können. Dabei kommt dem Webserver die statuslose Kommunikation im Web zugute. Hat der Benutzer sein angefordertes Dokument erhalten, ist die Arbeit für den Webserver für diese Verbindung getan. Er speichert keinerlei Informationen darüber und unterhält auch zu dem Browser keinen offenen Kommunikationskanal. Dieses Feature macht die Kommunikation mit dem HTTP-Protokoll so effektiv und leistungsfähig. Auch Webserver gibt es für die unterschiedlichsten Betriebssysteme. In der Mehrzahl sind es Unix und Linux-Systeme, aber auch Windows NT hat sich in letzter Zeit zu einer beliebten Serverplattform entwickelt. Weit verbreitete Webserver sind der Netscape Enterprise Server, Microsoft Internet Information Server oder auch der Apache Web Server. Letzterer wird vor allem auf UnixPlattformen eingesetzt.
Abbildung 1.1: Arbeitsweise eines Webservers
21
1 Einführung
1.1.3
URLs
Ein wichtiger Aspekt beim Zugriff des Browsers auf Dokumente über Webserver ist eine eindeutige Adressierung. Nur so kann man dem Webserver mitteilen, welche Webseite man sich ansehen will. Im Internet dient dazu der so genannte Uniform Ressource Locator (URL). Dieser Adressierungsmechanismus wird aber nicht nur zur Adressierung von Ressourcen im WWW benutzt. Auch andere Dienste und Einrichtungen im Internet wie FTP oder der eMail-Versand machen bei der Adressierung davon Gebrauch. Die komplette URL beginnt mit der Angabe des Protokolls für den Dienst, der benutzt werden soll, im WWW immer HTTP. Anschließend folgt der Servername mit Angabe des Ports und dem Pfad zum Dokument: http://servername.de:port/pfad/doku.htm?Parameterliste
Der Präfix http:// definiert die komplette URL als Verweis auf ein WebDokument, danach folgt der Domainname des Servers. An seine Stelle kann auch die IP-Adresse des Servers treten, die ja die eigentliche Adresse des Servers ist und aus vier Zahlengruppen zwischen 1 und 255 besteht, z.B. 192.168.100.1. Hinweis: IP-Adressen bzw. Adressbereiche sind offiziell registriert. Wenn Sie also selbst einen Server einrichten wollen (was wir im Folgenden auch tun werden), können Sie sich also nicht einfach eine beliebige Adresse ausdenken und dann verwenden! Die Port-Angabe findet man in URLs dagegen recht selten, da es normalerweise üblich ist, den Standardport (im WWW die 80) zu benutzen, wodurch die Portangabe entfallen kann. Stellt man aber den Webserver auf einen anderen Port ein, muss die korrekte Portnummer angegeben werden. Dem Port schließt sich die Pfadangabe und der Dateiname der Ressource an. Dabei müssen Pfad und Dateiname nicht immer auf ein wirkliches physikalisch vorhandenes Dokument auf der Festplatte des Webservers verweisen, stellen doch die heutigen Webserver vielfältige Möglichkeiten des Mappings bereit, mit dem vorhandene Dokumente beliebig auf virtuelle Pfadangaben abgebildet und zurückgeliefert werden können. Die Angabe des Dateinamens kann auch unterbleiben. Der Webserver greift dann auf eine zuvor definierte Defaultdatei zurück. In den meisten Fällen handelt es sich dabei um die Datei index.htm oder index.html. Den letzten Teil der URL bilden die durch das Fragezeichen eingeleiteten optionalen Parameter, mit denen Werte an das aufgerufene Dokument überge-
22
Web-Applikationen
ben werden können. Sie werden sich jetzt vielleicht fragen, was eine HTMLDatei mit Parametern machen soll. Nun, Parameter werden normalerweise auch nur ausführbaren Programmen oder Scripten übergeben: Wir werden uns im Verlauf dieses Buches noch ausführlich mit dieser Art der Parameterübergabe vertraut machen.
1.2
Web-Applikationen
Webseiten aus HTML eignen sich gut für die Präsentation von statischen Inhalten und Informationen. Nach Einsetzen des Internet-Booms dauerte es jedoch nicht lange, bis die Benutzer nach dynamischen Inhalten verlangten. Ständige Aktualisierung, Anbindung von professionellen Datenbanken oder Interaktion mit dem Benutzer sind heute die Anforderungen, die an Webseiten gestellt werden. Die Website soll nicht mehr nur reine Information zum Besucher transportieren, sondern als Gästebuch, Diskussionsforum, Einkaufsplatz usw. fungieren. Die Web-Applikation war geboren. Dahinter verbirgt sich die Bereitstellung eines Programms, das weitestgehend über den Webbrowser mit dem Benutzer interagiert. Dabei werden Eingaben vom Benutzer über den Webbrowser entgegengenommen, von einem Programm verarbeitet und die Ausgaben als zur Laufzeit generierte HTML-Seiten zum Browser zurückgeschickt. Das Ergebnis sieht also für den Browser (und Benutzer) so aus, als hätte er eine statische Webseite aufgerufen. Man spricht in diesem Fall von dynamischen Webseiten. Um dynamische Seiten zu erzeugen, kann man sich verschiedener Mechanismen bedienen.
1.2.1
Common Gateway Interface (CGI)
Eines der ersten und noch heute weit verbreiteten Instrumente, mit dem dynamische oder interaktive Webseiten erzeugt werden konnten, war das Common Gateway Interface Das Prinzip des CGI ist recht einfach. In der Konfiguration des Webservers wird festgelegt, dass die Dateien in einem bestimmten Unterverzeichnis (meist das Verzeichnis cgi-bin) nicht einfach nur gelesen und an den Browser weitergeleitet, sondern ausgeführt werden sollen. Diese Dateien sind Programme, die die Eingaben eines Browsers verarbeiten und eine Ausgabe zum Browser hin erzeugen. Hauptsächlich benutzt man dazu die Programmiersprache PERL, aber CGI-Programme können natürlich auch in anderen Programmiersprachen erstellt werden (z.B. C, Pascal usw.). Wird also die Datei http://www.meinwebserver.de/cgi-bin/suche.pl durch den Browser aufgerufen, erkennt der Webserver, dass suche.pl sich im cgi-bin befindet und führt es aus. Suche.pl (ein PERL-Script, daher die Endung .pl) erzeugt normalerweise eine Ausgabe an den Webserver, der diese wiederum als normales HTML-Dokument an den Browser weiterleitet.
23
1 Einführung
Abbildung 1.2: Funktionsweise eines CGI-Programms
CGI hat einen Nachteil, den man nicht übersehen sollte: Jedes CGI- Programm muss für jeden Vorgang gestartet und anschließend wieder beendet werden und benötigt Ressourcen. Bei einigen wenigen Seitenaufrufen pro Minute ist das nicht weiter tragisch, aber bei stark frequentierten Websites mit einigen Seitenaufrufen pro Sekunde führt das schnell zu Ressourcenmangel und damit zu Performanceproblemen.
1.2.2
Webserver-Erweiterungen
Webserver-Erweiterungen werden mittels eines API’s (Application Programming Interface) quasi in den Webserver hineinprogrammiert. Der große Vorteil: Die Programme laufen nicht mehr extern sondern innerhalb des Webserver-Prozesses und bei gleichzeitigen Zugriffen auch innerhalb einer Instanz. Also gibt es kein unablässiges Starten und Beenden der Programme mehr (der Webserver lädt die Programme nur beim ersten Aufruf), und viele gleichzeitige Zugriffe belegen nicht mehr Speicher als einige wenige. Der Nachteil: Jeder Webserver hat sein eigenes API; so hat Microsoft ISAPI entwickelt und Netscape setzt NSAPI ein. Eine Portierung von einem Webserver auf einen anderen ist deshalb fast unmöglich.
1.2.3
ASP (Active Server Pages)
Die Microsoft ASP stehen (selbstverständlich) nur auf Microsoft Webservern und damit unter Microsoft Betriebssystemen zur Verfügung. Technisch gesehen handelt es sich bei ASP um einen ISAPI-Filter (Internet Server Application Programming Interface), der das Ausführen von Scripten innerhalb der HTML-
24
Web-Applikationen
Seiten ermöglicht. Diese Scripte werden serverseitig ausgeführt und liefern als Ergebnis HTML-Code zurück, der wiederum vom Browser dargestellt werden kann. Theoretisch ist der Einsatz jeder Scriptsprache denkbar, in der Praxis sind jedoch nur VBScript und JScript (das Microsoft-Derivat von JavaScript) anzutreffen.
1.2.4
PHP (PHP Hypertext Preprocessor)
Auch PHP gehört in die Gruppe der Scriptsprachen, die serverseitig ausgeführt werden und HTML-Code generieren. Zwar ist ein Präprozessor etwas anderes als ein API, doch die Funktionsweise ist die gleiche. Prinzipiell handelt es sich auch hier um eine Webserver-Erweiterung, die das Ausführen von Scripten innerhalb des HTML-Dokumentes ermöglicht. PHP hat eine stetig wachsende Fan- und Entwicklergemeinde, und die Kombination LAMP (Linux – Apache Webserver – MySQL Datenbank – PHP) ist zu einer sehr beliebten Applikationsplattform geworden. Unter Windows ist PHP ebenfalls einsetzbar, PHP3 als eigenständiges Programm, PHP4 als ISAPI-Erweiterung. Mit PHP4 ist es möglich geworden, einzelne Module zu präkompilieren (in Maschinensprache zu übersetzen und abzuspeichern), was einen erheblichen Geschwindigkeitsvorteil mit sich bringt, da bei der Ausführung der zeitraubende Schritt des Interpretierens (die Übersetzung in einen für den Server verständlichen Code) entfällt.
1.2.5
ColdFusion
ColdFusion von der Firma Allaire gehört in die Familie der Application Server und geht damit noch einen Schritt weiter als die Webserver-Erweiterungen. Hier steht ein separater Server zur Verfügung, der sich ausschließlich mit der Programmlogik und der HTML-Erzeugung beschäftigt. Dies ermöglicht z.B. den Einsatz von eigenen Load Balancing- (Lastverteilung) oder Caching-Methoden (Zwischenspeicherung) und auch die so genannten Distributed Websites, also Websites, die über mehrere Server verteilt werden, sind damit realisierbar. Auch bei ColdFusion werden Scripte in die HTML-Seite integriert, meist in Form von CFML (ColdFusion Markup Language). CFML macht ebenso wie HTML Gebrauch von Tags und sieht auf den ersten Blick aus wie eine Art HTML-Erweiterung, ist aber eine komplette Programmiersprache. Der Ähnlichkeit zu HTML hat ColdFusion seine vielgerühmte »steile Lernkurve« zu verdanken (z.B. ist es schon mit nur zwei CFML-Tags möglich, Datenbanken abzufragen und die Ergebnisse darzustellen). Dieser Vorteil wird von erfahrenen Programmierern allerdings oft als Nachteil gesehen, denn die Syntax ist doch recht ungewohnt und unterscheidet sich von der anderer herkömmlicher Programmiersprachen.
25
1 Einführung
Eine Erweiterung von CFML ist CFScript, das auf den ersten Blick sehr große Ähnlichkeit mit JavaScript hat. Es macht insbesondere lange Code-Passagen übersichtlicher und ist zudem in fast allen Bereichen auch ca. 20% schneller als CFML. Eine Ausnahme für die Benchmark-Freunde unter Ihnen: In Schleifen (auch die Nicht-Programmierer unter Ihnen werden bald wissen, was das ist) ist CFScript langsamer als CFML. Die Einfachheit der Sprache und deren Ähnlichkeit mit HTML verhilft auch vielen Nicht-Programmierer schnell zu ersten Erfolgserlebnissen, die aber allzu oft in einer Sackgasse münden, wenn z.B. komplexere Anwendungen erstellt werden sollen. Oft wird der Unterschied zwischen clientseitigen Aktionen (HTML-Interpretierung, JavaScript) und serverseitigen Aktionen (CFML) ebenso oft vergessen, wie die Tatsache, dass man ohne grundlegende Programmierkenntnisse keine anspruchsvollen Programme schreiben kann. Zu den benötigten Grundlagen zählen in jedem Fall die folgenden: 왘 Grundkenntnisse relationaler Datenbanken 왘 Kenntnisse in SQL (Structured Query Language: Mit dieser Sprache wer-
den Datenbanken abgefragt bzw. manipuliert.) 왘 Grundlagen der Programmierlogik
Mehr dazu im Kapitel »Optimierung von Applikationen« Demjenigen, der sich diese Grundlagen aneignet, steht mit ColdFusion ein hervorragendes Instrument zur Verfügung, um Internet- und IntranetAnwendungen aller Größenordnungen zu erstellen. Der Ausdruck »aller Größenordnungen« ist jedoch mit Vorsicht zu genießen. Es macht sicherlich keinen Sinn, einen Application Server zu betreiben, wenn man lediglich ein kleines Gästebuch implementieren will. Allein die Tatsache, dass es sich um einen eigenständigen Server handelt, macht schon deutlich, dass es auf größere Applikationen ausgerichtet ist. Kritiker werden dem entgegenhalten, dass ColdFusion eindeutige Mängel aufweist, die gerade den Einsatz in großen Applikationen nachteilig beeinflussen. Wir wollen hier auch gar nicht den Eindruck erwecken, ColdFusion sei der Stein der Weisen, mit dem alles und jedes im Web in Nullkommanichts zu realisieren ist, jedoch hat ColdFusion auch einige starke Vorteile, die es für viele Web-Applikationen zum prädestinierten Instrument machen.
1.2.6
Vor- und Nachteile des ColdFusion Application Servers
Die folgende Aufstellung erhebt keinen Anspruch auf Vollständigkeit. Sicherlich wird der ein oder andere erfahrene ColdFusion-Entwickler oder -Administrator noch den ein oder anderen persönlichen Lieblings-Bug oder den Lieblingsvorteil hinzufügen wollen.
26
Web-Applikationen
Vorteile: 왘 einfache Installation 왘 nicht festgelegt auf einen bestimmten Webserver 왘 arbeitet mit jedem für das Betriebssystem vorhandenen ODBC- Treiber (auch
왘 왘
왘 왘 왘 왘 왘 왘
OLEDB oder systemeigene Treiber), dadurch – arbeitet es mit vielen verschiedenen Datenbanken Administration über Web-Interface steile Lernkurve durch einfach strukturierte Programmiersprache, dadurch auch – kurze Entwicklung von Web-Applikationen – schnelle »Time-To-Market-Zeitspanne« Erweiterbarkeit der Programmiersprache durch CustomTags in CFML oder z.B. C++ Load Balancing und Clustering von Servern Open Integration, Zugriff auf z.B. COM- und CORBA-Objekte Entwicklungsumgebung ColdFusion Studio kostenlose Single User Version wird mit ColdFusion Studio ausgeliefert kostenlose Version ColdFusion Express (eingeschränkter Funktionsumfang)
Nachteile: 왘 relativ hoher Preis 왘 Probleme mit Speichermanagement unter hoher Serverlast (vor allem 왘 왘 왘 왘
unter Sun Solaris und HP UX) »wackeliges« Sessionmanagement (siehe Kapitel 6: »Das Application Framework«) Es können keine Prozeduren definiert werden. »Whitespace« (leere Zeilen) werden mit ausgegeben. kein Kompilieren von CFM-Dateien, der Just-In-Time-Compiler wird u.U. zum Zeitfresser
1.2.7
Die Entwicklung von ColdFusion – die wichtigsten Eckpunkte
Februar 1995
J.J. Allaire beginnt mit der Entwicklung eines Tools zur Anbindung von Datenbanken an Websites.
Juli 1995
Das ColdFusion 1.0 Application Development Tool wird über die Allaire Website vertrieben. Die Allaire Corporation wird gegründet.
27
1 Einführung
November 1996
ColdFusion 2.0 wird veröffentlicht. Die Anwenderzahl überschreitet 10.000.
Februar 1997
Das Allaire Alliance Partner Program startet. Über 600 ISVs und Hosting-Providers werden Mitglieder.
Juli 1997
ColdFusion 3.0 wird veröffentlicht. Über 30.000 registrierte Entwickler.
November 1997
Allaire veröffentlicht ein komplettes Application Development System. Mit ColdFusion Studio und ColdFusion Server 3.1 für NT und Solaris.
März 1998
Allaire veröffentlicht französische und deutsche Versionen von ColdFusion.
November 1998
ColdFusion 4.0 wird veröffentlicht.
Januar 1999
Börsengang der Allaire Corporation
März 1999
Die französischen und die deutschen Versionen von ColdFusion 4.0 werden angekündigt.
Mai 1999
Allaire kündigt die erste weltweite Developer Conference an. Das Allaire Alliance Partner Programm wird ausgeweitet. Über 1.500 registrierte Partner.
Juni 1999
Allaire veröffentlicht ColdFusion für HP-UX. ColdFusion Express wird angekündigt.
Dezember 1999
ColdFusion 4.5 wird veröffentlicht
April 2000
ColdFusion 4.5.1 wird veröffentlicht.
1.2.8
Ausblick auf die Zukunft
Das Internet ist ein extrem schnelllebiges Medium und damit sind es auch notgedrungen die dort zum Einsatz kommenden Softwareprodukte. Ein Ausblick in die fernere Zukunft würde die Fähigkeiten eines Visionärs oder Hellsehers erfordern. Für die nahe Zukunft kann jedoch das ein oder andere schon mit Sicherheit gesagt werden. Auf lange Sicht soll ColdFusion zu einem Produkt hin erweitert werden, das mehr ist als »nur« ein Application Server, mehr können soll als »nur« CFMLTemplates zu verarbeiten. Allaire will einen Server schaffen, der eine Kombination der Produkte ColdFusion und JRun darstellt, mit dem also sowohl CFML-Templates als auch JavaServlets verarbeitet werden können. Dieser Server soll komplett Java-basiert sein und noch einige (bislang unveröffentlichte) Features enthalten. Dieses Entwicklungsprojekt läuft bei Allaire unter dem Namen Pharao. Der Weg dorthin ist jedoch noch weit, und Allaire plant vorher noch vollwertige Releases der nächsten Versionen von ColdFusion und JRun.
28
Die unterschiedlichen ColdFusion Versionen
Welche neuen Features ColdFusion 5 enthalten wird, ist derzeit noch nicht bekannt. Das einzige kleine Geheimnis, das Allaire bislang entlockt werden konnte, ist eine verbesserte Funktion zum Unterdrücken von unschönen Leerräumen im HTML Quellcode. Wahrscheinlich wird auch ColdFusion 5 schon Java-basiert sein, wodurch eine bessere Plattformunabhängigkeit erreicht wird. So schwierig oder gar unmöglich es ist, langfristige Aussagen über die Entwicklung von ColdFusion, der Application-Server-Technik im Allgemeinen und auch des Internets im Besonderen zu machen, so scheint doch eines sicher: Die Bedeutung des Internets (oder eines Nachfolgers davon) wird weiter zunehmen, und die Nachfrage nach interaktiven Applikationen wird im Laufe der Zeit nicht geringer werden.
1.3
Die unterschiedlichen ColdFusion Versionen
ColdFusion steht in vier Versionen zur Verfügung (von den Versionen für unterschiedliche Betriebssysteme einmal abgesehen.): ColdFusion Express Es handelt sich um eine frei verfügbare Version mit einigen Funktionseinschränkungen. Die wichtigsten davon sind: 왘 kein RDS Service 왘 keine Unterstützung für Cluster 왘 keine erweiterten Sicherheitsfeatures 왘 eingeschränkte Anzahl von unterstützten Datenbanken 왘 Techniken wie COM oder CORBA können nicht eingebunden werden 왘 fehlende Einbindung von z.B. E-Mail- oder FTP-Servern 왘 keine Custom Tags
ColdFusion Single User Server Diese Version wird mit ColdFusion Studio, der Entwicklungsumgebung für ColdFusion-Applikationen, ausgeliefert. Es handelt sich um eine voll funktionsfähige Version, die jedoch nur von einer bestimmten IP-Adresse aus (also von einem einzigen Client, im Normalfall der Rechner des Entwicklers) angesprochen werden kann.
29
1 Einführung
ColdFusion Professional Server Die »Grundversion« von ColdFusion. Im Vergleich zur Enterprise Version fehlen folgende Komponenten: 왘 einige Features für den Betrieb im Cluster 왘 systemeigene Treiber (so genannte »native Drivers«) 왘 Einbindung von CORBA 왘 die so genannte »Sandbox-Security«
ColdFusion Enterprise Server Diese Version verfügt über alle Features der anderen Versionen inklusive der dort fehlenden. Darüber hinaus unterscheiden sich die Versionen für die verschiedenen Betriebssysteme. Hier alles aufzulisten würde entschieden zu weit gehen, daher mag an dieser Stelle der Hinweis auf die entsprechende URL genügen: http://www.allaire.com/handlers/index.cfm?ID=13570
1.4
Was braucht man, um ColdFusion verwenden zu können?
Um ColdFusion installieren und einsetzen zu können, brauchen Sie zunächst einen entsprechend ausgestatteten Computer. Die Systemvoraussetzungen sind die folgenden: ColdFusion Server 4.5.1 Professional für Windows 왘 Windows 95/98, Windows NT 4.0 oder Windows 2000 왘 Intel Pentium oder besser 왘 64 MB RAM Minimum (128 MB empfohlen) 왘 50 MB freier Festplattenspeicher
ColdFusion Server 4.5.1 Professional für Linux 왘 Red Hat Linux 6.0 oder 6.1 왘 Intel Pentium oder besser 왘 128 MB RAM (256 MB empfohlen) 왘 100 MB freier Festplattenspeicher
Anmerkung: Allaire konzentriert sich auf die in den USA sehr verbreitete Red Hat Distribution. ColdFusion läuft aber auch mit anderen Distributionen, wie z.B. SuSE Linux ab Version 6.2!
30
Installation von ColdFusion
ColdFusion Express 4.5.1 für Windows 왘 Windows 95/98 oder Windows NT 4.0 왘 Intel Pentium oder besser 왘 64 MB RAM (128 MB empfohlen) 왘 50 MB freier Festplattenspeicher
Für die Betriebssysteme HP-UX und Sun Solaris sind derzeit nur die ColdFusion Enterprise-Versionen verfügbar: ColdFusion Server 4.5.1 Enterprise für Solaris 왘 SPARC Solaris 2.5.1, 2.6 oder 7 (Patch 103582-1B oder höher) 왘 512 MB RAM (1 GB empfohlen) 왘 200 MB freier Festplattenspeicher
ColdFusion Server 4.5.1 Enterprise für HP-UX 왘 HP-UX 11 왘 512 MB RAM (1 GB empfohlen) 왘 120 MB freier Festplattenspeicher
Die aktuellen Systemanforderungen für alle Versionen finden Sie im WWW unter http://www.allaire.com/products/coldFusion/generalInformation/SystemReqs/. Webserver-Software ColdFusion läuft mit fast allen gängigen Webservern, wie z.B. Microsoft Internet Information Server, Netscape Fast Track Webserver, O’Reilley Webserver, Apache Webserver. Die meisten Webserver werden während der Installation automatisch erkannt und entsprechend konfiguriert.
1.5
Installation von ColdFusion
1.5.1
Installation unter Linux
Voraussetzung: Ein installierter und funktionsfähiger Webserver. In diesem Beispiel verwenden wir den Apache Webserver. Falls Sie ColdFusion unter einem eigenen Account laufen lassen wollen (Default ist der Account nobody), dann müssen Sie diesen Account vor Beginn der Installation einrichten! Entpacken Sie die gepackte TAR-Datei mit tar -xvzf in ein temporäres Verzeichnis. merkur:/tmp/cf451 # tar -xvzf coldfusion-451-linux-pro-eval.tar.gz
31
1 Einführung
Es wird ein ColdFusion-Unterverzeichnis erstellt, in diesem Fall coldfusion451-linux-pro-eval, das alle benötigten Dateien enthält. Starten Sie (als root!) die Datei cfinstall: merkur:/tmp/cf451 # cd coldfusion-451-linux-pro-eval merkur: /tmp/cf451/coldfusion-451-linux-pro-eval # ./cfinstall
Der Installationsprozess fragt nun verschiedene Informationen ab. Der jeweilige Defaultwert wird in Klammern angezeigt. Wollen Sie diesen Defaultwert übernehmen, drücken Sie einfach ENTER. Bei der hier verwendeten Evaluierungs-Version wird die ursprünglich vorhandene Frage nach der Seriennummer ausgelassen und der Installationsprozess beginnt mit der Frage nach dem Installationsverzeichnis. Defaultwert ist hier /opt. In diesem Verzeichnis wird ein Unterverzeichnis coldfusion angelegt, das alle zum Betrieb von ColdFusion benötigten Dateien enthält. Enter the installation directory for ColdFusion [/opt]:
Anschließend erfolgt die Frage nach dem verwendeten Webserver. Apache und Netscape Server werden automatisch erkannt, andere Webserver müssen von Hand konfiguriert werden. What type of web server are you running (apache netscape other) [apache]: Automatically configure your Apache server [y]:
Anschließend wird nach dem Installationsverzeichnis und dem document root directory (das Stammverzeichnis für Dokumente) des Webservers gefragt. Das Installationsverzeichnis müssen Sie von Hand eingeben, die Vorgabe für das document root directory folgt dabei den für Apache üblichen Konventionen. Enter the Apache installation directory: /opt/apache In order to install the ColdFusion Administrator and the ColdFusion documentation, files must be copied in to the document directory (usually called the document root) of your web server. Enter your web server's document root directory [/opt/apache/htdocs]:
Die nächsten Punkte betreffen die Installation der Dokumentation und der Beispielapplikationen. ACHTUNG: Die Beispielapplikationen stellen ein Sicherheitsrisiko dar, da es u.U. möglich ist, von außen auf das Dateisystem des Servers zuzugreifen. Sie sollten die Beispielapplikationen deshalb nicht auf einem Produktiv-Server installieren. Der Installationsprozess weist auf dieses Risiko ausdrücklich hin! Um die Programmierung mit ColdFusion zu erlernen, sind die Beispiele allerdings sehr hilfreich, und da Sie Ihre Übungen nicht auf einem Produktivserver erstellen (das wäre jedenfalls EXTREM unvernünftig!), können Sie ruhig mit »y«(es) antworten
32
Installation von ColdFusion
Do It on Do
you want the ColdFusion is not recommended that a production server due you want the ColdFusion
documentation (HTML files) installed? [y]: the ColdFusion example applications be installed to potential security concerns. example applications installed? [n]:y
Als nächster Punkt stehen die Passworte für den ColdFusion Administrator und den ColdFusion Rapid Development Service (RDS) auf dem Programm. Der Administrator ist das Web-Interface zur Administration des Applikation Servers (einrichten von Datenquellen etc.). Mit dem RDS kann sehr komfortabel über ColdFusion Studio auf die ColdFusion Datenquellen zugegriffen werden. Nach Festlegen der Passwörter müssen Sie dem System nur noch mitteilen, unter welchem Account der ColdFusion Service laufen soll. Falls Sie ColdFusion einen eigenen Account geben wollen, muss dieser bereits eingerichtet sein. Noch ein Sicherheitshinweis für die weniger im Umgang mit Linux Erfahrenen: Lassen Sie ColdFusion niemals unter dem root-Account (Systemadministrator) laufen! It is not recommended the ColdFusion server run as root. Enter an existing login name [nobody]:
Bei der Enterprise-Version folgt jetzt noch die Frage nach ClusterCATS, dem Administrationstool für eine Cluster-Installation: Do you want to install ClusterCATS for ColdFusion [y]: Ready to begin the installation. Press ENTER to continue..
Der Installationsprozess kopiert nun alle erforderlichen Dateien in das Zielverzeichnis und versucht, den Application Server zu starten. Sollten Sie die Unterstützung für ClusterCATS installieren (Enterprise-Version), so müssen Sie im weiteren Verlauf der Installation noch einige Fragen beantworten, und zwar zunächst die Frage nach dem Ort des Webservers, also des www-Dämons (die Datei http) und des Apache KonfigurationsScriptes (httpd.conf). Die weiteren Fragen betreffen die Punkte, die ClusterCATS überwachen soll: Sollen alle Cluster-Mitglieder überwacht werden und soll der Apache Server überwacht werden? Where is the Apache server (httpd) [No Default]: /opt/apache/bin/httpd Where is the Apache config file (httpd.conf) [/opt/apache/conf]: Monitor all cluster members for failures: [yes]? Monitor the Apache server process (httpd) for failures: [yes]? Ready to complete installation. Do you want to continue]: [yes]?
Nach Abschluss der Installation sollten Sie den ColdFusion-Administrator mit folgender URL aufrufen können: http://localhost/cfide/administrator/index.cfm
33
1 Einführung
1.5.2
Installation unter Windows
Voraussetzung ist auch hier ein installierter und funktionsfähiger Webserver. In unserer Beispielinstallation verwenden wir wieder den Apache Server. Wechseln Sie in das Verzeichnis der Serverversion, die Sie installieren möchten, und starten Sie die Datei setup.exe. Es folgt der übliche Hinweis, möglichst alle anderen Programme zu beenden, die Anzeige der Lizenzvereinbarung, und anschließend erscheint das Fenster mit der Aufforderung zur Eingabe Ihrer Registrierungsdaten mit Name, Firma und Seriennummer. Im nächsten Schritt müssen Sie das Installationsverzeichnis angeben. Defaultwert ist C:\ CFUSION (Abbildung 1.3).
Abbildung 1.3: Zielverzeichnis der Installation
Anschließend überprüft das Installationsprogramm, welchen Webserver Sie benutzen. Netscape und Microsoft Webserver werden wieder automatisch erkannt und konfiguriert, beim Apache Server ist das unter Windows leider noch nicht der Fall. Es erscheint also die Auswahlmöglichkeit OTHER SERVER (Anderer Server) (Abbildung 1.4). Nach einem Klick auf WEITER fragt das Installationsprogramm noch einmal nach, ob Sie wirklich einen Webserver verwenden wollen, der nicht automatisch konfiguriert werden kann. Falls Sie den Apache Server einsetzen, antworten Sie mit JA (Abbildung 1.5).
34
Installation von ColdFusion
Abbildung 1.4: Auswahl des verwendeten Webservers
Abbildung 1.5: Abfrage »Wollen Sie den Webserver von Hand konfigurieren?« Für Apache Web Server unbedingt mit Ja antworten!
Im nächsten Schritt müssen Sie das document root directory (Stammverzeichnis für Dokumente) angeben (Abbildung 1.6).
Abbildung 1.6: Angabe des document root directory
Wählen Sie nun aus, welche Optionen Sie installieren möchten. Zur Auswahl stehen (Abbildung 1.7) die folgenden: 왘 ColdFusion Programmdateien (ohne die geht es nicht) 왘 Dokumentation
35
1 Einführung
왘 Beispiele 왘 das CFXAPI Tag Development Kit (für die Entwicklung von CFX Custom
Tags) 왘 Erweiterte Sicherheit (bei der Enterprise Version unter Windows NT)
Abbildung 1.7: Installationsoptionen
Stopp: Im Gegensatz zur Linux-Version fehlt hier der Sicherheitshinweis bezüglich der Beispiele. Es sei also nochmals darauf hingewiesen: Die mitgelieferten Beispiele stellen ein gewisses Sicherheitsrisiko für Ihren Server dar, da sie u.U. den Zugriff auf das Dateisystem ermöglichen. Sie sollten auf einem Produktivserver nicht installiert werden! Die nächsten Schritte sind die Eingabe des Passwortes für den ColdFusion Administrator und den ColdFusion Rapid Development Service (RDS) (Abbildung 1.8). Abschließend folgt die Auswahl des Ordners für das Startmenü und eine Zusammenfassung der angegebenen Optionen. Falls Sie die Enterprise Version mit der Erweiterten Sicherheit installieren, weist das Installationsprogramm nach dem Installationsvorgang darauf hin, dass das Microsoft Active Directory Services Interface (ADSI) 2.0 installiert werden muss, um dieses Feature nutzen zu können, und startet dessen Installation (Abbildung 1.9).
36
Installation von ColdFusion
Abbildung 1.8: Eingabe des Passwortes für den ColdFusion Administrator
Abbildung 1.9: Installation des ADSI
Die ADSI-Installation läuft automatisch und erfordert keine weiteren Angaben. Nach Beendigung dieser Installation werden Sie aufgefordert, Ihren Computer neu zu starten. Zuvor sollten Sie aber noch Ihren Apache Server konfigurieren. Kopieren Sie hierzu die Datei ApacheModuleColdFusion.dll (auf der Buch-CD im Verzeichnis Software\ColdFusion\Module) in das Unterverzeichnis modules Ihres Apache Servers. Öffnen Sie nun die Datei httpd.conf (im Apache Unterverzeichnis conf), und suchen Sie den LoadModules-Abschnitt. Fügen Sie dort die Zeile LoadModule coldfusion_module modules/ApacheModuleColdFusion.dll
Ein, und speichern Sie die Datei. Zu guter Letzt sollten Sie nun Ihren Rechner neu starten.
37
1 Einführung
Nach dem Neustart wird automatisch ein Browserfenster geöffnet und die Startseite der Dokumentation aufgerufen (Abbildung 1.10). Insofern Sie die Beispiele installiert haben, können Sie auf TEST YOUR INSTALLATION klicken. Auf der folgenden Seite klicken Sie bitte auf VERIFY QUERY (Abbildung 1.11). Erscheint eine Listenausgabe der verfügbaren Kurse (Abbildung 1.12), ist Ihre Installation erfolgreich verlaufen (diese Query benötigt die Datenquellen aus den ColdFusion-Beispielen; sind die Beispiele nicht installiert, kann auch dieser Test nicht funktionieren!).
Abbildung 1.10: Startseite der Dokumentation
Um weitere Einstellungen vorzunehmen, rufen Sie den ColdFusion Administrator mit der URL http://localhost/cfide/administrator/index.cfm
auf.
38
Installation von ColdFusion
Abbildung 1.11: Installationstest
Abbildung 1.12: Ergebnis des Installationstests
39
2 2.1
Grundlagen Templates
In diesem (und in auch in anderen Büchern, die sich mit Application Servern beschäftigen) ist immer wieder die Rede von so genannten Templates. Wörtlich übersetzt heißt das »Schablone«. Wieso ist da dauernd von »Schablonen« die Rede und wozu brauchen wir die, wenn wir doch dynamische Webseiten oder ganze Web-Applikationen erstellen wollen? Was hat man sich unter einem »Template« vorzustellen? Die Antwort ist ganz einfach: Ein Template enthält über die herkömmlichen HTML-Tags hinaus, die ja für den Aufbau einer Webseite verwendet werden, auch Befehle und Ausdrücke, die der Application Server versteht und interpretieren bzw. ausführen kann. ColdFusion bedient sich dabei der Sprache CFML, der ColdFusion Markup Language. Die Ähnlichkeit mit HTML drückt sich nicht nur im Namen aus, sondern zeigt sich auch in der ganzen Syntax. In CFML werden genau wie in HTML Tags bzw. Tag-Paare aus einleitenden und abschließenden Tags verwendet. Das Ganze ist bei weitem nicht so kompliziert, wie es sich anhört. Dazu das übliche »Hello World«-Beispiel: Hello World! #text# Listing 2.1: .cfm: »Hello World« – Beispiel
In HTML kennzeichnet das Tag den Beginn einer großen Überschrift und deren Ende. Genauso verhält es sich zum Beispiel mit , das den Beginn einer Ausgabe markiert und mit dieselbe beendet.
41
2 Grundlagen
Mit wird er beendet. Mit #text# wird der Inhalt der Variablen text ausgegeben. Und schon haben Sie Ihre erste Seite mit CFML programmiert. Speichern Sie diese Seite in einem Verzeichnis unterhalb des document root directory Ihres Webservers. Sie können dazu einen beliebigen Namen verwenden, wichtig ist nur die Dateiendung .cfm. Rufen Sie nun die Seite in Ihrem Browser auf. Achten Sie darauf, dass Sie auch wirklich eine Seite aufrufen, die von Ihrem Webserver zurückgegeben wird. Der URL muss also beginnen mit http://127.0.0.1 oder http://localhost oder mit etwas Vergleichbarem, und nicht etwa mit einem Laufwerksbuchstaben! Der Unterschied zwischen HTML und CFML liegt in dem, was sie bewirken. HTML beschreibt, wie Elemente der Seite dargestellt oder formatiert werden (auch wenn das strenggenommen nicht ganz richtig ist), während CFML spezifische Operationen definiert, die vom ColdFusion Server ausgeführt werden. Rein äußerlich unterscheiden sich ColdFusion-Templates von herkömmlichen Webseiten durch die Dateinamen-Erweiterung. Anstatt seite.htm oder seite.html heißt ein entsprechendes ColdFusion-Template seite.cfm. Die Ähnlichkeit mit einer Schablone liegt darin begründet, dass ein Template bei verschiedenen Aufrufen ganz unterschiedliche Ergebnisse hervorbringen kann, obwohl es selbst nicht verändert wurde. In Templates werden z.B. typischerweise Platzhalter (Variablen) verwendet, die bei jeder Ausführung einen anderen Wert enthalten können. Und so wie die Verwendung z.B. einer Zeichenschablone zu einer anderen Zeichnung führt, wenn wir einen andersfarbigen Stift verwenden, so kann ein und dasselbe Template andere Ergebnisse zeigen, abhängig vom Inhalt der verwendeten Variablen. Zur Veranschaulichung auch dazu wieder ein Beispiel (diesmal ohne Programmcode): In einem Template wird die Variablen vorname verwendet und der Inhalt dieser Variablen ausgegeben. Beim ersten Aufruf des Templates erhält vorname durch CFML-Code den Inhalt Peter, und der User sieht in seinem Browser auch nur die Ausgabe Peter. Beim zweiten Aufruf erhält vorname durch den gleichen CFML-Code den Inhalt Gisela (wir werden später sehen, wie man so etwas bewerkstelligen kann). Bei diesem Aufruf sieht der User also auch nur die Ausgabe Gisela. Ohne das Template inhaltlich zu verändern, wurden bei zwei Aufrufen zwei unterschiedliche Ergebnisse hervorgebracht. Die Ähnlichkeit mit einer Schablone ist offensichtlich.
42
Variablen
2.2
Variablen
Dieses Kapitel erläutert Ihnen das Konzept der Variablen in ColdFusion. Variablen sind grundlegender Bestandteil einer jeden Programmiersprache. Dabei steht eine Variablen für einen Wert in einem Programm, der jederzeit änderbar ist. Die Variable ist damit sozusagen ein Behälter für einen Wert. Über den Namen der Variablen lässt sich dieser Wert mit dem Programmcode auslesen und beschreiben. Das Programm kann dadurch die aktuellen Daten speichern ( Speichern bedeutet hier: Im Arbeitsspeicher des Servers speichern, nicht auf der Festplatte).
2.2.1
Einfache Variablen
Der Umgang mit Variablen gestaltet sich in ColdFusion recht einfach. Um eine Variablen zu erzeugen, muss ihr lediglich ein Wert zugewiesen werden. Danach ist sie als lokale Variable im gesamten restlichen Template sichtbar. Lokal bedeutet, dass die am Anfang erzeugte Variable ab dem Zeitpunkt ihrer Erzeugung für alle weiteren Programmzeilen existent ist, nicht aber in anderen Templates, auch wenn sie direkt nach der aktuellen Seite aufgerufen werden sollten. Zur Erzeugung einer Variablen wird dieser mittels eines -Tags ein Wert zugewiesen:
Auf myVar kann jetzt im gesamten restlichen Template zugegriffen werden, nicht aber von der nächsten Seite aus. myVar steht im Programm dann stellvertretend für den String hallo. Sie können den Wert aber jederzeit durch die Zuweisung eines neuen Wertes überschreiben.
Der Wert kann also variieren, und manch einem wird jetzt vielleicht klar werden, woher die Variable ihren Namen haben. Variablen in ColdFusion müssen nicht vor dem Gebrauch deklariert (deklarieren = den Typ einer Variablen festlegen; in vielen Programmiersprachen erforderlich) werden. Natürlich erzeugt das Lesen einer Variablen, der vorher kein Wert zugewiesen wurde, eine Fehlermeldung. Der Variablenname kann weitgehend frei gewählt werden. Man muss dabei paar Regeln beachten. Der Name muss mit einem Buchstaben beginnen und darf Buchstaben, Ziffern und den Unterstrich ( _ ) enthalten, der jedoch nicht als erstes Zeichen stehen darf.
43
2 Grundlagen
Gültige Variablennamen sind: 왘 otto 왘 counter1 왘 der_counter 왘 var12 왘 auto_23
Ungültige Variablennamen sind z.B.: 왘 _counter (beginnt mit einem Unterstrich) 왘 12wert (beginnt mit einer Zahl) 왘 aber-hallo (enthält ein ungültiges Zeichen »-«) 왘 wert_in_% (enthält ebenfalls ein ungültiges Zeichen »%«)
Um die Lesbarkeit Ihres Programmcodes zu erhöhen und eine späterer Pflege und Weiterentwicklung zu erleichtern, sollten Sie sich angewöhnen, eindeutige und selbstbeschreibende Variablennamen zu verwenden. Eine Variablen mit Namen pn ist vielleicht schneller geschrieben als eine deutlichere Bezeichnung wie z.B. person_name, aber letztere ist besser zu lesen und später auch einfacher zu verstehen, denn wenn Sie selbst schon nach einigen Tagen nicht mehr wissen sollten, was sich dahinter verbirgt, wie soll es dann erst anderen ergehen? ColdFusion unterscheidet nicht zwischen Groß- und Kleinschreibung. MyVar, myvar und myVAR bezeichnen also dieselbe Variable. Trotzdem ist es guter Programmierstil, eine einmal gewählte Schreibweise eines Variablennamens im gesamten Programm konsequent weiter zu benutzen. Im Gegensatz zu vielen anderen Programmiersprachen sind ColdFusionVariablen typenlose Variablen, d.h., man muss nicht definieren, ob die Variable z.B. einen String (= eine Zeichenfolge, z.B. »Hallo«) oder einen Integerwert (ein ganzzahliger Wert, z.B. 1, 5, 1027 etc.) aufnehmen soll. Man weist einfach den entsprechenden Wert zu, ganz gleich, welcher Typ vorher in der Variablen gespeichert war. ColdFusion versucht immer, den Wert der Variablen dem aktuellen Kontext entsprechend zu konvertieren. Das folgende Beispiel erzeugt eine Variable mit dem Namen a, der ein Integerwert zugewiesen wird.
a enthält jetzt den Wert 1. Jetzt weisen wir der gleichen Variablen einen String zu, der alte Integerwert wird dadurch überschrieben:
a enthält jetzt einen String-Wert.
44
Variablen
ColdFusion stört sich also nicht daran, dass a zuerst einen Integer enthält und dann einen String aufnehmen soll. Man kann den Wert 1 auch in der Form:
speichern und dann a trotzdem als Zahlenvariable benutzen, denn ColdFusion versucht immer den Variablenwert im passenden Kontext auszuwerten. So ist folgender Code durchaus gültig:
a enthält jetzt den Wert 4, da ColdFusion in der zweiten Zeile den Inhalt von a als Integerzahl erkennt und die 3 addiert. (Tatsächlich wird von Allaire empfohlen, alle Variablenzuweisungen in doppelte Anführungszeichen zu setzen, auch bei Zahlen.) Folgende Zeilen würden aber zu einem Fehler führen:
ColdFusion kann im zweiten -Befehl den Inhalt von a nicht in einen Zahlenwert umwandeln und meldet einen Konvertierungsfehler. Im Gegensatz dazu wird in einem Stringkontext ein Zahlenwert in einen String konvertiert:
Diese Zeilen haben zum Ergebnis, dass a nun den String hallo1 enthält. (Mit dem &-Operator kann man also Strings zusammenfügen, doch dazu später mehr.) String-Literale (Zeichenfolgen) werden von einfachen oder doppelten Anführungszeichen (Hochkommata) eingerahmt. Soll der String selbst ein doppeltes Anführungszeichen enthalten, muss das Zeichen doppelt angegeben werden. Dieses Vorgehen nennt man, abgeleitet von dem englischen Fachbegriff, escapen. (to escape=fliehen; das Zeichen »flieht« aus dem Zusammenhang und wird in seiner ursprünglichen Form dargestellt. Dieses Vorgehen ist z.B. bei der Ausgabe von Anführungszeichen und dem Nummernzeichen, also dem Doppelkreuz: »#« notwendig.) Die folgende Zeile erzeugt eine Stringvariable, die ein doppeltes Anführungszeichen enthält:
Der Inhalt der Variablen abc ist dann folgender: hier steht ein doppeltes » im Text Die beschriebenen Variablen waren alle lokale Variablen. Sie sind also nur in dem Template gültig, in dem sie erzeugt wurden.
45
2 Grundlagen
Es gibt in ColdFusion noch eine Menge anderer Variablen, die durch Angabe eines Präfixes definiert und erzeugt werden. Ein Präfix ist eine dem Variablennamen vorangestellte Angabe des Geltungsbereiches, des sogenannten Scope. Wenn kein Präfix angegeben ist, sind die mit erstellten Variablen immer lokale Variablen. Einige Variablenarten werden von ColdFusion automatisch ausgewertet. So kann bei URL- (siehe Abschnitt 2.2.4 »URL-Parameter«) oder FORM-Variablen (siehe Kapitel 3: »Formulare und Form-Variablen«) das Präfix weggelassen werden, ohne dass die Funktionalität beeinträchtigt würde. Um allerdings die Lesbarkeit Ihres Codes (für sich und andere) zu erhöhen, sollten Sie sich möglichst bald angewöhnen, Präfixe auch da zu verwenden, wo es nicht unbedingt notwendig ist. Der angenehme Nebeneffekt dieser Präfixe ist die Tatsache, dass sie die Ausführung des Codes etwas beschleunigen. Deshalb sollten Sie auch bei lokalen Variablen immer das Präfix variables. verwenden. Unser »Hallo Welt«-Beispiel würde demzufolge so aussehen: Hello World! #variables.text# Listing 2.2: »Hello Wold« -Beispiel mit korrekten Präfixes
Hinweis: An dieser Stelle müssen wir allerdings eine Entschuldigung anbringen: Die in unserem Buch aufgeführten Listings enthalten das Präfix variables. durchweg NICHT. Einige Programmzeilen wurden dadurch sehr lang und wurden mehrfach umgebrochen, da in einem Buch nur ein begrenzter Platz zur Verfügung steht. Das ist (zumindest für Einsteiger) sehr verwirrend, und aus diesem Grunde haben wir uns entschlossen, der besseren Übersicht wegen auf das Präfix zu verzichten. Mehr zu Präfixen, Scopes und includierten (eingeschlossenen) Seiten später.
46
Variablen
Natürlich bietet ColdFusion auch die den Programmierern unter Ihnen sicherlich bekannten Arrays und Strukturen zur Datenspeicherung an. Auf diese komplexeren Typen von Variablen kommen wir im weiteren Verlauf des Buches ausführlich zurück. Das Verständnis dieser komplexen Variablen setzt etwas Erfahrung im Umgang mit ColdFusion voraus.
2.2.2
Ausgabe von Variablen
Sicher werden Sie irgendwann einmal den Inhalt einer Variablen auf einer Seite anzeigen wollen, und das ist auch ohne weiteres möglich. Um den Inhalt von Variablen auszugeben, müssen diese innerhalb von -Tags angegeben und von Nummernzeichen (#) eingeschlossen sein.
ColdFusion erkennt an diesen Nummernzeichen, dass es den eingeschlossenen String als Variable oder Ausdruck betrachten soll, und nicht etwa den Variablennamen des Strings. die Variable MyVar enthält: #MyVAr#
Das Ergebnis dieser Zeilen ist diese Ausgabe: die Variable MyVar enthält: ich bin drin
Da aber ColdFusion nicht innerhalb einer normalen Programmoberfläche oder Shell läuft, ist diese Ausgabe auch nicht in einem Shell- oder PopupFenster zu sehen. Die Ausgabe wird direkt in den HTML-Code der bearbeiteten Seite geschrieben. Demnach ist das Ergebnis im Browser sichtbar, sobald er die fertige Seite vom Webserver erhält. Mit dem Nummernzeichen ist aber viel mehr möglich. Von Nummernzeichen eingeschlossene Strings werden von ColdFusion als Ausdrücke interpretiert und direkt evaluiert (ausgewertet). Dieser String kann z.B. ein Variablenname sein. Auch direkte Funktionsaufrufe sind möglich. Der Ausdruck wird dabei durch das Ergebnis der Funktion ersetzt. Die folgende Programmzeile gibt direkt die Länge (=die Anzahl der Zeichen) des Variableninhalts von a aus: #Len(a)#
Len() ist eine ColdFusion-Funktion, die die Länge eines Strings berechnet. Auch bei der Zuweisung von Strings kann man mit dem Nummernzeichen Bereiche definieren, die vorher ausgewertet werden. Das nächste Beispiel soll das etwas erläutern. Der Code…
47
2 Grundlagen
#b#
liefert als Ausgabe: a enthält: foo
Der Variablen b wird hier ein String zugewiesen, der selbst wiederum einen Variablennamen enthält. Da dieser von zwei Nummernzeichen umrahmt wird, wertet ColdFusion zuerst den Wert des Ausdrucks #a# aus und ersetzt den ganzen Ausdruck dann durch dessen Inhalt. Wie Sie sehen, wird bei einer Variablenzuweisung automatisch der von Nummernzeichen umschlossene Ausdruck ausgewertet, es ist hier nicht nötig, die Zuweisung innerhalb eines -Bereiches durchzuführen. Werden in Funktionen Variablen als Parameter übergeben, kann das Doppelkreuz entfallen:
Innerhalb von -Tags müssen die Variablen aber immer von Nummernzeichen eingeschlossen sein! Um ein Nummernzeichen einer Variablen direkt als Zeichen zuzuweisen oder in einem Text auszugeben, muss man ColdFusion über doppelte Angabe mitteilen, es nicht als Ausdrucksbeginn zu interpretieren (»escapen«):
füllt myVar mit 123#456. foo
erzeugt den HTML-Code foo
2.2.3
Existenz und Defaultwerte von Variablen
Wird in einem Template auf eine Variable zugegriffen, die noch nicht erzeugt wurde, entstehen unschöne Fehlermeldungen. Hier stellt ColdFusion Funktionen bereit, die dies vermeiden helfen. Entweder prüft man vorher, ob eine Variable bereits existiert, oder man gibt Defaultwerte für die betreffende Variablen vor.
48
Variablen
Man bedient sich dabei der beiden Funktionen ParameterExists() und IsDefined(). ParameterExists() prüft, ob die Variable vorhanden ist, und gibt entsprechend dem Ergebnis Yes oder No zurück.
Im Beispiel wird geprüft, ob myVar vorhanden ist und im Erfolgsfall erhält a den Inhalt von myVar zugewiesen. Ist myVar nicht vorhanden, wird a ein Defaultwert zugewiesen. Zwar gibt es die ParameterExists()-Funktion auch in ColdFusion 4.5 noch, allerdings nur noch aus Gründen der Abwärtskompatibilität. So müssen Programmierer, die von einer älteren ColdFusion-Version auf 4.x umsteigen, ihre Programme nicht umschreiben. Offiziell wurde sie von der IsDefined()-Funktion abgelöst, die ein wenig mehr Komfort bietet. Man kann nicht nur einen Variablennamen prüfen lassen, sondern auch einen Ausdruck (der Ausdruck muss als Auswertungsergebnis einen Variablennamen ergeben). Dieser Ausdruck muss in doppelten Anführungszeichen eingeschlossen sein. IsDefined() gibt ebenfalls TRUE oder FALSE zurück (YES/NO): a0 gibt es!
Das Beispiel übergibt einen Ausdruck (a#nr#) an die Funktion IsDefined(), die den Ausdruck auswertet und das Ergebnis als Variablennamen interpretiert. Bei der Auswertung wird #nr# durch den Inhalt der Variablen nr ersetzt und dadurch ein neuer Variablenname gebildet, hier a0. Dann wird diese Variablen auf Existenz hin geprüft und das Ergebnis dieses Tests zurückgeliefert. Probieren Sie doch das Beispiel einfach einmal aus und ändern den Wert von nr. Sie werden sicher einzuwenden haben, dass man in einem Template doch selbst weiß, ob eine Variable schon erzeugt wurde oder nicht, und in Verbindung mit einfachen Variablen haben Sie sogar Recht. Benutzt man aber Variablen anderer Gültigkeitsbereiche wie z.B. FORM-, oder URL-Variablen (Werte die aus HTML-Formularen stammen oder per URL-Parameter übergeben werden), ist es äußerst wichtig, sich diese Techniken zu Nutze zu machen, wie Sie später noch genau sehen werden.
49
2 Grundlagen
Man sollte sich z.B. nie darauf verlassen, dass URL-Parameter immer vorhanden sind. Es gibt immer wieder User, die hin und wieder die Parameter einer URL verändern, um zu sehen was passiert. IsDefined() gibt Ihnen also die Chance, auf das Fehlen von Variablen zu reagieren (z.B. für eigene Fehlermeldungen oder für Umleitungen auf entsprechenden Seiten). Es besteht aber auch die komfortable Möglichkeit, Variablen bei Nichtvorhandensein automatisch mit einem Defaultwert zu initialisieren. Zu diesem Zweck gibt es das -Tag, mit dem Sie einen Defaultwert für eine Variable festlegen können. Dieser wird dann der Variablen zugewiesen, falls nicht schon ein anderer Wert für sie existiert.
Diese Codezeile erzeugt die Variable myVar mit dem Default-Wert 1, falls sie nicht bereits vorhanden ist. Ist die Variable schon vorhanden, ist ohne Wirkung!
Das ist hier wirkungslos, die Variable enthält weiterhin den Wert 5. ist vor allem bei Form- und URL-Parametern zu empfehlen, wenn
Sie nicht die bereits erwähnten Methoden zur Fehlervermeidung benutzen wollen. Sie können das Tag aber auch mit jeder anderen Variablenart von ColdFusion benutzen. Es eröffnet sich die Möglichkeit, Werte in sonst nur lesbare Variablen zu setzen und darin auch Ausdrücke als Defaultwert zu benutzen.
Wird URL.ScriptName beim Aufruf der Seite nicht übergeben, wird als Defaultwert der Name des aufgerufenen Templates definiert (CGI.SCRIPT_ NAME ist eine interne ColdFusion-Variable, die den Namen des gerade ausgeführten Scripts enthält). Der Defaultwert wird hier also dynamisch erzeugt. Mit kann man aber auch Variablen spezifizieren, d.h., Variablen als Pflichtvariablen definieren. Indem man das Default-Attribut weglässt, gibt man ColdFusion zu verstehen, dass an dieser Stelle im Programm die Variable vorhanden sein muss. Ist sie das nicht, bricht ColdFusion mit einer Fehlermeldung ab.
Hier wird kein Defaultwert definiert. Fehlt der URL-Parameter id beim Aufruf der Seite, wird diese Seite nicht ausgeführt.
50
Variablen
-Tags sollte man im Sinne eines guten Programmierstils an den
Anfang eines Templates setzen. Sie können so z.B. dokumentieren, welche Parameter erwartet werden. Mit können Sie aber nicht nur Variablen als Pflichtvariablen definieren, Sie können darüber hinaus deren Typ festlegen. Dazu können Sie mit dem TYPE-Attribut im -Tag den Typ der Variablen angeben. Stimmt der angegebene Typ nicht mit dem der Variablen überein, generiert ColdFusion eine Fehlermeldung. und bricht die Programmausführung ab. Folgende Werte sind für das TYPE-Attribut gültig: Typ
Bedeutung
Any
Jeder Typ ist gültig
array
Array
binary
Binärer Wert
boolean
Boolescher Wert
Date
Datumswert
numeric
Numerischer Wert
query
Queryset
string
String
struct
Struktur
UUID
Muss ein gültiger Universally Unique Identifier sein (siehe Sprachreferenz: Funktion CreateUUID() )
Tab. 2.1: Mögliche Werte für das TYPE-Attribut von CFPARAM
Die folgende Zeile gibt eine Fehlermeldung aus, wenn die Variable kunden keine Datenbankabfrage enthält: , obwohl einfacher zu lesen und zu schreiben als die IsDefined()Funktion, ist in der Ausführung etwa halb so schnell. Wann immer es auf Geschwindigkeit ankommt, sollte also IsDefined() der Vorzug gegeben werden.
2.2.4
URL-Parameter
Für jeden ColdFusion-Programmierer wird der Tag kommen, an dem er Werte von einer Seite an die nächste übergeben möchte. Möglichkeiten gibt es dabei mit ColdFusion eine ganze Menge z.B. mittels Cookies, Formularen oder URLParametern. Letztere sind auf Grund der Einfachheit der Nutzung eine der am meisten benutzten Technik im Internet.
51
2 Grundlagen
Um mittels URL-Parameter einen Wert von einer Seite an die nächste zu übergeben, hängt man einfach den Parameter an die URL des neuen Dokumentes an. Dabei trennt ein Fragezeichen (?) die Parameterliste vom Namen des Dokumentes. Die Parameterliste besteht aus Name/Wert-Paaren, die durch ein Gleichheitszeichen (=) separiert werden. (Sicher haben Sie schon öfter beim Surfen URLs in der Form seite?name1=%34e gesehen.) Sollen mehrere Parameter übergeben werden, so muss jedes Parameter/WertPaar mit einem &-Zeichen getrennt sein. Der Link login
übergibt die beiden Parameter user und pass mit den Werten foo und bar. Übergeben Sie Parameter mit einem Link, sind die Werte und Variablennamen im aufgerufenen ColdFusion-Template als so gennante URL-Variablen sichtbar, d.h., zum Zugriff benutzt man das Präfix URL. Im eben beschrieben Beispiel wären im Template login.cfm die beiden Variablen URL.user und URL.pass vorhanden. Sie können diese wie ganz normale Variablen ansprechen:
Man kann die Variablen zwar auch ohne Präfix ansprechen, Sie sollten es sich aber zur Angewohnheit machen, stets die Schreibweise mit Präfix zu benutzen. Zum einen ist das guter Programmierstil und macht Ihren Code nicht nur für Sie, sondern auch für andere leichter lesbar, zum anderen beschleunigt es die Ausführung Ihrer Seite, da ColdFusion nicht erst suchen muss, zu welchem Bereich die Variable gehört. URL-Variablen sind im gesamten Template sichtbar (ebenfalls in den später behandelten Include-Dateien und Custom-Tags). Jetzt wird es aber Zeit für das erste Beispiel-Programm. Das Programm soll einen einfachen Zugriffszähler simulieren, bei dem der Zählerstand als URLParameter übergebenen wird: Zugriffszaehler aktueller Zaehlerstand: # counterNew#
52
Variablen
neu laden Listing 2.3: count.cfm – Zugriffszähler per URL-Parameter
Speichern Sie den Programmcode als count.cfm im Verzeichnis CF-Tests Ihres Webservers ab, und rufen Sie es im Browser mit http://localhost/CF-Tests/count.cfm?counter=0
auf. Sie übergeben damit die Variable URL.counter an das Template count.cfm. URL-Parameter sind nicht case-sensitiv (Groß- bzw. Kleinschreibung wird nicht beachtet), Sie könnten die Datei auch mit http://localhost/CF-Tests/count.cfm?CounTer=0
aufrufen. Im Programmbeispiel wird dann zuerst eine neue Variable counterNew angelegt, in der der Wert von URL.counter + 1 gespeichert (der alte Zählerstand wird also um eins erhöht) wird. Dann wird zunächst der aktuelle Zählerstand und danach ein dynamischer Link (ein Link, der dynamische Bestandteile enthält, also in diesem Fall den Zählerstand, der als ColdFusion-Variable übergeben wird) ausgegeben. Beachten Sie, dass Sie den neuen Zählerstand in den Link integrieren müssen. Das erreichen Sie, indem Sie die Zählervariable im -Tag ausgeben. Damit ColdFusion die Variablenwerte in die HTML-Tags einsetzen kann, dürfen Sie die -Tags nicht vergessen! Vielleicht werden Sie sich jetzt die Frage stellen, was passiert, wenn man das Template ohne Parameter aufruft und wenn Sie es nicht schon getan haben, dann sollten Sie es unbedingt einmal probieren. Sie werden eine Fehlermeldung in der Art Error resolving parameter URL.COUNTER erhalten, und zwar deshalb, weil Sie in der zweiten Programmzeile im Script die Variable URL.counter auslesen möchten, die aber nicht vorhanden ist. Deshalb erzeugt ColdFusion eine Fehlermeldung und unterbricht den Programmablauf. Da Sie bei URL-Parametern nicht immer davon ausgehen können, dass diese beim Aufruf auch vorhanden sind (ein User könnte ja den URL manipulieren), müssen Sie Fehler bei der Benutzung von URL-Variablen mit einkalku-
53
2 Grundlagen
lieren und im Programm einen dementsprechenden »Ausweichcode« vorsehen. Mittels der bereits vorgestellten Funktion IsDefined() ist das sehr leicht möglich. Wir erweitern dazu unser Zugriffszähler-Beispiel wie folgt: Zugriffszaehler
aktueller Zaehlerstand: #counterNew#
neu laden Listing 2.4: Erweiterung von count.cfm mit IsDefined()-Abfrage für die Variable URL.counter
Rufen Sie jetzt die Datei als http://localhost/CF-Tests/count.cfm OHNE Parameter auf, wird das durch die Funktion IsDefined() in der zweiten Zeile erkannt und damit nicht auf die Variable URL.counter zugegriffen. Es wird ein dann einfach ein Defaultwert benutzt. Es wäre aber auch möglich, z.B. eine Mitteilung an den User auszugeben. Die zweite Möglichkeit der Fehlervermeidung ist mit dem ebenfalls schon vorgestellten -Tag gegeben. Das dazugehörige Programm sieht so aus: Zugriffszaehler
54
Variablen
aktueller Zaehlerstand: #counterNew#
neu laden Listing 2.5: Verwendung von CFPARAM zum Abfangen nicht vorhandener Variablen
Zwei wichtige Punkte gilt es bei der Benutzung von URL-Parametern noch zu beachten: Zum einen können Sie nicht unbegrenzt Daten über den URL austauschen. Die Länge des Strings ist nur bis 1024 Zeichen garantiert. Mehr sind zwar unter Umständen möglich, das hängt aber auch stark von der verwendeten Browser-Version ab. Versuchen Sie also nicht, ganze Recordsets (Ergebnisse von Datenbankabfragen) über den URL zu übergeben. (Auch wenn viele von Ihnen angesichts dieser Formulierung wahrscheinlich den Kopf schütteln werden, solche Fälle hat es schon gegeben!) Der zweite wichtige Punkt ist die Behandlung von Sonderzeichen. Dass Sie nicht einfach die Zeichen & und ? übertragen können, dürfte klar sein. Das Fragezeichen trennt ja den Parameterstring vom URL und das & trennt die einzelnen Name/Wert-Paare. Würden Sie diese Zeichen direkt als URL-Parameterwerte benutzen (z.B. Name=Peter&Paul), wäre eine Aufschlüsselung der Paare nicht mehr fehlerfrei möglich. Aber auch hier gibt es eine Lösung. Um auch Sonderzeichen übertragen zu können, gibt es eine Regelung im RFC 1738 (RFC=Request For Comment, dies sind Dokumente, die in einer genau festgelegten Form viele der im Internet verwendeten Standards regeln). Die Sonderzeichen werden durch einen Code ersetzt, der durch das %-Zeichen als Escape-Zeichen eingeleitet wird. Dem folgen jeweils zwei Hexadezimalzahlen (auf dem 16-er System basierend), die den Code des Zeichens im Rahmen des ANSI 8859-1 Zeichensatzes beschreiben. Damit wird z.B. ein Leerzeichen zu %20, & zu %26 und ? zu %3F. Zeichen mit einem Code größer als 127 müssen IMMER codiert werden.
55
2 Grundlagen
Als ColdFusion-Programmierer müssen Sie aber zum Glück die Konvertierung nicht selbst programmieren, denn es gibt bereits eine Funktion, die Ihnen die Arbeit abnimmt. Die Funktion heißt URLEncodedFormat() und wandelt einen String in das fertig codierte Format um, so dass Sie ihn direkt an die URL hängen können. Die Zeilen #string#
liefern als Ergebnis 1%3F2%263%3C4%3E. Üblicherweise wird der String aber nicht auf der Webseite ausgegeben, sondern in das -Tag integriert: link
Im Browser kommt dann dieser HTML-Code an: link
Die Rückkonvertierung dieser so umgewandelten Parameter führt ColdFusion selbst durch. Es gibt in ColdFusion 4.5 zwar auch die Funktion URLDecode(), die im Normalfall jedoch kaum einmal verwendet werden muss. Greift man in einer ColdFusion-Seite auf eine URL-Variable zu, bekommt man den ursprünglichen Wert übergeben, nicht den URL-codierten Wert. Der folgende Code übergibt zwei Parameter, die durch ein & getrennt werden müssen: klick endlich!
Im Template foo.cfm werden diese beiden Parameter als URL.ID und URL.key ansprechbar. Es ist nicht zwingend nötig, Parameter, die keine Sonderzeichen enthalten, zu codieren.
56
Operatoren
2.2.5
Form-Variablen
Weitere Möglichkeiten der Parameterübergabe sind mit HTML-Formularen und den FORM-Variablen gegeben. Dabei wird ein Template über ein normales HTML-Formular aufgerufen, und die enthaltenen Formularelemente werden im aufgerufenen Template als Variablen mit dem Präfix FORM abgebildet. Enthält das Formular ein Feld
so existiert auf der Action-Page die Variablen FORM.username Details zur Verwendung von Formularen und FORM-Variablen entnehmen Sie bitte dem Kapitel Formulare.
2.3
Operatoren
Operatoren verbinden in der Regel zwei Variablen oder Ausdrücke und liefern ein entsprechendes Ergebnis. Die Syntax dafür lautet: Ausdruck Operator Ausdruck ColdFusion bietet fünf Typen von Operatoren: 왘 Arithmetische Operatoren 왘 Vergleichsoperatoren 왘 Stringoperatoren 왘 Logikoperatoren 왘 Bit-Operatoren
2.3.1
Arithmetische Operatoren
Arithmetische Operationen arbeiten mit Zahlenwerten und liefern einen Zahlenwert zurück. Addition (+) Der Operator + liefert die Summe zweier numerische Operanden.
Subtraktion (-) Der Operator – liefert die Differenz zweier numerischer Operanden.
57
2 Grundlagen
Multiplikation (*) Der Operator * liefert das Produkt zweier numerische Operanden.
Division (-) Der Operator / dividiert den ersten Operanden durch den zweiten. Das Ergebnis kann ein Fließkommawert sein. #a#
Obige Zeilen liefern 2.5 als Ergebnis. Modulo (mod) Der Modulo-Operator MOD berechnet den ersten Operanden modulo dem zweiten, d.h., es wird der Rest berechnet, den der erste Operand bei ganzzahliger Division durch den zweiten übrig lässt. Der rechte Operand darf nicht Null sein. #a#
liefert 3 als Ergebnis. Exponent (^) Der Exponent-Operator ^ gibt das Ergebnis einer potenzierten Zahl (Exponent) zurück. Mit dem Exponentialzeichen ^ trennt man die Basis vom Exponenten. Der linke Operand darf nicht Null sein. #a#
Diese Programmzeilen liefern 16 als Ergebnis.
2.3.2
Vergleichsoperatoren
Bei Vergleichsoperatoren handelt es sich um Operatoren, die Werte zweier Variablen oder Ausdrücke vergleichen und eine boolesches Ergebnis (TRUE oder FALSE bzw. YES oder NO) zurückgeben. Am gebräuchlichsten sind
58
Operatoren
diese Operatoren in Verbindung mit dem -Tag oder mit einer bedingten Schleife, worauf wir später noch zurückkommen werden. ColdFusion verwendet eine für Programmiersprachen eher untypische Schreibweise. Gleichheit Der Operator IS liefert TRUE, wenn beide Operatoren gleich sind. Es können verschiedenen Operandentypen miteinander verglichen werden, das Ergebnis hängt von Typ der Operanden ab. "1" IS "1.0"
Dieser Vergleich liefert TRUE, da ein numerischer Vergleich durchgeführt wird. Ist einer der Operatoren ein String, also nicht in einen numerischen Wert konvertierbar, wird ein Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. Der Vergleich "hallo" IS "haLLo"
liefert demnach TRUE. Alternative Schreibweisen für IS sind EQUAL und EQ (benutzen Sie die Funktion Compare(), um einen case-sensitiven Vergleich durchzuführen). Ungleichheit Der Operator IS NOT liefert TRUE, wenn beide Operatoren ungleich sind. Es können verschiedenen Operandentypen miteinander verglichen werden. Ist einer der Operatoren ein String, wird ein Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. Der Vergleich "hallo" IS NOT "hallo2"
liefert also TRUE. Alternative Schreibweisen für IS NOT sind NOT EQUAL und NEQ. Kleiner als Der Operator LESS THAN liefert TRUE, wenn der erste Operand kleiner als der zweite ist; sonst liefert er FALSE. Die Operanden können Zahlen oder auch Strings sein. Strings werden auf der Basis der Codewerte der einzelnen Zeichen miteinander verglichen. Der Vergleich 1 LESS THAN 2
liefert demnach TRUE. "a" LESS THAN "b"
liefert TRUE, da der ASCII-Wert von a (97) kleiner als der ASCII-Wert von b (98) ist. Eine alternative Schreibweise für LESS THAN ist LT.
59
2 Grundlagen
Kleiner oder gleich Der Operator LESS THAN OR EQUAL liefert TRUE, wenn der erste Operand kleiner als der zweite ist oder gleich diesem ist; sonst liefert er FALSE. Eine alternative Schreibweise für LESS THAN OR EQUAL ist LTE. Größer Der Operator GREATER THAN liefert TRUE, wenn der erste Operand größer als der zweite ist, sonst liefert er FALSE. Hier lautet die alternative Schreibweise GT. Größer oder gleich Der Operator GREATER THAN OR EQUAL liefert TRUE, wenn der erste Operand größer als der zweite ist oder gleich diesem ist; sonst liefert er FALSE. Die alternative Schreibweise für GREATER THAN OR EQUAL ist GTE. Enthält Der Operator CONTAINS liefert TRUE, wenn der zweite Operand im ersten enthalten ist, sonst liefert er FALSE. "abcd" CONTAINS "c"
liefert TRUE. Enthält nicht Der Operator DOES NOT CONTAIN liefert TRUE, wenn der zweite Operand im ersten nicht enthalten ist, sonst liefert er FALSE. "abcd" DOES NOT CONTAIN "c"
liefert FALSE.
2.3.3
Stringoperatoren
Der Operator & verknüpft zwei Stringoperanden zu einem neuen String. Das Beispiel "Bart" & "-" & "Simpson"
führt zu Bart-Simpson. In ColdFusion werden Variablen, die in Strings mit dem Nummernzeichen begrenzt sind, automatisch ausgewertet und durch den Inhalt ersetzt. #myString#
liefert als Ergebnis es ist Homer Simpson.
60
Operatoren
Numerische Werte werden bei Verwendung des Stringoperators automatisch in Strings konvertiert: #myString#
liefert als Ergebnis zahl=12.
2.3.4
Logikoperatoren
Logikoperatoren erwarten Boolesche Werte (Ja/Nein-Werte) als Operanden und liefern ein Boolesches Ergebnis (Ja/Nein-Ergebnis). Im Allgemeinen werden sie in Verbindung mit Vergleichsoperatoren verwendet, um so komplexere Verknüpfungen auszudrücken. Logisches Und Der Operator AND liefert TRUE, wenn sowohl der erste als auch der zweite Operand TRUE liefern. Liefert einer der beiden Operanden FALSE, die der Gesamtausdruck ebenfalls FALSE. #c#
liefert TRUE (YES). Beachten Sie bitte, dass bei ColdFusion TRUE durch YES und FALSE durch NO ausgedrückt werden, d.h., ColdFusion gibt als String stets YES oder NO anstatt TRUE und FALSE zurück. Deshalb zeigt das Beispiel als Ausgabe auch nicht den String TRUE, sondern YES. Sie können aber auch problemlos TRUE und FALSE verwenden. Logisches Oder Der Operator OR liefert TRUE, wenn mindestens einer der beiden Operanden TRUE liefert. Liefern beide Operanden FALSE, wird der Gesamtausdruck ebenfalls als FALSE bewertet.
61
2 Grundlagen
#c#
liefert TRUE (YES). Logisches Nicht Der Operator NOT ist ein unärer Operator, der vor einem einzigen Operator steht. Er kehrt den Booleschen Wert seines Operanden in das Gegenteil. Hat der Operand den Wert TRUE, bewirkt NOT den Wert FALSE und umgekehrt. #b#
liefert FALSE (NO).
2.3.5
Bit-Operatoren
Bit-Operatoren liefern wie die arithmetischen Operatoren einen numerischen Wert zurück. Sie interpretieren ihre Operanden nicht als Zahl, sondern als eine Folge von binären Nullen und Einsen. ColdFusion wandelt die Operanden dazu vorher in 32-Bit-Ganzzahlen. Die Bit-Operatoren entsprechen in ColdFusion nicht ganz der Syntax der anderen Operatoren, sondern werden als Funktionen zur Verfügung gestellt. Trotzdem sollen sie an dieser Stelle beschrieben werden. Bitweises Und Die Funktion BitAnd() führt eine Boolesche Und-Operation auf sämtliche Bits seiner beiden Operanden durch. Ein Bit wird im Ergebnis genau dann gesetzt, wenn das entsprechende Bit in beiden Operanden gesetzt ist. Die Operation #b#
führt zum Ergebnis 1. 5 wird im Dual-System als 101 geschrieben, 3 als 11. Vergleichen wir nun die beiden Zahlen miteinander, sehen wir, dass lediglich das rechte Bit in beiden Zahlen gesetzt ist:
62
Operatoren
Die Zahl 5: 101 Die Zahl 3: 011 Ergebnis: 001
Und eine binäre 1 ist gleich einer dezimalen 1. Bitweises Oder Die Funktion BitOr() führt eine Boolesche Oder-Operation auf sämtliche Bits seiner beiden Operanden durch. Ein Bit wird im Ergebnis genau dann gesetzt, wenn das entsprechende Bit in mindestens einem der beiden Operanden gesetzt ist. #b#
liefert als Ergebnis 7 (binär: 111) Bitweise Negation Die Funktion BitNot() führt eine Boolesche Negation auf sämtliche Bits seines Operanden durch. Ein Bit wird im Ergebnis genau dann gesetzt, wenn das entsprechende Bit im Operanden gelöscht ist und umgekehrt. Aufgrund der internen Darstellung von Zahlen mit Vorzeichen bedeutet die Negation einer Zahl, ihr Vorzeichen umzukehren und 1 zu subtrahieren (Einerkomplement). #b#
liefert als Ergebnis -6 Bitweises Exklusiv-Oder Die Funktion BitXor() führt eine Boolesche Exklusiv-Oder-Operation auf sämtliche Bits seiner beiden Operanden durch. Ein Bit wird im Ergebnis genau dann gesetzt, wenn das entsprechende Bit in genau einem der beiden Operatoren gesetzt ist, nicht aber in beiden. Die Operation #b#
liefert als Ergebnis 6 (binär: 110).
63
2 Grundlagen
2.4
Programmablaufsteuerung
Sie haben im letzten Abschnitt viel über Ausdrücke und Operatoren gelesen. Diese sind für sich allein genommen aber zumeist nicht besonders nützlich. Damit die Ausdrücke und Operationen etwas bewirken können, benötigen sie Anweisungen, die mit diesen Ergebnissen arbeiten können. Im folgenden Abschnitt wollen wir Ihnen deshalb das Konzept der Programmablaufsteuerung näher erläutern.
2.4.1
Bedingte Programmausführung
IF-Statements dienen wie in den meisten Programmiersprachen auch in CFML der bedingungsabhängigen Ausführung von Codeblöcken. Die Sprachsyntax ist dabei sehr einfach gehalten. Das entsprechende Tag heißt und besitzt ein zugehöriges Endtag. Dazwischen steht dann der bedingungsabhängige Code, der aus CFML-Befehlen und HTML-Code bestehen darf: Anweisungen
Der Ausdruck wird bei der Abarbeitung der Codezeile ausgewertet. Ergibt er TRUE, werden die Anweisungen innerhalb und ausgeführt. Das Beispiel Passwort OK!
zeigt den Text demnach nur an, wenn der Vergleich in der ersten Zeile TRUE ergibt. Zur Definition der Bedingung können Sie die im letzten Abschnitt vorgestellten Vergleichsoperatoren benutzen. Darüber hinaus können Sie jeden Ausdruck setzen, der ein boolsches Ergebnis zurückliefert. (In ColdFusion liefern einige Funktionen einen Booleschen Rückgabewert und können deshalb direkt als Ausdruck verwendet werden.) Werden in Bedingungen mehrere Operatoren mit den bereits vorgestellten Logikoperatoren kombiniert, sollte jede Bedingung in Klammern gesetzt werden. (Das sollten Sie auch tun, wenn es nicht unbedingt nötig ist, erleichtert es Ihnen doch das Programmiererleben erheblich.) Das Auto ist alt...
64
Programmablaufsteuerung
Hier wird daraufhin geprüft, ob die Variable typ den String auto und zustand den String alt enthält. Die gesamte Bedingung ist also nur wahr, wenn es sich um ein altes Auto handelt. Um zu überprüfen, ob es sich um ein Auto oder um ein Fahrrad handelt, müssten Sie folgendes schreiben:
Es gibt auch eine Möglichkeit, im Falle der Nichterfüllung der Bedingung einen bestimmten optionalen Programmzweig zu durchlaufen. Mit dem -Tag lässt sich eine solche Alternative definieren. es ist ein Auto dann ist es eben kein Auto
Der -Zweig wird immer durchlaufen, wenn der erste Ausdruck FALSE ergibt. Mit dem -Tag können zusätzlich zur ersten Bedingung weitere Bedingungen definiert werden. Das -Tag ist eine Kombination aus und . Es wird wie das -Tag immer dann ausgeführt, wenn der Ausdruck im -Zweig unwahr ist. Es lassen sich beliebig viele in einer -Struktur unterbringen, wobei jeder -Zweig dann geprüft wird, wenn der vorherige FALSE ergab. Die erste Bedingung, die TRUE ergibt, führt ihren entsprechenden Code-Abschnitt aus, woraufhin die ganze -Struktur verlassen wird. Wert zu klein! nah dran! richtig! knapp daneben! zu groß!
Zuerst wird die erste Bedingung (zahl LT 4) überprüft. Ist zahl kleiner als 4, wird der zugehörige Abschnitt ausgeführt und der erste Text ausgegeben. Dann wird die ganze Struktur verlassen und die erste Anweisung hinter dem wird abgearbeitet.
65
2 Grundlagen
Ist die erste Bedingung falsch, wird die zweite Bedingung geprüft (zahl LT 6). Ist diese wahr (z.B. bei zahl=5), wird der zweite Text ausgegeben. Ergibt auch der zweite Bedingungsausdruck FALSE, geht es bei der dritten Bedingung weiter. Wenn partout keine Bedingung richtig sein will, gibt es zum Schluss noch das -Tag. Die darin enthaltenen Anweisungen werden dann ausgeführt,
wenn keine der vorherigen Bedingungen zutreffend waren. Wie schon erwähnt, muss die Bedingung in einem -Konstrukt nicht unbedingt ein Vergleich mit den Vergleichsoperatoren sein, ein boolescher Ausdruck tut es auch. So führt IsDefined() zu einem boolschen Ergebnis. Sie können also schreiben
anstelle von
Eine Alternative zu endlosen ---Konstrukten bietet das Schalter-Statement . Es wertet einen Ausdruck aus und führt in Abhängigkeit von dessen Wert einen bestimmten Codeblock aus. Die Syntax zu CFSWITCH lautet: --- ein oder mehrere – Blöcke ----- max. ein -Block --
Zu beachten ist, dass ColdFusion den übergebenen Ausdruck auswerten soll, also muss er in Nummernzeichen eingeschlossen sein:
Innerhalb von verwenden wir für jedes mögliche Ergebnis des Ausdrucks einen – Block. Der Code innerhalb von wird ausgeführt, wenn der Ausdruck aus dem Statement den gleichen Wert hat wie im -Statement angegeben. Im Zusammenhang mit dem o.g. -Statement wird der Block Richtig!
also nur ausgeführt, wenn die Variable zahl den Wert 7 hat. Wir können auch mehrere Werte gleichzeitig prüfen, indem wir im Attribut VALUE eine kommagetrennte Liste der möglichen Werte angeben: Wert zu klein!
66
Programmablaufsteuerung
Mehrere - Blöcke entsprechen also einem mit mehreren . Und auch für das (ohne weitere Bedingung) gibt es eine Entsprechung: wird nur ausgeführt, wenn keiner der vorhergehenden - Blöcke ausgeführt wurde. Hier nun unser Zahlenbeispiel als ---Statement: Wert zu klein! nah dran! richtig! knapp daneben! zu gross!
Auf den ersten Blick sieht dieses Beispiel komplizierter aus als das Konstrukt, benötigt es doch sechs Programmzeilen mehr. Allerdings bietet einen anderen deutlichen Vorteil: Es ist deutlich schneller als , spätestens bei drei -Konstrukten wie in diesem Beispiel. Bei diesen einfachen Bedingungen ist etwa 10% schneller als . Bei zusammengesetzten Bedingungen mit AND oder OR steigert sich dieser Vorteil schnell auf über 40%!
2.4.2
Schleifen
Schleifen sind ein wichtiger Teil einer jeden Programmiersprache. Durch sie kann man einen Anweisungsblock in Abhängigkeit von bestimmten Bedingungen wiederholt ausführen lassen. In ColdFusion gibt es dafür das -Tag. Es besteht aus einem Start- und End-Tag, mit dem man den Anweisungsblock umschließt: Anweisungen
67
2 Grundlagen
Um eine Schleife vorzeitig zu beenden, gibt es das -Tag. Die Programmausführung wird nach dem schließenden fortgesetzt. Anweisungen wird durch verschiedene Attribute gesteuert, mit denen Sie die genaue Funktion und Wirkungsweise der Schleife festlegen. Auf diese Weise ergeben sich sehr praktische und mächtige Anwendungsmöglichkeiten für ColdFusion-Schleifen.
Die einzelnen Schleifen-Arten in ColdFusion sind: 왘 Index-Schleife: für eine vorher festgelegte Anzahl von Wiederholungen 왘 Bedingungs-Schleife: wiederholt, so lange eine Bedingung wahr ist 왘 Listen-Schleife: läuft über eine ColdFusion-Liste 왘 Query-Schleife: läuft über ein Queryset einer Datenbankabfrage 왘 Struktur-Schleife: läuft über eine Collection oder Struktur
Index-Schleife Mit der Index-Schleife (in anderen Programmiersprachen meistens als ForNext-Schleife bekannt) können Sie eine Variable von einem Startwert zu einem Endwert hoch- oder herunterzählen lassen. Dadurch kann eine bestimmte Anzahl Schleifendurchläufe vorher festlegt werden. Die Syntax dafür lautet: Anweisungen
Mit dem INDEX-Attribut legen Sie die so genannte »Laufvariable« fest. Das ist die Variable, die innerhalb der Schleife den aktuellen Schleifenzählerwert enthält. Das FROM-Attribut bestimmt den Startwert der Indexvariablen, d.h., beim ersten Durchlauf der Schleife enthält die Laufvariable den dort festgelegten Wert. Passend dazu definiert das TO-Attribut den Endwert der Indexvariablen, also den Wert, den die Indexvariable beim letzten Schleifendurchlauf enthält. Das optionale Attribut STEP legt den Schrittwert fest, um den die Laufvariable nach jedem Schleifendurchlauf erhöht oder vermindert wird. Fehlt die Angabe, wird automatisch der Wert 1 benutzt.
68
Programmablaufsteuerung
Wie Sie sehen, stehen alle die für die Funktion der Schleife relevanten Daten im ersten Tag der Schleife. Dadurch ist die Arbeitsweise klar ersichtlich. Die folgenden Beispiele sollen einige Einsatzmöglichkeiten der Index-Schleife erläutern: Schleifenwert=#idx#
Die Schleife zählt die Variable idx von 1 bis 10 hoch. Innerhalb der Schleife wird der Wert der Variablen ausgegeben. Das Attribut STEP fehlt, also wird die Indexvariable jeweils um eins erhöht. Ist der Wert für das STEP-Attribut negativ, wird die Laufvariable vermindert. Dieser Loop läuft durch einen negativen STEP-Wert abwärts. SchleifenWert=#myIndex#
Sie können den Attributen anstelle von Zahlenwerten jedoch auch auswertbare Ausdrücke zuweisen. Der folgende Code-Abschnitt verdeutlicht das: #text#
Das FROM-Attribut erhält hier durch eine Variable den Startwert. Damit ColdFusion den Inhalt der Variablen start und nicht den String »start« dem Attribut zuweist, dürfen Sie nicht vergessen, den Variablennamen mit Nummernzeichen zu umschließen! Den Wert für das TO-Attribut liefert ein Funktionsausdruck. Die ColdFusionFunktion Len() berechnet hier die Länge der Variablen text und weist das Ergebnis dem TO-Attribut zu. Der Endwert wird somit dynamisch berechnet. Selbstverständlich wird die Länge von text nur einmal für den TO-Wert berechnet, der Zielwert wird nicht bei jedem Schleifendurchlauf neu ermittelt! Auch hier müssen die Nummernzeichen angegeben werden, damit ColdFusion den Ausdruck berechnen kann.
69
2 Grundlagen
In der Schleife wird die Länge von text bei jedem Schleifendurchlauf verkürzt und das Ergebnis ausgegeben: 왘 123456 왘 12345 왘 1234 왘 123 왘 12 왘 1
Zur Demonstration des -Tags wollen wir jetzt noch die Schleife vorzeitig abbrechen: #text# i=#i#
Neu daran ist, dass ein innerhalb der Schleife den Zählerwert abfragt. Ist dieser 3, wird das ausgeführt und die Schleife sofort beendet. Das Ergebnis ist dann: 123456 12345 1234 i=3 Beachten Sie, dass die Laufvariable auch nach der Schleife noch existiert und den letzten Schleifenwert enthält. Bedingungs-Schleife Die Bedingungs-Schleife wiederholt den Anweisungsblock, so lange die angegebene Bedingung TRUE ergibt. Dazu wird dem Attribut CONDITION ein auswertbarer ColdFusion-Ausdruck zugewiesen, der bei jedem Durchlauf
70
Programmablaufsteuerung
auf seinen Wahrheitsgehalt hin überprüft wird. Dieser Ausdruck muss ein boolesches Ergebnis liefern. Ergibt diese Auswertung TRUE, wird die Schleife ausgeführt, ansonsten wird die Programmausführung nach dem fortgesetzt: Anweisungen
Im letzten Schleifen-Beispiel hatten wir schrittweise einen String um ein Zeichen verkürzt und ausgegeben und bei einer Unterschreitung einer festgelegten Mindestlänge die Schleife abgebrochen. Sie werden sehen, dass sich das mit einer Bedingungs-Schleife etwas eleganter lösen lässt: #text#
Die Bedingung , die den Schleifendurchlauf steuert, ist in diesem Beispiel #Len(text)# GT 3. Sie vergleicht die aktuelle Länge von text. Ist die Länge größer als drei, liefert der Ausdruck TRUE, ansonsten FALSE. Das heißt, die Schleife wird so lange durchlaufen, bis die Variablenlänge auf drei geschrumpft ist. Das Ergebnis sieht im Browser so aus: 123456789 12345678 1234567 123456 12345 1234 123 Zum Abschluss noch ein kleines Beispiel, das genau 1 Sekunde zur Ausführung braucht. ich warte schon #evaluate(getTickCount()-start)# ms
71
2 Grundlagen
bin fertig
Dazu wird zuerst mit der Funktion getTickCount() ein interner Zählerstand in start gespeichert. (Bei getTickCount() handelt es sich um eine ColdFusionFunktion, die einen internen Zählerstand liefert, der 1 mal pro Millisekunde erhöht wird.) In der Schleifen-Bedingung wird nun geprüft, ob der aktuelle Zählerstand minus dem Startzähler kleiner als 1000 (entspricht 1000ms=1 Sekunde) ist. Solange also diese Zeit noch nicht verstrichen ist, wird die Schleife ausgeführt. Nach Ablauf einer Sekunde ergibt die Auswertung des Bedingungsausdrucks FALSE, und die Schleife wird beendet. In der Schleife wird die verstrichene Zeit ausgegeben. Wie Sie hier sehen, können Sie auch Berechnungen im Bedingungsausdruck ausführen lassen. Diese Berechnung wird in dann jedem Schleifendurchlauf vorgenommen! Listen-Schleife (List-Loop) Eine Liste in ColdFusion ist ein String, der mehrere Werte enthält, die durch einen Delimiter (Trennzeichen) separiert werden. Zur Bearbeitung solcher Listen stellt ColdFusion mächtige Funktionen bereit, zu denen die Schleife über eine Liste gehört. In einer solchen Listen-Schleife wird dem Attribut INDEX ein Variablenname zugewiesen, der in der Schleife den Wert des aktuellen Listenelementes aufnehmen soll. Mit dem Attribut LIST geben Sie die zu benutzende Liste an. Mit dem DELIMITER-Attribut können Sie ein Zeichen bestimmen, dass als Trennzeichen dienen soll. Fehlt es, wird automatisch ein Komma als Trennzeichen angenommen. Wird die Listen-Schleife durchlaufen, enthält die Laufvariable nacheinander die Werte der Liste. Die genaue Funktionsweise von ColdFusion-Listen erklären wir im Abschnitt »Listen«, darum an dieser Stelle nur der Vollständigkeit halber ein Beispiel. Der folgende Code füllt eine Listbox mit Werten. Dem Attribut INDEX wird hier der Wert idx zugewiesen. Deshalb ist in der Schleife eine Variable mit dem Namen idx präsent, die das aktuelle Land enthält. #idx#
Query-Schleife Die Query-Schleife wiederholt den Anweisungsblock für jede Zeile eines Datensatzes in einem Queryset. Ein Queryset (oder auch Recordset) ist ein Gruppe von Datensätzen, die aus einer Datenbank stammen. Auch hier soll nur ein kurzes Beispiel folgen. Für weiter gehende Informationen sei auf das zugehörige Kapitel verwiesen. Machen Sie sich also keine Gedanken, wenn Sie mit der Query-Schleife jetzt noch nichts anfangen können, die Erleuchtung lässt nicht mehr lange auf sich warten. name=#UserResult.user#
Das Attribut QUERY gibt den Namen des Querysets an, mit STARTROW und ENDROW gibt man die erste und die letzte auszugebende Zeile des Querysets an. Wenn sie fehlen, durchläuft die Schleife alle Datensätze. Struktur-Schleife Die Struktur-Schleife durchläuft die Elemente einer ColdFusion-Struktur oder eines COM/DCOM Collection Objects. Und wiederum stoßen wir auf zwei Begriffe, die noch nicht erläutert wurden, und an dieser Stelle auch nicht erläutert werden können. Aber selbstverständlich wird auch das an der passender Stelle nachgeholt. Um der Vollständigkeit willen werden wir auch auf diese letzte Ausprägung von Schleifen einen kurzen Blick werden. Sie können aber auch problemlos diesen Abschnitt überspringen. Für alle, die schon wissen was eine Struktur ist, folgt ein kleines Beispiel. Benötigte Attribute für die Strukturschleife sind COLLECTION für das Struktur-Objekt und ITEM für den Namen der Variablen, die in der Schleife die Elemente enthalten soll. Eine Schleife über eine Struktur würde wie folgt aussehen:
73
2 Grundlagen
#idx#
Als Ergebnis sehen wir Folgendes: NAME ANZAHL DATUM
2.5
Beispielprogramm – Loginsystem
Nach der vielen grauen Theorie haben Sie sich eine kleine Applikation verdient. Sie werden sehen, dass mit recht wenig ColdFusion-Code schnell einfache Aufgaben im Web erledigt werden können. Als Web-Programmierer werden Sie oft mit Zugangskontrollen konfrontiert werden. Ein kleines Grundgerüst soll in diesem Beispielcode erläutert werden, auch wenn es natürlich keinen sehr sicheren Schutz bietet. Das ganze Programm besteht aus der Datei login.cfm. Diese wird aufgerufen, wenn der Benutzer sich einloggen soll, bzw. wenn Sie sein Passwort überprüfen wollen. Das Programm beginnt mit einer -Struktur, deren Verlauf durch den Wert der Variablen CGI.request_method beeinflusst wird. Die Variable CGI.request_method ist eine interne ColdFusion-Variable, die die aktuelle Aufrufmethode (= POST oder GET) für das laufende Script enthält. Da wir die Datei »login.cfm« direkt über Eingabe im Browser oder einen Link aufrufen, ist die Methode GET und der Vergleich mit dem String »POST« liefert FALSE. Der Code zwischen den -Tags wird damit übersprungen, und es wird direkt das Formular angezeigt. Das Formular ist ein reines HTML-Formular, das die Eingabemaske für das Passwort und einen Submit-Button enthält. Mehr passiert beim ersten Aufruf nicht.
74
Beispielprogramm – Loginsystem
Wenn Sie sich die Attribute des -Tags genauer anschauen, werden Sie feststellen, dass das im ACTION-Attribut das die login.cfm selbst als Zieldatei für die Formulardaten angegeben ist. Mit METHOD="post" ist festgelegt, dass sich die Seite selbst mit der POST-Methode aufrufen wird. Wir tragen also unser Passwort in die Eingabemaske und schicken die Daten los. Es wird wieder durch den Server »login.cfm« aufgerufen. Da wir die Daten ja per POST schickten, liefert die Variable CGI.request_method diesmal jedoch TRUE und der Code innerhalb des -Statements wird abgearbeitet. Hier findet nun in einer zweiten -Struktur die Überprüfung des Passworts statt, das in der FORM-Variablen FORM.pw übergeben wurde. Ist das Passwort korrekt, wird mit dem -Tag zu einer neuen Seite umgeleitet. Der Benutzer bekommt dann im seinen Browser die Seite ok.cfm zu sehen. Ist das Passwort nicht korrekt, wird eine Fehlermeldung angezeigt und die -Struktur ohne Umleitung zur ok.cfm verlassen. Der Benutzer erhält
dann noch mal das Formular angezeigt. Login.cfm Passwort falsch! Passwort: Listing 2.6: Der vollständige Code der login.cfm
75
2 Grundlagen
Das Loginsystem ist natürlich leicht zu knacken. Der Benutzer könnte z.B. direkt im Browser das Template ok.cfm aufrufen und die Loginmaske dadurch problemlos umgehen. Sie werden später sehen, dass es mit ColdFusion sehr einfach ist, sich gegen solche Tricks zu schützen.
2.6
Komplexe Variablen
Nicht immer erreichen die in Abschnitt 2.2.1 »Einfache Variablen« vorgestellten einfachen Variablen aus, um alle Programmierprobleme zu lösen. Es wäre z.B. sehr aufwendig, eine umfangreiche Artikelliste eines Shops jeweils mit eigenen einfachen Variablen zu erfassen. Jedes Hinzufügen eines neuen Artikels würde bedeuten, das Programm abändern und eine neue Variable einsetzen zu müssen. Es müsste für solche Bedürfnisse also eine Möglichkeit geben, Variablen dynamisch zu erzeugen, und auch hier enttäuscht uns Cold Fusion nicht. Es handelt sich dabei um etwas komplexere Variablen, die wir Ihnen an dieser Stelle vorstellen möchten. Wenn Sie bereits mit anderen Programmiersprachen Erfahrungen gesammelt haben, werden Ihnen einige Variablentypen bekannt und vertraut vorkommen, von anderen hingegen werden Sie wohl zum ersten mal hören. Sie werden sehen, dass ColdFusion hier einiges zu bieten hat.
2.6.1
Arrays
Arrays sind Variablen, die aus mehreren Elementen bestehen, die selbst wieder einfache Variablen oder komplexe Variablen sein können. Die Elemente eines Arrays werden durchnummeriert. Damit erhält jedes Element eine eigenen Nummer, mit der man auf den Inhalt des Elementes zugreifen kann. Diese Nummer wird auch Index genannt. Am einfachsten kann man sich ein Array als eine Art Tabelle mit nur einer Zeile vorstellen. Ein einfaches Array mit fünf Elementen könnte z.B. so aussehen: Index
1
2
3
4
5
Inhalt
3
4
"foo"
34
"hallo"
Über den Index-Wert ist die Position eines jeden Wertes genau definiert. Wie Sie sehen, kann jedes Element eines Arrays (anders als in vielen anderen Programmiersprachen) einen anderen Wert-Typ enthalten.
76
Komplexe Variablen
Bei dem eben beschriebenen Array spricht man von einem eindimensionalen Array. ColdFusion unterstützt bis zu dreidimensionale Arrays. Ein zweidimensionales Array lässt sich am besten mit einer Tabelle mit mehreren Zeilen vergleichen. Zur Beschreibung der Position eines Elementes benötigt man dann zwei Indizes, vergleichbar mit Zeilen- und Spaltennummer. Untenstehend die Struktur eines zweidimensionalen Arrays mit 6 Elementen: Indizes
1
2
1
"hallo"
"wert1"
2
"1.2.2000"
"wert3"
3
"21.9.2002"
163
Im Gegensatz zu vielen anderen Programmiersprachen ist in ColdFusion die Nummer des ersten Elementes eines Arrays die 1 und nicht die 0! Erzeugen eines Arrays Zur Erzeugung eines Arrays bedient man sich in ColdFusion der Funktion ArrayNew(), deren einziges Argument die Anzahl der gewünschten Dimensionen des zu erzeugenden Arrays ist. Es sind aber nur bis zu maximal drei Dimensionen zulässig. Das folgende Beispiel erzeugt ein eindimensionales Array mit dem Namen daten:
Um ein zweidimensionales Array zu erzeugen, müsste man schreiben:
Zugriff auf Elemente des Arrays Das so erzeugte Array ist aber noch leer und muss erst noch mit Werten gefüllt werden. Um Elemente in einem Array anzusprechen, benutzt man den Operator [ ], der die Nummer des Elementen-Index umschließt. Links davon muss der Name des Arrays stehen. Für den Zugriff auf ein eindimensionales Array (lesend oder schreibend) benötig man nur einen Indexwert: ArrayName[Index]
Für jede Dimension muss ein Index angegeben werden. Der Zugriff auf ein zweidimensionales Array benötig daher zwei Indizes: ArrayName[Index1][Index2]
Im ColdFusion-Code sieht das Erzeugen eines eindimensionalen Array und das Füllen der ersten drei Elemente dann so aus:
77
2 Grundlagen
#dim1[2]#
Bei einem zweidimensionalen Array schreibt man:
#dim2[1][3]# #dim2[2][2]#
Innerhalb der Klammern kann ein beliebiger Ausdruck stehen, der ein numerisches Ergebnis liefert. ColdFusion führt zuerst die Berechnung aus und setzt dann das entsprechende Element:
oder:
oder:
Im letzten Beispiel wird das Ergebnis eines Funktionsaufrufes als Index benutzt. Der Index ergibt sich hier aus der Länge der Variablen b. Hinzufügen von Elementen In Sprachen wie Java oder C bestehen Arrays aus einer festen Anzahl von Elementen, deren Anzahl bei der Erzeugung angegeben werden muss. Nicht so in ColdFusion. Sie können jederzeit einfach neue Elemente an das Array
78
Komplexe Variablen
anhängen. Dazu weisen Sie einfach dem entsprechenden Element an der gewünschten Position einen Wert zu, und zwar unabhängig davon, ob das Element vorher bereits existierte oder nicht:
Man kann aber in ColdFusion aber auch zur Funktion ArrayAppend() greifen, die einen Wert an das Ende des Arrays anhängt. Dazu erwartet die Funktion als Parameter den Namen des Arrays und den anzuhängenden Wert: ArrayAppend(ArrayName,wert)
Die Funktion liefert ein TRUE zurück, wenn die Operation erfolgreich war.
#a[4]#
Die letzte Zeile setzt den Wert neuer wert in das Element a[4]. Der Vorteil dieser Methode besteht darin, dass Sie nicht die aktuelle Länge des Arrays kennen müssen, um genau an dessen Ende einen neuen Wert anzufügen. Um einen Wert an den Anfang eines Arrays zu setzen, bedient man sich der Funktion ArrayPrepend(), die die gleichen Parameter wie ArrayAppend() erwartet. ArrayPrepend(ArrayName,Wert)
Die Funktion verschiebt alle Elemente um eine Position nach hinten und fügt den angegebenen Wert an den freigewordenen Index 1 des Arrays ein. Das letzte Element geht dabei aber nicht verloren, da das Array dabei automatisch verlängert wird. Folgendes Beispiele soll das verdeutlichen: 1: #a[1]# 2: #a[2]# 3: #a[3]#
79
2 Grundlagen
1: #a[1]# 2: #a[2]# 3: #a[3]# 4: #a[4]#
Das Beispiel liefert folgende Ausgabe: 1: !1! 2: !2! 3: !3! 1: neuer wert 2: !1! 3: !2! 4: !3!
Bei der zweiten Ausgabe werden Sie feststellen, dass neuer wert an erster Stelle steht und alle alten Werte eine Position nach rechts gerückt sind. Dabei wurde das Element a[4] neu angelegt! Möchten Sie an einer bestimmten Index-Position ein neues Element einfügen, benutzen Sie die Funktion ArrayInsertAt(). Sie fügt den angegebenen Wert an die gewünschte Position ein und schiebt alle Elemente mit Indizes, die größer als die neue Position sind, um eine Position nach rechts. Das Array wird dabei wieder automatisch erweitert: ArrayInsertAt(ArrayName,Index,Wert)
Das modifizierte Beispiel:
1: #a[1]# 2: #a[2]# 3: #a[3]#
80
Komplexe Variablen
1: #a[1]# 2: #a[2]# 3: #a[3]# 4: #a[4]#
liefert dann: 1: !1! 2: !2! 3: !3! 1: 2: 3: 4:
!1! neue wert !2! !3!
ColdFusion bietet noch eine ganze Menge von Array-Funktionen, wie z.B. solche zum Löschen oder Sortieren von Elementen. Eine ausführliche Funktions-Liste finden Sie im Anhang dieses Buches. Array-Länge Mit der Funktion ArrayLen() können Sie die aktuelle Länge eines Arrays ermitteln. Sie können damit z.B. sehr leicht mit einer Schleife auf alle Elemente eines Arrays zugreifen. Das folgende Beispiel gibt alle Elemente eines Arrays aus:
#idx#: #a[idx]#
Haben Sie ein mehrdimensionales Arrays erzeugt, müssen Sie angeben, von welcher Dimension Sie die Länge erfragen wollen:
81
2 Grundlagen
1. Dimension: #ArrayLen(a)# 2. Dimension: #ArrayLen(a[1])#
Die dynamische Natur von Arrays Wie wir gesehen haben, können wir dynamisch neue Elemente dem Array hinzufügen. Ebenso können wir Elemente löschen (siehe Anhang) ohne uns Gedanken um die Größe des Arrays Gedanken machen zu müssen. Arrays in ColdFusion sind immer dynamische Arrays, d.h., sie vergrößern oder verkleinern sich selbstständig, wenn Daten hinzugefügt oder gelöscht werden. ColdFusion-Arrays sind eng besetzt. Einzelne Indizes müssen nicht unmittelbar aufeinander folgen. Es wird nur für die vorhandenen Elemente eines Arrays wirklich Speicherplatz angelegt. Das folgende Diagramm zeigt die interne Speicherungsstruktur eines zweidimensionalen Arrays:
Abbildung 2.1: Speicherstruktur eines zweidimensionalen Arrays
82
Komplexe Variablen
Das zweidimensionale ColdFusion-Array besteht im Prinzip aus einem eindimensionalen Array, das selbst wieder als Elemente eindimensionale Arrays enthält. Jede Reihe kann in dieser Art Arraystruktur eine verschiedene Anzahl von Elementen enthalten, und das unabhängig davon, wie viele Elemente die Nachbarreihe enthält. Wenn Sie z.B. folgenden Code ausprobieren, werden nicht etwa 1000 Elemente initialisiert, sondern nur zwei, das erste und das tausendste. Im Arbeitsspeicher des Rechners werden demnach auch nur zwei Speicherplätze reserviert.
Greifen Sie jetzt z.B. auf den Index 3 zu: #a[3]#
werden Sie eine Fehlermeldung erhalten, da a[3] nicht existiert.
2.6.2
Strukturen
Betrachtet man die physikalische Welt, stellt man fest, dass diese oft aus einer Ansammlung verschiedener Eigenschaften und Fähigkeiten besteht, die miteinander in Relation stehen. Als Programmierer sieht man sich oft mit dem Problem konfrontiert, diese Welt auf Datenstrukturen im Programm abzubilden. Meistens reichen dann einfache Variablen oder Arrays nicht aus, die komplexen Zusammenhänge korrekt darzustellen. Strukturen können hier weiterhelfen. Als Beispiel soll uns die Modellierung eines neuen Variablentyps dienen, der die Daten eines Autos widerspiegeln soll. Um ein Auto genauer zu beschreiben, reicht ein einfacher Wert nicht mehr aus. Ein Auto besitzt im allgemeinen verschiedenen Eigenschaften wie z.B. Farbe, Bauzahl, Hubraum, Hersteller usw. Mit Hilfe einer Struktur könnten wir einen Typ Auto definieren und die verschiedenen Eigenschaften als Teile des neuen Datentyps festlegen. Würden wir jetzt verschiedenen Variablen vom Typ Auto anlegen, hätten automatisch alle dieselbe Struktur. Erzeugen einer Struktur In ColdFusion wird eine Struktur mit der Funktion StructNew() erzeugt. Zur Erläuterung benutzen wir noch einmal das Beispiel Auto. Angenommen, wir hätten einen Satz von Variablen, der Informationen über ein Auto enthalten soll:
83
2 Grundlagen
Jetzt möchten wir mit einer ColdFusion-Struktur einen benutzerdefinierten Datentyp erstellen, mit dem wir viele Autos mit diesen Eigenschaften verarbeiten können. Dazu erzeugen wir zuerst mit der Funktion StructNew() eine Struktur-Variable und erzeugen die Eigenschaften, indem wir einfach einen Wert zuweisen:
#auto1.kmStand# #auto1.typ#
Der Name eines Elementes in einer Struktur wird Key genannt, vergleichbar mit dem Index eines Arrays. Über den Key lässt sich einer Struktur ein Wert zuweisen und aus ihr auslesen. Die komplette Referenzierung eines Datenfeldes in einer Struktur ist demnach der Strukturname und der Key, durch einen Punkt voneinander getrennt. Strukturen lassen sich auch als assoziative Arrays interpretieren, der Key entspricht dem Index, der eben keine Zahl, sondern ein String ist. Demzufolge ist auch eine Ansprechweise möglich, die den Arraycharakter widerspiegelt: #Auto1["kmStand"]#
Löschen und Säubern einer Struktur Nachdem eine Struktur erzeugt und mit Daten gefüllt wurde, können Sie mit der Funktion StructClear() alle gespeicherten Daten entfernen. Mit der Funktion StructDelete() können Sie ein bestimmtes Element der Struktur löschen.
84
Komplexe Variablen
Schleife über eine Struktur Bereits im Abschnitt über Schleifen haben Sie die Struktur-Schleife kurz kennengelernt. Jetzt, nachdem Sie endlich mehr über Strukturen wissen, möchten wir das Beispiel noch einmal ausführlicher aufgreifen:
#key#=#value#
Die Variable thisKey erhält bei jedem Schleifendurchgang einen Elementnamen der Struktur. Mit der Funktion StructFind(), die als Parameter den Strukturnamen und einen Keynamen erwartet, wird der Wert des zugehörigen Strukturelementes ermittelt und danach ausgegeben. Verschachteln von komplexen Variablen Elemente einer Struktur müssen aber nicht unbedingt nur einfache Datentypen sein, sie können selbst wieder Strukturen oder Arrays enthalten. Angenommen, Sie möchten ein Bücherregal in einer Datenstruktur abbilden. Das Regal besteht aus vielen Büchern, deren Anzahl Sie vorher nicht kennen. Jedes Buch soll wiederum über die Werte Seitenanzahl, Titel und Autor verfügen. Sie müssen neue Bücher hinzufügen und andere entfernen können. Oder Sie möchten z.B. alle Autoren ausgeben. Wie das ganze mit ColdFusion-Variablen aufgebaut sein könnte, soll Ihnen das nächste Beispielprogramm zeigen. Sie werden hier sehen, wie man mit einer Datenstruktur reale Objekte abbilden kann:
85
2 Grundlagen
Anzahl Bücher im Regal: #ArrayLen(regal)#
- #regal[i].titel#, Autoren: #ArrayLen(regal[i].autor)#
die meisten Seiten hat: #regal[max].titel# (#regal[max].seiten# Seiten) Anzahl Bücher im Regal: #ArrayLen(regal)#
Die Toplevel-Variable regal ist ein eindimensionales Array, das als Elemente jeweils eine Buch-Struktur enthält. Jede Buch-Struktur besteht außer dem Element für die Autoren aus einfachen Elementen. Da ein Buch nicht nur von einem einzigen Autoren stammen kann, reicht zur Speicherung der Autoren eine einfache Variable in der Buch-Struktur nicht aus. Deshalb erzeugen wir in jeder Struktur noch einmal ein Array für die Autorenliste. Wenn Sie sich das Programm näher ansehen, werden Sie feststellen, dass man sehr leicht an alle nötigen Informationen gelangt.
2.6.3
Listen
Im Kapitel 2.4.2 »Schleifen"wurde bereits die Schleife über eine Liste kurz erläutert. Wir wollen uns nun etwas ausführlicher mit dem Thema Listen in ColdFusion beschäftigen. Eine Liste besteht aus einer Reihe von Elementen, die durch ein Trennzeichen (einen Delimiter) voneinander getrennt sind. Eine gültige Liste mit einem Komma als Delimiter wäre z.B. »white,red,black«. Die Listenelemente können alle vom gleichen Typ sein, wie z.B. Integerzahlen oder Strings, sie kön-
87
2 Grundlagen
nen aber auch unterschiedlichen Typs sein. So ist auch z.B. »Peter/Müller/ 25/2/1964« eine gültige Liste mit dem Slash (/) als Trennzeichen. Sie können aber auch einen ganz normalen Satz als Liste mit einem Leerzeichen als Trennzeichen interpretieren. Hinweis: Die Listenelemente sollten NIE das Trennzeichen beinhalten! Nun ist eine Liste an und für sich nicht besonders aufregend, doch haben Sie bereits im Kapitel über Formulare gesehen, dass diese in manchen Fällen ihre Werte in Form von Kommalisten zurückliefern. ColdFusion stellt uns eine ganze Menge von Funktionen zur Verfügung, die aus einer einfachen Liste ein mächtiges Instrument machen. Das folgende Beispiel soll einen Text auf das längste Wort hin durchsuchen und die Gesamtzahl der Wörter ermitteln. Wir interpretieren den Text einfach als eine Liste mit dem Trennzeichen Punkt (.), die wiederum Listen enthält, die als Trennzeichen ein Leerzeichen enthalten. Mittels zweier einfacher Listen-Schleifen können wir so jedes Wort einzeln herausgreifen und in der inneren Schleife das längste Wort ermitteln.
88
Komplexe Variablen
Der Text enthielt #count# Worte. Das längste Wort ist: #max#
Die Ausgabe im Browser sieht dann so aus: Der Text enthielt 33 Worte. Das längste Wort ist: mitausgegeben
Wenn Sie sich den Sourcecode genau ansehen, werden Sie erkennen, wie die Indexvariable der äußeren Schleife zur Ausgangsliste für die innere Schleife wird. Eine vollständige Beschreibung aller Listen-Funktionen von ColdFusion finden Sie im Referenzteil dieses Buches.
89
3
Formulare und Form-Variablen
Über Formulare können recht praktisch Usereingaben an den Server übermittelt werden. Zum einen sind sie relativ einfach zu erstellen und zum anderen müssen keine ellenlangen URLs mit einer Vielzahl von Parametern übergeben werden. Zuerst integriert man in der aufrufenden Seite ein handelsübliches HTMLFormular. In diesen Formularen können Sie verschiedene Eingabefelder definieren, die der Besucher der Website dann ausfüllen kann. Sie können mit reinem HTML Eingabefelder für einzeilige oder mehrzeilige Texte, Auswahllisten, Checkboxen und vieles mehr definieren. Mit einem Button kann der Anwender dann die Daten zum Server schicken, auf dem sie Ihnen dann für einen leichten Zugriff zur Verfügung stehen. Einschränkungen der Datengröße oder Probleme mit Sonderzeichen wie bei URL-Parametern gibt es dabei nicht. Mit Formularen können Sie z.B. Eingabemasken für das Suchen in Datenbanken erstellen oder Loginmasken für Passwortabfragen generieren.
3.1
Aufbau von Formularen
Das Grundgerüst eines Formulars besteht aus einem -Tag-Paar. Es müssen zwei Attribute für die korrekte Funktion angegeben werden. Mit dem ACTION-Attribut benennen Sie die Datei, der die Daten gesendet werden sollen bzw. die den Request bearbeiten soll. Das wird in diesem Fall natürlich eine ColdFusion-Datei sein. Mit METHOD spezifizieren Sie die Übertragungsmethode zum Server. Dabei gibt es zwei Möglichkeiten: 왘 Mit dem Attributwert METHOD="get" werden die Daten des Formulars als
Parameter der URL zum Server hin übertragen. Das im ACTION-Attribut angegebenen ColdFusion-Template muss die Variablen dann als URLParameter ansprechen. 왘 Wenn Sie METHOD="post" verwenden, werden die Daten im HTTP-Header
des Browsers zum Server gesendet. Die Einschränkungen, die es bei URLParametern gibt, gelten hier nicht. Sie brauchen Sonderzeichen nicht zu kodieren und können unbegrenzte Datenmengen senden. Wollen Sie auf der nachfolgenden Seite FORM-Variablen verwenden, müssen Sie sogar zu METHOD="post" greifen! Zur Dateneingabe müssen innerhalb der -Tags Dateneingabefelder z.B. mit dem -Tag definiert werden. Ein Submit-Button erlaubt es dem Benutzer, das Formular abzuschicken.
91
3 Formulare und Form-Variablen
Das erste Beispiel-Formular soll eine Loginmaske mit zwei Eingabefeldern darstellen:
In die beiden Eingabefeldern können der Benutzername und das Passwort eingegeben werden. Die TYPE-Attribute spezifizieren jeweils einen speziellen Typ von Eingabefeld. Mit TYPE="text" wird ein normales einzeiliges Eingabefeld erzeugt. Mit TYPE="password" erzeugen Sie hingegen Eingabefelder, in denen die Eingaben nur als * sichtbar sind. Das letzte Eingabeelement erzeugt den Submit-Button, mit dem der Anwender das Formular abschicken kann. Mit dem VALUE-Attribut kann eine Beschriftung für den Button festgelegt werden. Die Eingabeelemente (mit Ausnahme des Submit-Buttons) müssen mit einem NAME-Attribut versehen werden, damit das im ACTION-Attribut angegebene Template die Werte als ColdFusion-Variablen mit dem Präfix FORM ansprechen kann. Nehmen wir an, der Benutzer füllt unsere Beispiel-Loginmaske aus und schickt die Daten zum Server. ColdFusion startet jetzt das Template bar.cfm und erzeugt die beiden Variablen FORM.user und FORM.pass, die den Inhalt der zugehörigen Formularelemente enthalten. Sie können die Variablen dann wie jede andere Variable auslesen. Hinweis: Sie können diesen Variablen jedoch auch neue Werte zuweisen. Wir raten aber dringend davon ab, empfangenen URL- oder FORM-Variablen manuell neue Werte zuzuweisen, da dies im Programmablauf spätestens dann zu Verwirrungen führt, wenn eine Seite debugged (von Fehler bereinigt) werden soll!! (Siehe Kapitel Fehlermeldungen und Debugging). Die Seite, die das HTML-Formular enthält, kann durchaus ein reines HTMLDokument sein, denn das Verschicken der Daten übernimmt der Browser und nicht etwa ColdFusion. Will man einen Wert übergeben, ohne dass der User ihn sehen soll, kann man ein verstecktes Formelement (TYPE="hidden") benutzen:
92
Besonderheiten bei Checkboxen und Radiobuttons
In bar.cfm können Sie dann das Ergebnis ganz normal ausgeben: id=#FORM.id#
Man kann anhand der einzelnen FORM-Variablen in ColdFusion nicht mehr erkennen, von welchem Typ Formelement der Wert stammt. Ein Wert aus einem Hidden-Feld namens »pass« sieht also genauso aus wie ein Wert aus einer Checkbox »pass« (vorrausgesetzt die Checkbox ist selektiert (angekreuzt) worden und hat denselben Value-Wert wie das Hidden-Feld). Beachten Sie aber, wenn sie Daten mit Hidden-Feldern in Formularen unterbringen, dass die Werte im HTML-Sourcecode sichtbar sind. Der Benutzer kann also die Werte trotzdem erkennen, wenn er im Browser die SourcecodeAnsicht wählt (und manche User machen so etwas tatsächlich!). Informationen, die nicht für jedermann bestimmt sind, haben dort also nichts zu suchen!
3.2
Besonderheiten bei Checkboxen und Radiobuttons
Bei einfachen Input-Feldern wie Text-Feldern oder Textareas wird immer ein Wert gesendet und die zugehörige FORM-Variable erzeugt. Wird kein Wert eingegeben, wird ein Leerstring ("") übergeben. Das ist aber nicht bei allen Eingabeelementen so. Bei Checkboxen und Radiobuttons werden nur die vom Anwender aktivierten Elemente übertragen. Sie enthalten dann die Werte, die Sie im Formular mit der Angabe des VALUE-Attributs spezifiziert haben. Sind sie nicht aktiviert, dann erfolgt auch keine Übertragung dieser Formularelemente! Es können deshalb von ColdFusion auch keine entsprechenden Variablen erzeugt werden. Damit ergeben sich also ähnliche Probleme wie bei URL-Variablen, wenn auf fehlende Variablen zugegriffen wird. Auch hier können Sie mit IsDefined() auf die Existenz einer Variablen hin vor der Benutzung überprüfen oder mit einen Defaultwert festlegen. Das folgende Formular demonstriert die Verwendung einer Checkbox: Pfad:
93
3 Formulare und Form-Variablen
Speichern:
Ist in diesem Formular die Checkbox beim Abschicken ausgewählt, ist im Template bar.cfm die Variable FORM.save="1" vorhanden, andernfalls fehlt sie. In save.cfm könnte dann z.B. dieser Auswertungscode stehen:
Wir definieren mit einen Defaultwert für die Checkbox der den Zustand unchecked (nicht markiert) kennzeichnen soll.
3.3
Mehrfachselektion mit List- und Checkboxen
Setzen Sie in einer Select-Box das HTML-Attribut MULTIPLE, kann der Benutzer dort mehrere Einträge auswählen. Da die Listbox aber nur einen Namen hat, bedeutet das, dass in der zugehörigen FORM-Variablen mehrere Werte übergeben werden müssen. Benutzen Sie eine Select-Box, in der mehrere Einträge selektierbar sind, werden bei einem Submit des Formulars die gewählten Einträge als kommaseparierte Liste übergeben. Ist kein Eintrag ausgewählt worden, existiert die FORM-Variable nicht, Sie sollten also wieder eine Prüfung mit IsDefined() einbauen oder einen Defaultwert mit einbauen. Im folgenden Beispielprogramm erzeugen wir zuerst ein Formular, das eine Listbox mit Mehrfachauswahlmöglichkeit enthalten soll. Der Benutzer kann hier mehrere Farben auswählen, die dann auf der zweiten Seite angezeigt werden sollen. colors.cfm mit Multi-Select-Box
94
Mehrfachselektion mit List- und Checkboxen
Red Black Aqua Fuchsia Navy Green Teal Listing 3.1: colors.cfm
Beachten Sie, dass im -Tag das Attribut MULTIPLE gesetzt sein muss! Das zugehörige Antwort-Template processListBox.cfm soll die ausgewählten Elemente gleich in der entsprechenden Farbe anzeigen: processListBox.cfm #color# Listing 3.2: processListBox.cfm
Zuerst definieren wir mit dem -Tag einen Defaultwert für die Listbox, denn wenn der Benutzer keine Auswahl trifft, wird auch keine FORMVariable erzeugt! Da alle ausgewählten Farbwerte als Elemente einer kommaseparierten Liste in der Variablen FORM.box übergeben werden, benutzen wir eine Listenschleife (mehr dazu im Kapitel über Schleifen), um an die einzelnen Werte zu gelangen. In der Schleife erzeugen wir einen dynamischen HTML-Code, der nicht nur den Farbwert als Text ausgibt, sondern den Text auch gleich in der entsprechenden Farbe schreibt.
95
3 Formulare und Form-Variablen
Wenn Sie einer Gruppe von Checkboxen den gleichen Namen geben, wird die getroffene Auswahl auf die gleiche Weise übertragen. Mit dem VALUE-Attribut der Checkbox können Sie den Wert festlegen, der übertragen werden soll. Dieser Wert wird auch hier nur übertragen, wenn die Checkbox angekreuzt ist. Durch die Verwendung eines einheitlichen Namens erzeugt ColdFusion wieder eine Liste mit allen aktiven Checkboxen. Der folgende HTML-Code hat dieselbe Funktionalität wie das oben beschriebene Beispiele bezüglich der Listbox: colors.cfm mit Checkboxes Red Black Aqua Fuchsia Navy Green Teal Listing 3.3: colors.cfm mit Checkboxes
Zur Bearbeitung des Requests können Sie das Template processListBox.cfm komplett übernehmen.
3.4
Die Fieldnames-Variable
Bei jedem POST-Aufruf eines ColdFusion-Templates wird durch ColdFusion eine spezielle Variable namens FORM.fieldnames angelegt, die die Namen aller im POST übermittelten Variablennamen enthält.
96
Formularvalidierung
Mit ihr können Sie dynamisch alle Wert in einer Schleife auslesen. Sie könnten z.B. einen Formular-Mailer programmieren, der Ihnen alle Formularwerte per Mail zusendet, ohne dass Sie den Mail-Code ändern müssten, wenn neue Elemente in das Formular integriert werden sollen. Wie das Ganze genau gemacht wird, werden wir Ihnen im Kapitel E-Mail zeigen. Jetzt wollen wir uns damit begnügen, die Namen und Werte in der Seite ausgeben: Form.fieldnames Folgende Parameter wurden dem Template übermittelt: Name=#idx# Wert=#evaluate(va)#
Im Script wird die Funktion evaluate() benutzt, um den Inhalt einer Variablen auszuwerten. Die Funktion wertet den Parameterstring (in diesem Fall ein Variablenname in idx) aus und gibt das Auswertungsergebnis (hier den Inhalt des übergebenen Variablennamens) zurück. Mehr zu evaluate() finden Sie am Ende des Buches in der Funktionsreferenz.
3.5
Formularvalidierung
Unter Formularvalidierung versteht man die Überprüfung eines Formulars auf unbedingt notwendige bzw. gültige Werte hin. Generell kann man zwischen serverseitiger Validierung (ausgeführt durch ColdFusion) und clientseitiger Validierung (geschieht im Browser, z.B. durch JavaScript) unterscheiden.
97
3 Formulare und Form-Variablen
3.5.1
Serverseitige Formularvalidierung
ColdFusion bietet uns die Möglichkeit, Eingaben in Formularfeldern in mehrerlei Hinsicht zu überprüfen. So ist es z.B. möglich, ein Formularfeld als required zu kennzeichnen (es ist dann ein Pflichtfeld, eine Eingabe muss vorgenommen werden) oder den Inhalt auf Zahlenwerte zu beschränken. Um ein Formularfeld zum Pflichtfeld zu machen, fügen wir ein weiteres Formularelement vom Typ hidden hinzu. Der Name dieses Elementes entspricht genau dem des zu überprüfenden Formularfeldes und wird um »_required« erweitert. Im VALUE-Attribut des neuen Elementes verwenden wir die Fehlermeldung, die ausgegeben werden soll, wenn die Pflichteingabe nicht erfolgt. Wollen wir also eine Eingabe in das Feld username erzwingen, so schreiben wir:
Klickt nun ein User auf Submit, ohne etwas in das Feld username eingegeben zu haben, wird die Actions-Seite nicht abgearbeitet, sondern es erscheint folgende Fehlermeldung:
Abbildung 3.1: Fehlermeldung nach unvollständiger Eingabe (serverseitige Validierung)
98
Formularvalidierung
Mit diesem Mechanismus sind in ColdFusion folgende Überprüfungen möglich: Überprüfung Verlangte Eingabe _date
Datum im angloamerikanischen Format: MM/TT/JJ bzw. MM/TT/JJJJ
_eurodate
Datum im »europäischen« Format: DD/MM/JJ bzw. TT/MM/JJJJ
_float
Zahl mit erlaubtem Dezimalpunkt (nicht Komma!)
_integer
Ganzzahl ohne Dezimalpunkt
_range
Bereich für Zahlenwerte. Die eingegebene Zahl muss zwischen den Grenzen liegen, die im VALUE-Attribut mit MIN=x and MAX=y angegeben werden.
_required
Eingabe erforderlich.
_time
Zeit in den üblichen Formaten
Tab. 3.1: Validierungsfunktionen für serverseitige Formularvalidierung
Die angegebenen Möglichkeiten sind natürlich nicht universell anwendbar, so sind die Datumsformate für deutsche Webseiten gänzlich ungeeignet und die Angabe von »_range« ermöglicht keine eigene Fehlermeldung, da im VALUE-Attribut des hidden-Elementes die Grenzen des erlaubten Bereiches angegeben werden müssen:
Hinweis: Überprüfungen wie _integer oder _range schließen nicht automatisch die _required-Überprüfung mit ein! Die vorgestellte Validierung ist zwar sehr bequem, aber leider weder besonders schön noch benutzerfreundlich. Das Aussehen der Fehlermeldung kann nicht beeinflusst werden und zudem ist ein »Zurück«-Link nicht realisierbar. Besser, aber auch aufwendiger, ist da auf jeden Fall eine »manuelle« Validierung, in der man die Variablen einzelnen auf ihre Gültigkeit hin überprüft.
3.5.2
Clientseitige Formularvalidierung mit
ColdFusion bietet einen recht praktischen Ersatz für das HTML-Tag an, das Tag . Die Verwendung von ist fast identisch mit der von , lediglich das Attribut METHOD="POST" braucht nicht angegeben zu werden, da dieses Attribut automatisch setzt. Selbstverständlich akzeptiert alle Attribute des -Tags. Innerhalb von können alle normalen HTML-Formularelemente verwendet werden, es können aber auch die zusätzlichen Elemente , ,
99
3 Formulare und Form-Variablen
, , , und verwendet werden. , , und sind Java-Applets, die ein eigenes
Java-Applet ins Formular einbinden können, ein Spreadsheet simulieren, in dem die Daten direkt upgedatet werden können, einen Schieberegler bzw. eine Baumstruktur grafisch darstellen. Damit diese Elemente einwandfrei funktionieren, muss im Browser Java aktiviert sein. Details zu diesen Elementen entnehmen Sie bitte der Sprachreferenz, wir wollen uns hier nur mit , und beschäftigen, da sie prinzipiell mit den »herkömmlichen« Formularelementen identisch sind, jedoch einige zusätzliche Funktionen bieten. wird von ColdFusion automatisch in ein -Tag umgewandelt, das den Aufruf einer JavaScript-Funktion zum Überprüfen der im Formular enthaltenen Elemente enthält. Aus...
wird so im Browser:
Gleichzeitig wird hier die JavaScript-Funktion _CF_checkmyForm() erzeugt, die die einzelnen Formularelemente abfragen kann. Anstelle eines -Feldes können wir innerhalb von das -Tag verwenden. akzeptiert neben den Attributen des HTMLTags folgende zusätzliche Attribute: 왘 message="Text" – Meldung die ausgegeben wird, falls die Überprüfung des
Feldes einen Fehler ergibt. 왘 required="Yes/No" – Ist das Feld ein Pflichtfeld (required="Yes")? 왘 validate="Format" – Prüft den Feldinhalt auf folgende Kriterien hin: 왘 date – Datum im US-Format: MM/TT/JJJJ 왘 eurodate – Datum im europäischen Format: TT/MM/JJJJ. 왘 time – Zeit im Format hh:mm:ss 왘 float – Fließkommazahl 왘 integer – Ganzzahl 왘 telephone – Telefonnummer im US-Format ###-###-####. Der Trenn-
strich kann durch Leerzeichen ersetzt werden. Area code und Exchange müssen mit einer Zahl zwischen 1 und 9 beginnen. 왘 zipcode – Postleitzahl im US-Format Es kann eine fünf- oder neunstel-
lige US-Postleitzahl im Format #####-#### eingegeben werden. Der Trennstrich kann durch ein Leerzeichen ersetzt werden.
100
Formularvalidierung
왘 creditcard – Leerstellen und Striche werden entfernt und die Nummer
nach dem MOD10-Algorithmus wird auf Echtheit hin überprüft. 왘 social_security_number – US-Sozialversicherungsnummer im Format
###-##-####. Die Trennstriche können durch Leerzeichen ersetzt werden. 왘 range="Minimum, Maximum" – Der eingegebene Wert muss zwischen den
angegebenen Minimum- und Maximum-Werten liegen. 왘 onValidate="JS-Funktion" – Benennt eine JavaScript-Funktion die die Über-
prüfung durchführt. Kann alternativ zu validate gebraucht werden. 왘 onError="JavaScript-Funktion" – Benennt eine JavaScript-Funktion, die aus-
geführt werden soll, falls die Validierung fehlschlägt. 왘 passthrough="HTML-Attribute" – Weitere HTML-Attribute, die verwendet
werden sollen. Haben wir z.B. ein Eingabefeld username, in das der User unbedingt seinen Namen eingeben soll, so würden wir schreiben
Gibt der User nun nichts in das Feld ein, so erscheint beim Klick auf den Submit-Button eine Fehlermeldung:
Abbildung 3.2: Fehlermeldung nach unvollständiger Eingabe (clientseitige Validierung)
101
3 Formulare und Form-Variablen
Hinweis: Bei muss dem Element immer ein Name gegeben werden, da die JavaScript-Funktion ansonsten nicht funktioniert! Für europäische bzw. deutsche Anwendungen dürften die Optionen des validate-Attributes, die auf US-Formate ausgelegt sind, nicht besonders hilfreich sein. Allerdings sind die Prüfungskriterien time, float und integer schon sehr nützlich. In Kombination mit required="yes" und range="Minimum, Maximum" können uns diese Attribute im Vergleich zu einem mit erstellten Formular sehr viel Schreibarbeit sparen. Wer schon einmal eine JavaScript-Funktion zur Überprüfung eines längeren Formulares geschrieben hat, wird wissen, was wir meinen, denn für komplexe Formulare wachsen solche Funktionen schnell auf u.U. einige Dutzend Programmzeilen JavaScript-Code an. bietet zur Validierung der Eingabe die gleichen Möglichkeiten wie . Allerdings handelt es sich bei um ein Java-App-
let, das die Verwendung zusätzlicher Parameter für die Schriftart erlaubt. Um z.B. die Eingabe mit Font Comic Sans MS in der Größe 20pt, in der Farbe Weiß auf rotem Hintergrund und zudem noch fett und kursiv darzustellen, würde man schreiben:
Das Ergebnis dieser ungewöhnlichen Darstellung sehen Sie in der folgenden Abbildung. Hinweis: Da ein Java-Applet verwendet, funktioniert es nur bei Browsern, die Java unterstützen und in denen es auch aktiviert wurde!
102
Formularvalidierung
Abbildung 3.3: Verwendung von
kann innerhalb von das normale -Tag ersetzen. Es bietet auch wieder die schon von bekannten Attribute REQUIRED
und MESSAGE zur Validierung an, hat aber darüber hinaus noch große Vorteile, wenn man eine Selectbox mit den Ergebnissen einer Query füllen will. Nehmen wir an, wir hätten eine Datenbankabfrage mit dem Namen qryGetKategorien durchgeführt, die uns die IDs und die Bezeichnungen von verschiedenen Kategorien zurückgibt und wollten die Ergebnisse dieser Abfrage nun in einer Select-Box präsentieren. Die ID soll im VALUE-Attribut des jeweiligen Option-Tags angegeben, die Bezeichnung soll als Optionstext ausgegeben werden. Zusätzlich soll die Kategorie mit der ID 5 selektiert werden. (Details und Hinweise zu Datenbankabfragen entnehmen Sie bitte dem Kapitel Datenbankzugriff). Der herkömmliche Code für ein derart aufgebautes Selectfeld wäre dieser: #qryGetKategorien.Bezeichnung#
Einfacher geht es mit :
103
3 Formulare und Form-Variablen
Auch dieses ColdFusion-Tag hilft, komplexen Code zu vereinfachen und Aufwand zu reduzieren.
3.5.3
Serverseitige Validierung oder doch clientseitig?
Beide Methoden haben ihre Vor- und Nachteile. Der große Vorteil der serverseitigen Validierung ist der, dass die Überprüfung browserunabhängig ist. Sie funktioniert auch bei Browsern, die kein JavaScript verstehen oder bei denen JavaScript deaktiviert wurde. Nachteilig wirkt sich aus, dass die Validierung erst nach dem Absenden des Formulars geschieht. Tritt ein Fehler auf, muss der User zurückgehen und alle Eingaben noch einmal vornehmen. Bei der clientseitigen Validierung ist es genau anders herum: Die Validierung geschieht VOR einem Absenden des Formulars, funktioniert aber nur mit Browsern, die JavaScript verstehen und bei denen es auch aktiviert wurde. Um ganz sicher zu gehen, sollte man also stets beide Möglichkeiten implementieren. Die für den User komfortable clientseitige Validierung und zusätzlich die serverseitige Validierung, falls der User einen ganz exotischen Browser benutzt oder JavaScript deaktiviert hat.
104
4
Datenbankzugriff
Das wohl leistungsfähigste und am häufigsten benötigte Feature in ColdFusion ist die Möglichkeit des Zugriffs auf die unterschiedlichsten Datenbanken. Sollten Sie schon seit längerem mit Datenbanken arbeiten und bereits SQL-Anweisungen erstellt haben, wird das nächste Kapitel für Sie weniger interessant sein. Sie können es getrost überspringen. Allen anderen Lesern wird empfohlen, die nachstehenden Datenbankgrundlagen gründlich zu lesen, bevor Sie mit dem ColdFusion-Zugriff auf Datenbanken beginnen.
4.1
Wozu Datenbanken im Internet
Sie können mit ColdFusion sehr leicht dynamische Webseiten erstellen. Dynamisch bedeutet, dass eine Seite, in diesem Fall ein ColdFusion-Template, für verschiedene Besucher oder zu verschiedenen Zeitpunkten in Abhängigkeit von bestimmten Bedingungen unterschiedlich aussieht. Diese Bedingungen können, wie schon gezeigt, Parameter sein. Viel interessanter und zudem leistungsfähiger ist es aber, das Aussehen und/ oder den Inhalt einer Webseite durch Datensätze aus einer Datenbank zu steuern. Sie können so z.B. leicht einen Online-Shop, ein Forum oder ein Redaktionssystem realisieren. Stellen Sie sich vor, Sie möchten einen Online-Shop programmieren. Ihnen liegt eine Liste von verschiedenen Produkten vor, jedes mit einem Preis, einer Beschreibung und einem Titel. Zu jedem Artikel gibt es eine Detailansicht. Naturbedingt ändert sich die Liste regelmäßig, denn Produkte werden verkauft und neue werden in das Sortiment aufgenommen. Die Produktliste als statische HTML-Seite anzulegen wäre zwar möglich, die notwendige Pflege mit einem HTML-Editor erweist sich jedoch als übersaus mühselig, und das erst recht, wenn man bedenkt, dass man für die Detailansicht eines jeden Artikels eine weitere Seite erstellen müsste. Ganz zu schweigen von anderen Widrigkeiten: Ist ein Artikel ausverkauft, müssen Sie die HTML-Seite für die Produktliste ändern und die HTML-Seite für die Detailansicht löschen. Wird das Sortiment um einen neuen Artikel erweitert, müssen Sie erneut die Produktliste ändern und eine neue Seite für die Detailansicht anlegen.
105
4 Datenbankzugriff
Sollten Sie nichts besseres zu tun haben, mag Ihnen das als eine praktikable Lösung erscheinen. Wenn Sie aber irgendwie das Gefühl haben, dass irgendeine zweckmäßigere Lösung erstrebenswert und auch realisierbar sein müsse, sind Sie auf dem besten Weg, ein guter Programmierer zu werden. Der geschilderte Fall ist für eine Datenbanklösung geradezu prädestiniert. Hier ist es besser, die Zeilen der Produktliste als Datensätze in einer Datenbank abzulegen. Ruft ein Site-Besucher das ColdFusion-Template für die Produktliste mit seinem Browser auf, werden die aktuell vorhandenen Artikel aus der Datenbank ausgelesen und dem Besucher angezeigt. Wählt der Besucher die Detailansicht eines Artikels, werden durch eine weiteres Template die Detaildaten des ausgewählten Artikels aus der Datenbank geholt und ihm präsentiert. Alles was Sie (oder der Betreiber des Onlineshops) tun müssen, um die Produktliste im Onlineshop aktuell zu halten, ist, die Datensätze in der Datenbank zu pflegen. Kommt ein neuer Artikel ins Sortiment, legen Sie einen neuen Datensatz für den Artikel an und im selben Moment ist der Artikel auf der Shop-Homepage sichtbar. Ist ein Artikel ausverkauft, löschen Sie einfach den Artikel aus der Datenbank, und schon ist er aus der Produktliste verschwunden. Die Verwaltung und Präsentation großer Datenmengen wird also durch Datenbanken erleichtert. In den nächsten Kapiteln werden Sie lernen, wie Sie das alles mit ColdFusion realisieren können.
4.2
Relationale Datenbanken
Bevor wir jedoch beginnen können, Datenbanken in ColdFusion zu nutzen, soll das Konzept und der Aufbau von Datenbank-Systemen für ein besseres Verständnis kurz erläutert werden. Dabei gehen wir nur auf die so genannten »relationalen Datenbanksysteme« ein, denn diese sind die derzeit am häufigsten eingesetzten Datenbanken, und Sie werden in der Praxis auch hauptsächlich mit solchen Systemen in Berührung kommen. Wer bereits mit relationalen Datenbanksystemen zu tun hatte, wird hier wenig neues finden und kann diesen Abschnitt guten Gewissens überspringen. Eine Datenbank ist eine Sammlung zusammenhängender Daten. Zur Verwaltung und Nutzung der in ihr gespeicherten Daten wird eine Software benötigt, die Datenbank-Management-System (DBMS) genannt wird, im Falle von relationalen Datenbanken auch relationales Datenbank-Management-System (RDBMS). In einer relationalen Datenbank werden die Daten in zweidimensionalen Tabellenstrukturen angelegt, die in Beziehung (Relationen) zueinander stehen.
106
Relationale Datenbanken
Am Beispiel einer Mitarbeiterdatenbank einer Firma wollen wir das einmal anschaulich werden lassen. Datenbank firma Tabelle: mitarbeiter mit_id
name
vorname
Gehalt
abt_id
geschlecht
1
Müller
Klaus
4500
3
m
2
Schmidt
Norbert
6500
2
m
3
Schneider
Sabine
3800
1
w
4
Meier
Markus
600
2
m
5
Schwarz
Nina
6700
3
w
6
Stamm
Bernd
7500
3
m
Tabelle: abteilung abt_id
Abteilungsname
1
Verwaltung
2
Management
3
Lager
Die Datenbank firma besteht aus den Tabellen abteilung und mitarbeiter. Jede Tabelle enthält eine Gruppe gleicher Informationen, die in mehreren Zeilen und Spalten angeordnet sind. Die Tabelle mitarbeiter beispielsweise enthält Informationen über Mitarbeiter. Jede Zeile entspricht daher einem konkret existierenden Mitarbeiter. Dieser Datensatz beschreibt die Person durch Name, Vorname, Geschlecht, Gehalt usw. Die Informationen, die zu einem Mitarbeiter nötig sind, werden in den verschiedenen Spalten untergebracht. Alle Namen der einzelnen Mitarbeiter werden also in der Spalte name gespeichert, die Vornamen entsprechend in der Spalte vorname usw. Die Spaltenbezeichnungen einer Tabelle werden auch als Attribute bezeichnet. In der Tabelle abteilung werden die vorhandenen Abteilungen als eigene Informationseinheiten erfasst. Zur Beschreibung einer Abteilung sind hier nur die Abteilungsnummer und der Abteilungsname als Spalten (Attribute) festgelegt. Man kann somit leicht jeden Mitarbeiter einer Abteilung zuordnen, indem man in jedem Mitarbeiterdatensatz eine Abteilungsnummer (abt_id) festlegt.
107
4 Datenbankzugriff
Da in einer Abteilung mehrere Mitarbeiter vorhanden sind, ist es in solch einem Fall üblich (und entspricht auch einem guten Datenbankdesign) die Abteilungen als eigenständige Tabelle anzulegen. Pro Zeile der Tabelle mitarbeiter wird also eine in der realen Welt vorhandene Person und pro Zeile der Tabelle abteilung eine in der Firma vorhandene Abteilung beschrieben. Man sagt, in der Tabellenzeile wird eine Entität abgebildet. Übersetzen lässt sich Entität etwa mit »Dasein«, da mit jeder Tabellenzeile durch ihre Attribute ein Objekt der Wirklichkeit oder aber Vorstellung abgebildet wird. Wenn Sie Fachbücher zum Thema Datenbanken lesen, werden Sie sicherlich auf den Begriff Tupel stoßen. Der Begriff Tupel stammt ursprünglich aus der Mathematik und bezeichnet ein geordnetes Paar von Zahlen, das durch eine Verknüpfungsregel in einer bestimmten Relation zueinander steht. Übertragen auf die Tabellen einer Datenbank, stellen die Attribute einer Zeile die Elemente eines Tupels dar. Damit jede Zeile einer Tabelle eindeutig von den anderen Zeilen unterschieden werden kann, wird ein Schlüsselattribut (id) eingeführt. In der Tabelle mitarbeiter ist dies die Spalte mit_id, in der Datenbankwelt auch Primärschlüssel der Tabelle genannt. Der Primärschlüssel muss stets eindeutig sein. Dadurch ist gewährleistet, dass es nicht mehrere übereinstimmende Zeilen in einer Tabelle gibt. Der Primärschlüssel identifiziert ein Objekt eindeutig. Dadurch eignet er sich als Zugriffs- und Verbindungsschlüssel. In der Tabelle abteilung ist die Spalte abt_id der Primärschlüssel. Die Verknüpfung zwischen Mitarbeiter und Abteilung kann jetzt über die Abteilungsnummer abt_id hergestellt werden. Bei Schlüsseln unterscheidet man zwischen Primär- und Fremdschlüsseln. Ein Fremdschlüssel ist ein Schlüssel, der Primärschlüssel in einer anderen Tabelle ist und somit auf eine andere Tabelle verweist. Er stellt die Beziehungen zu der anderen Tabelle her. In der Tabelle mitarbeiter ist abt_id der Fremdschlüssel. Der Primärschlüssel der Tabelle mitarbeiter verweist auf keine weitere Tabelle. Seine einzige Aufgabe ist es, für die Eindeutigkeit der Tabellenzeilen zu sorgen. Wie bereits beschrieben, werden in den Spalten die einzelnen Daten als Teil einer Zeile abgelegt. Dabei muss noch erwähnt werden, dass jede Spalte einer Tabelle einen speziellen Datentyp repräsentiert. Der Name beispielsweise ist in unserem Beispiel als String-Typ (Zeichenkette) angelegt, während der Primärschlüssel und das Gehalt vom Typ Integer (Ganzzahl) sind.
108
SQL
Auch wenn in ColdFusion Datentypen kaum eine Rolle spielen, bei der Datenbankprogrammierung hingegen werden Datentypen sehr wichtig. Welche Datentypen genau in einer Datenbank angelegt werden können, hängt stark vom eingesetzten Datenbankprodukt ab (z.B. Access, MSSQL-Server, Oracle usw.). Alle Datenbanken verfügen aber über einige gemeinsame Grunddatentypen, die jedoch nicht immer den gleichen Namen tragen. Hier sollte man einfach in der Dokumentation nachschauen. Die folgende Tabelle zeigt einige der wichtigsten Datentypen, die Sie bei der Entwicklung von datenbankgestützten Websites benötigen werden. Datentyp
Inhalt
Einsatzmöglichkeit
String
Text unterschiedlicher Länge
Namen, Beschreibungen, IP-Adressen, URLs
Integer
positive und negative Ganzzahlen
Alter, Schlüsselwerte
Float
Fließkommazahlen
Artikelpreis, Gewicht
Binary
Binäre Daten
Bilder, Sounddaten
Datetime
Datum und Uhrzeit
Zeitmarken, Geburtsdatum
Wenn Sie mehr über das relationale Datenbankmodell wissen und Datenbanken intensiver einsetzen wollen, sollten Sie sich unbedingt ein gutes Buch zu diesem Thema besorgen. Im Anhang finden Sie einige Empfehlungen.
4.3
SQL
SQL (Structured Query Language) ist die Standardabfragesprache für relationale Datenbanken. Sie ist eine datenbank- und plattformunabhängige Sprache und wird von nahezu jedem RDBMS unterstützt. Die ersten Versuche wurden in den IBM-Laboratorien Ende der 70er mit einer Abfragesprache für das damalige RDBMS DB2 durchgeführt. Daraus ist der Vorgänger SEQUEL entstanden, der dann später zu SQL weiterentwickelt und standardisiert wurde. Es gelten dabei die von den Organisationen ISO (International Organisation for Standardization – Internationale Organisation zur Standardisierung) und ANSI (American National Standards Institute) Konventionen, an die sich die Hersteller von DBMS bei der Implementierung der SQL-Syntax mindestens halten müssen. Der aktuelle Standard ist ANSI92. Über diesen Standard hinaus werden von vielen Herstellen Zusatzfunktionen und Erweiterungen implementiert, um die Bedienung komfortabler zu machen und das System zu einem mächtigen Werkzeug werden zu lassen.
109
4 Datenbankzugriff
SQL wird in der Regel dazu benutzt, Informationen aus der Datenbank zu gewinnen oder Informationen in der Datenbank zu bearbeiten. Damit sind seine Möglichkeiten lange nicht erschöpft, denn Sie können damit auch Tabellen oder ganze Datenbanken erstellen, Strukturen ändern oder die komplette Datenbank administrieren. Das soll Sie aber nicht abschrecken, denn für den Einstieg reichen ein paar Grundkenntnisse völlig aus. Ohne diese Grundkenntnisse in SQL können Sie allerdings Datenbanken in ColdFusion nicht benutzen. Deshalb werden wir auf den nächsten Seiten versuchen, Ihnen die wichtigsten Befehle zur Ausgabe und Manipulation von Daten zu erläutern. Als Beispieldatenbank benutzen wir wieder die bereits bekannte Datenbank firma. Erfahrene Datenbankbenutzer können auch dieses Kapitel auslassen.
4.3.1
Daten mit SELECT ausgeben
Datenbankabfragen (Queries) zur Ausgabe von Daten werden mit der Anweisung SELECT ausgeführt. Die einfachste Form sieht z.B. so aus: SELECT * FROM mitarbeiter
Als Ergebnis erhalten Sie alle Spalten und Zeilen der Tabelle mitarbeiter: mit_id name vorname gehalt abt_id geschlecht ----------------------------------------------------------1 Müller Klaus 4500 3 m 2 Schmidt Norbert 6500 2 m 3 Schneider Sabine 3800 1 w 4 Meier Markus 6000 2 m 5 Schwarz Nina 6700 3 w 6 Stamm Bernd 7500 3 m
Die Anweisung wird mit dem Schlüsselwort SELECT eingeleitet. Diesen SELECT folgen die Namen der auszugebenden Spalten oder ein * für alle Spalten der Tabelle angegeben. Hinter dem Schlüsselwort FROM wird die Tabelle angegeben, aus der die Daten gelesen werden sollen. Dabei unterscheidet SQL hinsichtlich der Spalten, Tabellennamen und Anweisungen nicht zwischen Groß- und Kleinschreibung Auch Zeilenumbrüche und Leerzeichen spielen keine Rolle, so dass Sie umfangreiche Anweisungen lesbar formatieren können. Die folgende SQLAnweisung ist also ebenfalls gültig und liefert uns wiederum die ganze Tabelle mitarbeiter: Select * FROM mitarbeiter
110
SQL
Und hier direkt die Ausnahme zur Regel: Manche Datenbanksysteme unterscheiden bei den Namen von Tabellen oder Spalten durchaus zwischen Großund Kleinschreibung. Falls Sie Ihre Tabelle Mitarbeiter genannt haben und einen Fehler in der Art Object not found als Ergebnis erhalten, sollten Sie anfangen, bei Ihren SQL-Statements auf Groß- und Kleinschreibung bei den Namen zu achten. Im Übrigen zeugt es von gutem Programmierstil, in der SQL-Anweisung die Namen genau so zu schreiben, wie sie in der Datenbank definiert worden sind. In vielen Fällen werden nur die Werte aus bestimmten Spalten benötigt. Mit der Auflistung der gewünschten Spalten wird die Ausgabe auf die namentlich genannte Spalten beschränkt. Die folgende Anweisung liefert nur die Vorund Nachnamen der Mitarbeiter: SELECT vorname, name FROM mitarbeiter
Mit der Ausgabe aller Tabellenzeilen ist uns jedoch zumeist wenig geholfen. Über die WHERE-Klausel können Ergebnismengen auf bestimmte Zeilen beschränkt werden. Damit ist es beispielsweise möglich, alle Mitarbeiter auszugeben, die in der Abteilung Management (abt_id=2) arbeiten: SELECT vorname , name FROM mitarbeiter WHERE abt_id=2
Die Bedingung wird eingeleitet durch das Schlüsselwort WHERE. Darauf folgt der Bedingungsausdruck, der folgendermaßen aufgebaut sein muss: Spaltenname Vergleichsoperator Vergleichswert Vergleichsoperatoren sind Symbole für den durchzuführenden Vergleich. Die wichtigsten Vergleichsoperatoren in SQL sind: Operator
Bedeutung
=
Gleich, überprüft Spalte auf einen bestimmten Wert hin
Größer
Ungleich
>=
Größer gleich