143 107 9MB
German Pages 371 Year 2008
AJAX Frameworks
Open Source Software wird gegenüber kommerziellen Lösungen immer wichtiger. Addison-Wesley trägt dieser Entwicklung Rechnung mit den Büchern der Open Source Library. Administratoren, Entwickler und User erhalten hier professionelles Know-how, um freie Software effizient einzusetzen. Behandelt werden sowohl Themen wie Betriebssysteme, Netzwerke und Sicherheit als auch Programmierung. Eine Auswahl aus unserem Programm: Dieses Buch bietet eine praktische Einführung in die Arbeit mit Eclipse und zeigt zunächst, wie man mit Eclipse eigene Applikationen schnell und effizient erstellen kann. Darüber hinaus führt Sie dieses Buch systematisch in die UML ein und weist dementsprechend eine durchgängige UML-Notation auf. Ebenso erfahren Sie alles Grundlegende über Java und die erweiterten Konzepte dieser Programmiersprache. Das Buch wendet sich an sämtliche Java-Programmierer – vom Studierenden bis hin zum Profi –, die Eclipse und dessen Plug-ins einsetzen möchten. Kenntnisse in Java und in der objektorientierten Programmierung werden hierfür vorausgesetzt.
Eclipse in der Java-Entwicklung Patrick Kiwitter 336 Seiten Euro 34,95 (D), 36,00 (A) ISBN 978-3-8273-2490-0
Der erste und kleinere Teil des Buches ist ein Ajax-Crashkurs – hier frischen Sie Ihr Wissen zu Prototype, JSON, XML, XSLT sowie objektorientiertem JavaScript auf und lernen die AjaxToolkits Dojo, Prototype, jQuery und DWR kennen. Im zweiten Teil zeigen Ihnen die Autoren Best Practices zu Ereignisbehandlung, Eingabevalidierung, Drag & Drop, Zustandsverwaltung, komplexen Navigationslösungen und zur Behebung von Latenzproblemen. Sie setzen Dojo, Prototype, jQuery und DWR und die offenen Web-APIs von Yahoo!, Google und Flickr im Zuge einzelner Beispielprojekte ein und nutzen das Gelernte schließlich für die Entwicklung einer komplexen Mashup-Anwendung.
Ajax in practice Dave Crane, Bear Bibeault, Jord Sonneveld 552 Seiten 49,95 (D), 51,40 (A) ISBN 978-3-8273-2596-9
Ralph Steyer
AJAX Frameworks RIAs mit Dojo & Co
An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam
Bibliografische Information der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
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.
Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben, die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt. Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das ® Symbol in diesem Buch nicht verwendet.
Umwelthinweis: Dieses Produkt wurde auf chlorfrei gebleichtem Papier gedruckt. Um Rohstoffe zu sparen, haben wir auf Folienverpackung verzichtet.
10 9 8 7 6 5 4 3 2 1 10 09 08
ISBN 978-3-8273-2728-4
© 2008 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: Marco Lindenbeck, webwo GmbH ([email protected]) Lektorat: Brigitte Alexandra Bauer-Schiewek, [email protected] Korrektorat: Petra Kienle Fachlektorat: Dirk Louis Herstellung: Monika Weiher, [email protected] Satz: Reemers Publishing Services GmbH, Krefeld (www.reemers.de) Druck: Bosch Druck, Ergolding Printed in Germany
Inhaltsübersicht Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2
Die Welt von AJAX – zentrale Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
3
Das YUI – Yahoo User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
4
Das Dojo-Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
5
Prototype + Scriptaculous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
A
Anhang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Inhaltsverzeichnis 1
Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
1.1 Was behandelt dieses Buch? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.1.1
Das YUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.1.2
Das Dojo Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.1.3
Prototype + Scriptaculous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.1.4
Weitere Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
1.2 Schreibkonventionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.3 Wer ich bin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.4 Wer sind Sie? – der Versuch einer Zielgruppendefinition . . . . . . . . . . . . 24 1.4.1
Für wen lohnen sich eigentlich AJAX-Frameworks? . . . . . . . . . . . . . . . .
25
1.4.2
Wie sieht also die Zielgruppe des Buchs aus? . . . . . . . . . . . . . . . . . . . .
25
1.5 Was benötigen Sie? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.5.1
Hardware und Betriebssystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
1.5.2
Die Frameworks bzw. Toolkits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.5.3
Die Browser-Armada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.5.4
Betriebssysteme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
1.5.5
Der Webserver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
1.5.6
Die Entwicklungstools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
1.5.7
Firefox zur IDE für die Webentwicklung ausbauen . . . . . . . . . . . . . . . . .
35
1.5.8
Aptana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
1.6 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2
Die Welt von AJAX – zentrale Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.1 Das WWW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.1.1
Clientseitige Webprogrammierung als erste Optimierung . . . . . . . . . .
45
2.1.2
Rückverlagerung auf den Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
2.1.3
Der Status quo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
2.1.4
Das Konzept von AJAX und das Web 2.0 . . . . . . . . . . . . . . . . . . . . . . . . .
47
2.2 Die Kerntechniken von AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.2.1
HTML und XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
2.2.2
Das Prinzip der Fehlertoleranz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
2.2.3
JavaScript & Co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
2.2.4
DOM und der Zugriff auf Elemente einer Webseite . . . . . . . . . . . . . . . .
54
Inhaltsverzeichnis
2.2.5
Stylesheets und DHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
2.2.6
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
2.2.7
JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
2.3 Come together right now – AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 2.3.1
Datenübertragung per HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
2.3.2
Details zum XMLHttpRequest-Objekt . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
2.3.3
Exemplarischer Ablauf einer AJAX-Anfrage . . . . . . . . . . . . . . . . . . . . . . .
81
2.3.4
Praktische AJAX-Beispiele – von Hand . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
2.4 Wie positionieren sich AJAX-Frameworks und Toolkits? . . . . . . . . . . . . . 88 2.4.1
Lösung klassischer AJAX-Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
2.4.2
AJAX-Frameworks und -Toolkits – nur Mogelpackungen? . . . . . . . . . . .
93
2.4.3
Welche Ansätze gibt es für Frameworks und Toolkits und wie geht man damit als Entwickler um? . . . . . . . . . . . . . . . . . . . . . . . . . .
94
2.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 3
Das YUI – Yahoo User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.1 Was ist das YUI? – ein Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.1.1
Die offiziell unterstützten Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
3.2 Die YUI-Webseite und der Download . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 3.3 Die Bestandteile des YUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 3.3.1
Die Struktur der YUI-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
3.4 Die konkrete Anwendung des YUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.4.1
Wie gehen Sie beim Einstieg am besten vor? . . . . . . . . . . . . . . . . . . . . . 106
3.5 First contact – die DOM Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 3.5.1
Die Einbindung der DOM Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.5.2
Die Anwendung der DOM Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.5.3
Ein erstes Beispiel mit der DOM Collection . . . . . . . . . . . . . . . . . . . . . . . 112
3.6 Das Event Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 3.6.1
Die Einbindung der Event und Custom Event Utilities . . . . . . . . . . . . . . 117
3.6.2
Die Anwendung der Event und Custom Event Utilities . . . . . . . . . . . . . . 118
3.6.3
Ein vollständiges Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.6.4
Wozu das Event Utility? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.7 Die Möglichkeiten der YUI Library Utilities . . . . . . . . . . . . . . . . . . . . . . . . 123 3.7.1
Drag&Drop mit dem YUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
3.7.2
Anpassen des Originalbeispiels für eigene Zwecke . . . . . . . . . . . . . . . . 124
3.8 Der Connection Manager und die AJAX-Funktionalität des YUI . . . . . . . . 131 3.8.1
8
Die Einbindung der notwendigen Ressourcen . . . . . . . . . . . . . . . . . . . . . 131
Inhaltsverzeichnis
3.8.2
Die Initiierung einer asynchronen Transaktion unter Verwendung des Connection Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
3.8.3
Asynchrone Transaktionen und das Callback-Objekt . . . . . . . . . . . . . . . 133
3.9 Das JSON Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 3.9.1
Das JSON Utility verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
3.9.2
Anwenden des JSON Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
3.9.3
Ein vollständiges AJAX-Beispiel mit JSON . . . . . . . . . . . . . . . . . . . . . . . . 141
3.9.4
Verwandeln von JavaScript-Daten in einen JSON-String . . . . . . . . . . . . 144
3.10 Eine Übersicht über wichtige Komponenten des YUI Library Control/Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 3.11 Kontrollieren, Überwachen und Optimieren Ihrer YUI-RIA . . . . . . . . . . . 147 3.11.1
Der YUI Compressor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
3.11.2
Der YUI Configurator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
3.11.3
Kontrolle und Überwachung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
3.11.4
Der LogReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
3.12 Die –debug-Versionen der YUI-Komponenten . . . . . . . . . . . . . . . . . . . . . 159 3.13 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 4
Das Dojo-Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.1 Was ist das Dojo Toolkit? – ein Überblick . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.1.1
Die Build Tools und das Paketsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.1.2
Die drei Säulen von Dojo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.2 Die offiziell unterstützten Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 4.3 How do I get this? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 4.3.1
Download des Dojo Toolkits oder direkte Einbindung aus dem Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
4.3.2
Extrahieren = Installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
4.3.3
Die Datei dojo.js – die Verwaltungszentrale . . . . . . . . . . . . . . . . . . . . . . 171
4.3.4
Konfiguration von Dojo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
4.3.5
Test the West – die Datei runTests.html . . . . . . . . . . . . . . . . . . . . . . . . . 173
4.4 Der Einstieg ins Geschäft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 4.5 Das Grundgerüst einer Dojo-Applikation . . . . . . . . . . . . . . . . . . . . . . . . . 178 4.6 Die require()-Methode und das Dojo-Paketsystem . . . . . . . . . . . . . . . . . 179 4.6.1
Namensräume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
4.6.2
Die Liste der verfügbaren Widgets und der zugehörigen Module sowie die API-Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . . 183
4.6.3
Schutz des DOM – die Methode dojo.addOnLoad() . . . . . . . . . . . . . . . . 184
9
Inhaltsverzeichnis
4.7 Der Dojo-Typ und das gerenderte Widget . . . . . . . . . . . . . . . . . . . . . . . . 185 4.7.1
Das Basiselement für dojoType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
4.8 Ein erstes Beispiel mit Dojo-Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 4.9 Das Dijit – Dojo Widget Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 4.9.1
Ein genauerer Blick auf das Dijit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
4.9.2
Eine Übersicht zu Dijit-Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
4.9.3
Ein paar weitere Dijit-Widgets in vollständigen Beispielen . . . . . . . . . . 195
4.10 Die Verbindung zwischen einem Ereignis und dem Widget – das Dojo-Eventsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 4.10.1
Innere Ereignisbehandlung mit dem Dojo-Eventsystem . . . . . . . . . . . . . 199
4.10.2 Dojo-Ereignisse verbinden – dojo.connect() . . . . . . . . . . . . . . . . . . . . . . 199 4.10.3 Mehrere Ereignisse verknüpfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
4.11 Layout mit dem Dijit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 4.11.1
HTML und Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
4.11.2
Das Dijit-Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
4.11.3
Die prinzipielle konzeptionelle Erstellung eines Dijit-Layouts . . . . . . . . 211
4.11.4
Ein vollständiges Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
4.11.5
Ein weiteres Beispiel zum Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
4.12 AJAX und Daten vom Server lesen – XHR . . . . . . . . . . . . . . . . . . . . . . . . . 219 4.12.1
Die Callback-Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
4.12.2 Die Fehlerfunktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 4.12.3 Eine gemeinsame Behandlungsfunktion . . . . . . . . . . . . . . . . . . . . . . . . . 221 4.12.4 Mit handleAs unterschiedlich die Antwort interpretieren . . . . . . . . . . . . 221 4.12.5 Ein vollständiges Beispiel mit einer AJAX-Anfrage . . . . . . . . . . . . . . . . . 222 4.12.6 Weitere AJAX-Beispiele – Daten zum Server senden . . . . . . . . . . . . . . . . 227 4.12.7 Synchrone Ausführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
4.13 DOM-Abfragen mit dojo.query() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 4.13.1
Zugriff auf ein DOM-Element über die ID . . . . . . . . . . . . . . . . . . . . . . . . . 234
4.13.2 Zugriff auf DOM-Elemente über die CSS-Klasse . . . . . . . . . . . . . . . . . . . 235 4.13.3 Ereignisse in Verbindung mit dojo.query() . . . . . . . . . . . . . . . . . . . . . . . 236
4.14 Animationen mit Dojo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 4.14.1
Ein Grundgerüst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
4.14.2 Die Klasse dojo._Animation und die play()-Methode . . . . . . . . . . . . . . . 242 4.14.3 Basisanimationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 4.14.4 dojo.fx zur Ergänzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 4.14.5 Kombination mit anderen Multimedia-Techniken . . . . . . . . . . . . . . . . . . 251
10
Inhaltsverzeichnis
4.14.6 Animationsereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 4.14.7 Animationen in Verbindung mit dojo.query() . . . . . . . . . . . . . . . . . . . . . 257
4.15 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 5
Prototype + Scriptaculous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 5.1 Download und Verwendung von Prototype . . . . . . . . . . . . . . . . . . . . . . . 262 5.1.1
Die unterstützten Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
5.1.2
Der Einstieg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
5.2 Shortcuts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 5.2.1
$( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
5.2.2
$$() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
5.2.3
$F( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
5.2.4
$A() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
5.2.5
$H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
5.2.6
$R( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
5.2.7
$w( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
5.2.8
Try.these( ) – Ausnahmebehandlung mit Prototype . . . . . . . . . . . . . . . . 274
5.2.9
document.getElementsByClassName( ) . . . . . . . . . . . . . . . . . . . . . . . . . . 274
5.3 Prototype und AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 5.3.1
AJAX-Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
5.4 Class zum Erstellen von Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 5.4.1
create( ) und addMethods( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
5.4.2
$super( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
5.4.3
Die Vererbungskette im Prototyping . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
5.4.4
Ein Beispiel mit create( ) und addMethods( ) . . . . . . . . . . . . . . . . . . . . . 282
5.5 Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 5.6 Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 5.6.1
Verketten von DOM-Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
5.6.2
Element als Konstruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
5.6.3
Die Methoden zum DOM-Zugriff und Element.Methods . . . . . . . . . . . . 291
5.6.4
Methoden in der Praxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
5.7 Scriptaculous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 5.7.1
Download und Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
5.7.2
Grundlegende Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
5.7.3
Effekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
5.7.4
Formular- und AJAX-Elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
5.7.5
Drag&Drop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
5.8 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 11
Inhaltsverzeichnis
A
Anhang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 A.1 Quellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 A.2 Die Buch-CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 A.3 Grundlagen zum Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 A.3.1
Das Client-Server-Prinzip und TCP/IP – die Übertragungsbasis . . . . . . 324
A.3.2
Verbindungsorientierte Datenkommunikation . . . . . . . . . . . . . . . . . . . . 325
A.3.3
Zustandslose Datenkommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
A.4 HTML und XHTML – grundlegende Details . . . . . . . . . . . . . . . . . . . . . . . . 326 A.4.1
Steueranweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
A.4.2
Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
A.4.3
HTML-Eventhandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
A.4.4
Strukturierung einer Webseite mit HTML . . . . . . . . . . . . . . . . . . . . . . . . . 328
A.4.5
Das W3C und die verschiedenen Versionen von HTML und XHTML . . . 329
A.5 Die Gültigkeit von Webseiten testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 A.6 Die Einbindung von JavaScript in Webseiten . . . . . . . . . . . . . . . . . . . . . . 334 A.7 Ein paar Ausführungen zur JavaScript-Syntax . . . . . . . . . . . . . . . . . . . . . 338 A.8 Objekte in JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 A.8.1
Verfügbare DOM-Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
A.9 Die Verwendung von Stylesheets in einer Webseite . . . . . . . . . . . . . . . . 343 A.9.1
Kaskadierung von Regeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
A.9.2
Die konkrete Syntax von CSS-Deklarationen . . . . . . . . . . . . . . . . . . . . . . 346
A.10 Die Syntax eines XML-Dokuments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 A.10.1
Namensräume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
A.10.2 Gültige XML-Dokumente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
A.11 Add-ons für Firefox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 A.12 Die Meldungen eines Webservers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
12
Vorwort Unendliche Weiten. Dies sind die Abenteuer des Raumschiffs Ajaxprise. Wir schreiben das Jahr 2008. Ich sitze mal wieder in Dänemark in einer Campinghütte, warte auf besseres Wetter zum Paragliden an der Düne und kämpfe mit meinem Vorwort. Die Zukunft war gestern. Niemand kann mehr bezweifeln, dass das Internet im Allgemeinen und das World Wide Web (WWW) im Besonderen ein zentraler Teil des modernen Lebens geworden sind. Was sich Sience-Fiction-Autoren vor 30 Jahren erträumt haben, hat die Wirklichkeit überholt, zumindest teilweise1. Selbstredend gibt es schon seit Jahren klassische Internetapplikationen wie OnlineShops, Webportale, Informationsdienste etc. Spätestens, seit jedoch sogenannte RIAs (Rich Internet Applications) Anwendern im Rahmen von Webseiten immer weitergehende (reichhaltige) und oft jetzt erst richtig nützliche Funktionalitäten bereitstellen, verdrängen Webapplikationen sogar mehr und mehr die klassischen DesktopAnwendungen. Seien es Routenplaner inklusive interaktiver Satellitenkarten, Kalender, Adressbücher, Enzyklopädien, Speicherplatz für Dokumente bis hin zu vollständigen Office-Anwendungen im Rahmen eines Browsers. Permanent entstehen immer mehr solcher Webapplikationen, die dem sogenannten Web 2.0 respektive dessen schon propagierten Nachfolger Web 3.0 zuzuordnen sind. Blogs2, Wikis samt zahlreichen Angeboten, die unter dem Schlagwort der sogenannten Kollektiven Intelligenz geführt werden3, Mashups4, Social Network Analysis5, Portale etc. zählen zu diesem Bereich, der sich meist durch eine hohe Interaktion mit dem Besucher und einen fließenden Übergang zwischen Informationsanbieter und Informationskonsumenten auszeichnet. Alle diese modernen Angebote des World Wide Web machen das Medium zum Schweizer Taschenmesser der modernen Informationsgesellschaft. Letztendlich bleibt das WWW technisch gesehen aber auch bei RIAs immer noch ein Client-Server-System, das bei der Protokollebene auf sehr alten (oder – positiv formuliert – etablierten) Standards aufbaut und auf der Clientplattform mit erheblichen 1
Gut – die aktuellen Raumschiffe sind derzeit noch ein bisschen von der Warp-Geschwindigkeit entfernt und auch das Beamen ist etwas aufwändig, aber das wird schon. Die Aliens unter uns sollten dem Homo Sapiens einfach etwas mehr unter die Arme greifen ;-). 2 Online-Tagebücher einzelner Personen. 3 Das bedeutet die gemeinsame Entwicklung von Inhalten und geistigen Gütern durch verschiedene Personen, die oft einfach nur ein gemeinsames Interesse haben. 4 Die einfache Integration und Komposition verschiedener schon vorhandener Anwendungen und Datenquellen unter einer neuen Benutzeroberfläche. 5 Kurz SNA – das Nutzen von Informationen und Wissen einer Vielzahl von Personen und deren persönlicher Netzwerke.
Vorwort
Restriktionen leben muss. Die Anwender im WWW verwenden derzeit zu nahezu 100% einen klassischen Webbrowser. Und in diesem Webbrowser steht schlicht und einfach nur eine gewisse Anzahl an Technologien zur Umsetzung von Funktionalitäten bereit, die zudem noch sehr beschränkt in der Leistung sind. Als da wären natürlich HTML (Hyper Text Markup Language) respektive dessen neuerer Ableger XHTML (extensible Hyper Text Markup Language) als Seitenbeschreibungssprache für Webseiten, die die Grundstruktur einer RIA festlegen. Dazu kommen CSS (Cascading Style Sheets) zur Gestaltung des Layouts einer Webseite und JavaScript zur Programmierung von Logik im Client. Mit Einschränkungen kann man auch für moderne Browser die Unterstützung für XML (eXensible Markup Language) voraussetzen. Aber das war es! Zumindest wenn man die meisten Anwender im Web auch erreichen will. Natürlich gab und gibt es im WWW zusätzlich proprietäre Techniken, die diesen engen Fundus an clientseitigen Webtechnologien in einem Browser um isolierte Funktionalitäten erweitern – seien es Java-Applets, ActiveX-Controls, PDF-Dateien, Flash etc. Aber diese proprietäre Techniken setzen – auch wenn sich einige als Quasistandard recht hoher Verbreitung erfreuen – bei einem Anwender immer eine bestimmte Plattformstruktur bzw. das Vorhandensein gewisser ergänzender Programme voraus. Und damit schränken Sie bei einem Einsatz natürlich die potenzielle Zielgruppe teilweise erheblich ein. Auf der anderen Seite zeigen neue proprietäre Entwicklungen wie AIR von Adobe, Silverlight von Microsoft oder JavaFX von Sun Wege auf, in einem Webclient erheblich mehr Möglichkeiten bereitzustellen, teilweise sogar bei einer Webapplikation die Begrenzungen des Webbrowsers zu verlassen und Desktopapplikationen immer mehr mit Netzwerkapplikationen zu verschmelzen. Aber diese Technologien stehen noch ziemlich am Anfang und kranken hinsichtlich einer Webalternative wie alle proprietären Entwicklungen natürlich auch daran, dass beim Anwender eine entsprechende Umgebung zur Ausführung zwingend vorausgesetzt wird. RIAs, die sich auf die »klassischen« DHTML6-Bestandteile HTML, CSS und JavaScript beschränken, werden hingegen bei nahezu jedem Anwender funktionieren7. Nun leiden allerdings diese klassischen Webangebote darunter, dass man zum Austausch von Text8 die ganze bereits im Browser vorhandene Webseite austauschen muss. Es ist offensichtlich, dass damit eine riesige Menge an überflüssigen Daten zwischen dem Webserver und dem Webclient ausgetauscht werden müssen und eine Applikation extrem träge werden kann. 6 7
8
14
Dynamic HTML. Einmal von den Anwendern abgesehen, die seit 10–15 Jahren keine Neuerungen ihrer EDV vorgenommen haben, und denjenigen, die grundsätzlich jede aktive Technologie in ihrem Browser deaktivieren (müssen). Das Austauschen von Grafiken ist schon lange kein Problem. Das kann man bereits seit Jahren mit JavaScript sehr einfach vornehmen.
Vorwort
Was bereits im Browser vorhanden ist, muss ja im Grunde nicht erneut vom Webserver angefordert werden. Zwar kann man schon geraume Zeit durch einige »Taschenspielertricks« wie das lokale Cachen von Daten auf der Client-Plattform, das Nachladen über (versteckte) Frames etc. dem Problem teilweise begegnen, aber dennoch bedeutet jede Anforderung eines Webbrowsers an einen Webserver das Nachladen einer vollständigen neuen Webseite. Und hier hat erst AJAX9 (Asynchronous JavaScript and XML) die Revolution herbeigeführt. Damit ist es möglich, eben nur die Texte einer Webseite auszutauschen, die tatsächlich neu vom Webserver angefordert werden müssen – und das mit nur einer kleinen Erweiterung des DHTML-Triumvirats, die mittlerweile in allen modernen Browsern unterstützt wird. Die bereits geladene Webseite bleibt bei einer Datennachforderung per AJAX im Browser vorhanden und mittels DHTML wird gezielt an einer bestimmten Stelle in der Webseite ein Austausch bestehenden Inhalts durch die neu nachgeladene Information vorgenommen. Dabei kann die nachgeladene Information entweder aus Klartext (inklusive HTML-Fragmenten) oder auch strukturiertem XML oder JSON (JavaScript Object Notation) bestehen. Nun ist das grundsätzliche Erstellen von AJAX-Applikationen zwar nicht sonderlich schwierig, wenn man die Grundlagentechniken HTML bzw. XHTML und JavaScript beherrscht und sich zumindest etwas mit XML und CSS auskennt. Nicht wenige Entwickler von mächtigen Programmierwelten wie C/C++, .NET oder Java schauen sogar etwas verächtlich auf scheinbar sehr einfache Technologien wie HTML, JavaScript oder Stylesheets herab. In der Tat können sich weder der Umfang noch die Komplexität dieser klassischen clientseitigen Webtechnologien mit Programmiertechniken aus dem Desktop- beziehungsweise Netzwerk- oder Großrechnerumfeld messen. Aber das ist nur die eine Seite der Medaille. Das Zusammenspiel dieser – einzeln gesehen – in der Tat recht einfachen Webtechnologien im Client kann äußerst diffizil sein, was nicht zuletzt ein Resultat der Browser-Kriege des letzten Jahrtausends ist. Und zudem erzwingt die sehr eingeschränkte Leistungsfähigkeit von JavaScript oft eine nicht ganz triviale Programmierung von Strukturen, die in leistungsfähigeren (insbesondere objektorientierten) Programmiertechniken auf dem Silbertablett serviert werden. So gesehen kann sich die Erstellung einer interaktiven Benutzeroberfläche für das Web heutzutage durchaus mit der Komplexität der Erstellung einer GUI für eine Desktopapplikation messen. Deshalb bringt die Erstellung von AJAX-Applikationen ein hohes Maß an Tests und Anpassung an verschiedene Webbrowser und Plattformen mit sich. An den unterschiedlichsten Stellen warten tückische Fallstricke. Und natürlich ist die manuelle Erstellung von komplexen DHTML-Aktionen wie Drag&Drop oder animierten Menüs nicht jedermanns Sache, zumal Ihnen sicher auch die oft extrem diffizilen Abhängigkeiten von den verschiedenen Browsern und Betriebssystemplattformen bekannt sind. 9
In der Literatur hat sich teilweise auch die Schreibweise Ajax (also mit Kleinbuchstaben) etabliert.
15
Vorwort
Sogenannte Frameworks und Toolkits für AJAX bzw. JavaScript versprechen nun für viele Aufgabenstellungen und Probleme im Umfeld von AJAX und DHTML Abhilfe. Sie stellen vielfach vor allem JavaScript-Funktionsbibliotheken mit getesteten und hochfunktionellen Lösungen bereit, damit Sie nicht jedes Mal das Rad neu erfinden und vor allem dessen einwandfreie Funktionalität umfangreich testen müssen. Dazu gibt es gelegentlich auch spezielle Tools und Programme, die eine Arbeit mit diesen Bibliotheken unterstützen oder gar erst möglich machen. Wir werden uns in diesem Buch nun einigen populären und leistungsfähigen AJAXFrameworks widmen und schauen, wie Sie diese einsetzen können, um Ihre AJAXApplikationen zu verbessern bzw. die Erstellung zu vereinfachen. Für diesen Einstieg in die Welt der AJAX-RIAs wünsche ich Ihnen viel Spaß und viel Erfolg.
Ralph Steyer www.rjs.de und www.ajax-net.de
16
1
Einleitung
RIAs1 mit oder auch ohne den Einsatz von AJAX2 revolutionieren gerade die gesamte Computerlandschaft. Natürlich das WWW selbst, aber ebenso wird die Bedeutung von klassischen Desktopapplikationen neu positioniert und nicht zuletzt das Anwenderverhalten verändert. RIAs bieten auf der einen Seite – etwas schwammig3 formuliert – reichhaltigere Möglichkeiten als klassische Webapplikationen und sind auf der anderen Seite von der Bedienung teilweise fast gar nicht von klassischen Desktop- und Netzwerkapplikationen zu unterscheiden. Dazu sind sie in vielen Fällen auch von der reinen Optik her sehr anspruchsvoll und multimedial gestaltet, so dass sie sich optisch kaum noch von diesen Desktop- und Netzwerkapplikationen unterscheiden. Nun kann man diese modernen RIAs in Form von AJAX-Applikationen mit einem ausreichenden Wissen in den Grundlagentechniken HTML bzw. XHTML, JavaScript, CSS und gegebenenfalls noch XML bzw. JSON durchaus »von Hand« erstellen – das ist in vielen Fällen gar nicht der schlechteste Weg –, aber eben auch mithilfe von Frameworks und Toolkits. Und wir wollen uns in diesem Buch dem Erstellen von genau solchen RIAs mit AJAX und entsprechenden Frameworks widmen. Denn RIAs auf Basis von AJAX sind derzeit schlicht und einfach das Maß aller Dinge.4 Hinweis Was genau ein Framework ist und wie es sich von dem Begriff Toolkit unterscheidet, ist nicht standardisiert. Und sowohl eine verbindliche Definition als auch eine Abgrenzung sind gar nicht so einfach. Allgemein versteht man jedoch unter einem Framework ein Programmiergerüst, das bestimmte Funktionalitäten bereits bereitstellt. Ein Framework ist selbst jedoch noch kein fertiges Programm, sondern stellt den Rahmen (Frame) zur Verfügung, innerhalb dessen ein oder mehrere Programmierer eine Anwendung erstellen. Ein Framework beinhaltet in der Regel eine Bibliothek mit nützlichen vorgegebenen Codestrukturen, legt aber – im Gegensatz zu einer reinen Bibliothek – auch eine gewisse Verhaltensweise bei der Verwendung fest. 1 2 3 4
RIA – Rich Internet Application. AJAX – Asynchronous JavaScript and XML. Aber eigentlich sauber übersetzt. Wenngleich meines Erachtens RIAs auf Basis von JavaFX, AIR oder Silverlight eine große Zukunft haben. Solche RIAs werden in Zukunft wahrscheinlich mehr und mehr als vollständige Thin Clients konzipiert, die gänzlich auf einen Webbrowser verzichten. Derzeit sind aber solche Thin Clients für das Web noch nicht etabliert.
1 Einleitung
Bei einem Toolkit steht dagegen mehr die Sammlung an Programmen (Tools) im Fokus, die aber durchaus auch auf spezifischen Bibliotheken aufsetzen können.5 Oft stellt ein AJAX- oder Web-Toolkit (oder auch ein Framework – das ist wie gesagt schwer genau zu trennen) sogenannte Widgets bzw. Komponenten zur Verfügung. Dabei handelt es sich in der Regel um Elemente, aus denen eine grafische Benutzerschnittstelle (UI – User Interface oder GUI – Graphical User Interface) zusammengesetzt wird. Mit HTML bzw. XHTML kann man zwar problemlos einfache Elemente wie Schaltflächen, Texteingabefelder, Labels, Überschriften, Formulare oder Tabellen generieren. Aber es gibt insbesondere im Bereich von Desktopapplikationen komplexere UI-Elemente, die ohne den Einsatz von CSS und/oder JavaScript bzw. zusätzlichen Bibliotheken nicht von einem Browser unterstützt werden, beispielsweise Eingabefelder zur qualifizierten Datums- und Zeiteingabe, Eingabedialoge für Farben, Editoren für Rich Text, Baumstrukturen, Menüs, sortierbare Tabellen. Mit Widgets werden solche komplexeren UI-Elemente RIAs auf einfache Weise verfügbar gemacht.
1.1
Was behandelt dieses Buch?
Das vorliegende Buch soll Ihnen den Einstieg in die Webprogrammierung mit verschiedenen populären und ausgereiften AJAX-Frameworks bzw. -Toolkits ermöglichen, die im Wesentlichen im Kern als clientseitige JavaScript-Bibliotheken aufgebaut sind. 5 Sie haben dabei auf der einen Seite ein Einsteigerbuch vorliegen, das zwar nicht ganz bei null beginnen wird, aber auch nicht Freaks und Programmierprofis als Leser im Visier hat. Insbesondere wird keine große Erfahrung mit AJAX oder einem Framework oder Toolkit vorausgesetzt. Auf der anderen Seite sollte ein Leser jedoch schon Erfahrung in Webtechnologien haben, was ich gleich bei der Definition der Zielgruppe noch etwas genauer ausführen möchte. Das Buch selbst ist in vier Teile unterteilt und die einzelnen Kapitel sind im Wesentlichen gleich aufgebaut. Einer kurzen Einleitung folgen die detaillierten Kapitelthemen und das Kapitel wird mit einer Zusammenfassung abgeschlossen. Der erste Teil des Buchs, zu dem dieses Kapitel auch zählt, behandelt Grundlagen und Voraussetzungen. In dem Kapitel nach dieser Einleitung erfahren Sie zuerst, wozu AJAX eigentlich da ist und wie AJAX im gesamten Webumfeld positioniert wird. Welche Gründe gibt es für AJAX und dessen Erfolg? Warum und wie löst AJAX Probleme der konventionellen Webprogrammierung? Insbesondere in Hinsicht auf RIAs. Und mit welchen Techniken werden AJAX-Applikationen erstellt? Es geht also um die Grundlagen, die Sie auf jeden Fall kennen müssen. 5
18
Beispielsweise beim GWT (Google Web Toolkit).
1.1 Was behandelt dieses Buch?
In den folgenden Kapiteln wird dann der Umgang mit verschiedenen AJAX-Frameworks behandelt. Dabei sollten Sie beachten, dass die behandelten Frameworks und Toolkits oft ähnliche Probleme lösen und Features bereitstellen. Das wiederum macht den Aufbau der jeweiligen Abschnitte bzw. Kapitel etwas diffizil. Auf der einen Seite kann man nicht bei jedem Framework und Toolkit solche Informationen ausführlich wiederholen, die bereits in einem vorherigen Kapitel ausgeführt wurden. Auf der anderen Seite werden manche Leser vermutlich nicht alle Frameworks und Toolkits gleich wichtig empfinden und möglicherweise ein Kapitel zu einem spezifischen Framework oder Toolkit auslassen. Ich werde versuchen, dennoch ohne große Redundanzen auszukommen und gegebenenfalls einen Verweis an eine andere Stelle im Buch setzen.
1.1.1
Das YUI
In Teil 2 des Buchs widmen wir uns dem YUI (http://developer.yahoo.com/yui/). Das Yahoo User Interface bezeichnet eine populäre und sehr performante JavaScript- und CSS-Bibliothek für webbasierte Benutzerschnittstellen mit vielen mächtigen Features, einer hervorragenden Dokumentation und vielen Beispielen, die leicht für eigene Zwecke angepasst und eingesetzt werden können.
1.1.2
Das Dojo Toolkit
Danach besprechen wir das Dojo Toolkit (http://dojotoolkit.org/), das von der Dojo Foundation vorangetrieben wird. Die Ausführungen zu Dojo werden den umfangreichsten Part im Buch einnehmen. Mit anderen Worten – Dojo wird am ausführlichsten von den vorgestellten Toolkits und Frameworks behandelt. Auch hierbei handelt es sich wie beim YUI um ein modular aufgebautes clientseitiges AJAX-Toolkit bzw. -Framework auf Basis von JavaScript. Dessen Highlights sind eine große Anzahl an vorgefertigten Widgets und eindrucksvolle DHTML-Effekte.
1.1.3
Prototype + Scriptaculous
Mit Prototype (http://www.prototypejs.org/) schauen wir uns dann in Teil 4 ein Framework an, dessen Bibliotheken mehr oder weniger die gleiche Funktionalität wie Dojo Core bieten. Der wesentliche Unterschied besteht darin, dass Dojo eine konservativere Philosophie bezüglich globaler Namensräume verfolgt, während hier die kurze Benennung von häufig verwendeten Funktionen im Vordergrund steht. Das Framework, das nicht von einer Foundation oder Firma organisiert wird, verfügt ebenfalls über eine sehr gute Dokumentation und eine rege Community und lässt sich sehr gut mit Ruby On Rails und einigen anderen Frameworks kombinieren. Das Framework ist Basis vieler Ergänzungen, die zum Beispiel Widgets direkt auf Prototype aufsetzen, etwa Scriptaculous oder auch script.aculo.us (http://script.aculo.us/). Scriptaculous selbst stellt einige Controls wie Autovervollständigung, Sliders etc. zur Verfügung, ist aber kein vollständiges Widget-Toolkit. Insbesondere können Widgets nicht
19
1 Einleitung
auf einfache Weise erstellt werden. Für das Kernsystem von Prototype+Scriptaculous gibt es viele ergänzende Bibliotheken, die aber nicht mit den Kernbibliotheken ausgeliefert werden. Es gibt hier auch kein Paket- oder Build-System. Während wir beim YUI und Dojo stark die Widgets und die Erstellung von Oberflächen fokussieren, werden wir uns bei Prototype im Wesentlichen auf den Kern beschränken, obwohl Scriptaculous als Ergänzung auf mehreren Seiten behandelt wird.
1.1.4
Weitere Frameworks
Es gibt natürlich noch zahlreiche weitere AJAX-Frameworks und -Toolkits, die eine verwandte Philosophie wie die hier behandelten Frameworks bzw. Toolkits verfolgen und ähnliche Möglichkeiten bereitstellen. Beispielsweise JQuery (http://jquery.com/). Dieses recht minimalistische System fo-
kussiert sich primär auf die Operation auf vorhandenen DOM-Strukturen. JQuery stellt dazu eine Abfragesprache zur Verfügung, die eine Mischung aus XPath und CSS darstellt. Auf den resultierenden Objekten kann man mit diversen Optionen und Operationen agieren. Der Kern von JQuery ist sehr kompakt, aber es gibt diverse ergänzende Bibliotheken von Drittanbietern. Auch EXT (http://extjs.com/) ist sehr interessant. Dies bezeichnet eine Komponen-
tenbibliothek wie Dijit in Dojo mit einer Vielzahl an sehr guten Widgets. EXT kann optional sogar auf anderen Frameworks und Toolkits wie YUI oder JQuery aufsetzen. Es lohnt sich auch durchaus, einen Blick auf MochiKit (http://mochikit.com/) zu wer-
fen. MochiKit ist ein hochwertiges JavaScript-Toolkit, das sehr guten und performanten Code generiert. Aber im Gegensatz zu beispielsweise Dojo gibt es weder Widget-System noch Komponentensatz. Allerdings werden diverse Codestrukturen von MochiKit und Dojo unter der CLA-Lizenz geteilt. Bei dem freien, modularen und objektorientierten JavaScript- bzw. AJAX-Frame-
work MooTools (http://mootools.net/) besteht – wie bei den meisten JavaScriptBibliotheken – ein Schwerpunkt auf der Erstellung von erweiterbarem und browserübergreifendem Code. Das äußerst schlanke MooTools enthält eine breite Unterstützung von Selektoren, einen kompletten iFrame-Support, Generics für die Anbindung von Prototype-Funktionen an Objekte und einen konsistenten ClassKonstruktor. Auch von großen Firmen und Projekten im Webumfeld werden AJAX-Applika-
tionen mehr und mehr unterstützt. Unter Schirmherrschaft der Eclipse-Foundation sollen dazu drei Projekte die Entwicklung von AJAX-Applikationen vereinfachen. Dabei soll im Wesentlichen die JavaScript-Unterstützung verbessert werden. Mit der Rich Ajax Platform soll Programmierern ein einheitliches Modell zur Erstellung von AJAX-Komponenten bereitstehen. Das Projekt baut auf der bestehenden Rich Client Platform von Eclipse auf. Das zweite Projekt hat für Eclipse eine neue Version des Ajax Toolkit Framework entwickelt und auch neben Linux und Windows für Mac
20
1.2 Schreibkonventionen
OS verfügbar gemacht. Zudem hat Eclipse den Code des Dynamic Languages Toolkit Project veröffentlicht, um die Programmierung mit Python, Ruby und Tcl in Eclipse zu vereinfachen. IBM stellt neue AJAX-Tools als Open Source zur Verfügung. IBM will damit das Ajax Technology Framework (ATF) der Eclipse Foundation in Sachen AJAX unterstützen. Selbst diese Auswahl weiterer Frameworks und Toolkits ist nur ein Schlaglicht. So gesehen könnten wir noch zahlreiche weitere Frameworks und Toolkits sowohl kurz vorstellen als auch natürlich intensiver betrachten. Aber wir müssen uns in dem Buch natürlich beschränken, um die behandelten Frameworks und Toolkits in ausreichender Tiefe ansprechen zu können. Beachten Sie, dass Sie in diesem Buch trotzdem im Wesentlichen einen (vertieften) Überblick über die grundsätzliche Funktionsweise der jeweils vorgestellten Frameworks und Toolkits erhalten. Es ist jedoch weder machbar noch sinnvoll, sämtliche Möglichkeiten eines einzelnen Toolkits vollkommen zu beschreiben (insbesondere jede einzelne Komponente, wenn ein Framework oder Toolkit solche bereitstellt). Zum einen ist das nicht notwendig, denn die Frameworks und Toolkits sind sehr konsistent aufgebaut. Das bedeutet, wenn Sie einige zentrale Aktionen mit einem Framework oder Toolkit ausgeführt und verstanden haben, können Sie sich in andere Möglichkeiten mit diesen Frameworks beziehungsweise Toolkits aufgrund der begleitenden Dokumentationen und Beispiele leicht selbst einarbeiten. Zum anderen ist die Entwicklung der AJAX-Frameworks und Toolkits derart dynamisch, dass fast wöchentlich neue Funktionalitäten, Komponenten, Widgets etc. hinzukommen. Daher kann ein Buch naturgemäß niemals auf dem aktuellen neuesten Stand sein, sondern nur die generelle Arbeit mit einem Framework oder Toolkit anhand ausgewählter Beispiele zeigen beziehungsweise die grundlegende Anwendung von einem Framework oder Toolkit demonstrieren. Hinweis Im Buch arbeiten wir zur Verdeutlichung natürlich immer wieder mit Codebeispielen. Ich empfehle zwar ausdrücklich, dass Sie die Codebeispiele vollständig selbst abtippen (und natürlich auch bei Bedarf modifizieren und damit experimentieren). Aber natürlich finden Sie die Listings auch auf der Buch CD.
1.2
Schreibkonventionen
In diesem Buch werden verschiedene Schreibkonventionen eingehalten, die Ihnen helfen sollen, die Übersicht zu bewahren. Wichtige Begriffe werden hervorgehoben. Vor allem sollten Sie erkennen können, ob es sich um normalen Text oder Programmcode handelt. Ebenso werden Tasten ((Alt), (Strg) oder (Shift)), BEFEHLE und noch einige weitere Besonderheiten gekennzeichnet. Diese Formatierungen werden konse-
21
1 Einleitung
quent verwendet. Und ebenso werden Sie in dem Buch Bereiche vorfinden, die über die Markierung mit verschiedenen Symbolen besondere Aufmerksamkeit erzeugen sollen. Hinweis Das ist ein besonderer Hinweis, den Sie an der Stelle beachten sollten.
Tipp Das ist ein Tipp, der Ratschläge oder besondere Tricks zu einer jeweiligen Situation zeigt.
Achtung Hier droht Gefahr.
Eine besondere Bemerkung soll noch zu Quelltextpassagen von vollständigen Listings erfolgen. Bei allen vollständigen Listings sowie einigen größeren Quellcodefragmenten werden Sie eine Nummerierung der Quelltextzeile finden. Diese gehört natürlich nicht zum eigentlichen Quelltext und soll nur die Orientierung für Sie erleichtern, eine neue Zeile im Quelltext verdeutlichen und in meinen Erklärungen zu Quelltexten einen verständlichen Bezug herstellen.
22
1.3 Wer ich bin
6
Achtung In seltenen Fällen kann es aus drucktechnischen Gründen notwendig sein, eine Quelltextzeile auf mehrere Buchzeilen zu verteilen.6 In diesem Fall zeigen Ihnen die Nummerierungen der Quellcodezeilen an, welche Passagen im Editor noch in eine Zeile zu notieren sind. Solange Sie dort keine neuen Zeilennummern finden, müssen Sie im Editor alles noch in eine Zeile schreiben.
1.3
Wer ich bin
Ich möchte mich zu Beginn des Buchs in diesem einleitenden Kapitel kurz vorstellen. Mein Name ist Ralph Steyer.7 Ich habe an der Universität in Frankfurt/Main Mathematik studiert (Diplom) und danach einige Jahre bei einer großen Versicherung im Rhein-Main-Gebiet als Programmierer und konzeptioneller Projektmitarbeiter gearbeitet. Dort habe ich als Schwerpunkt DOS-Programmierung mit Turbo Pascal betrieben, aber auch mit C und C++ in verschiedenen Projekten programmiert. Etwa ein Jahr war ich neben der Programmierung mit der fachlichen Datenbankkonzeption für eine Großrechnerdatenbank unter MVS beschäftigt. Seit 1995 verdiene ich meinen Lebensunterhalt als Freelancer, wobei ich permanent zwischen der Arbeit als Fachautor, Fachjournalist, EDV-Dozent und Programmierer beziehungsweise Projektleiter wechsle. Das macht aus meiner Sicht einen guten Mix aus, bewahrt vor Langeweile und hält mich sowohl in der Praxis als auch am Puls der Entwicklung. Insbesondere habe ich sowohl das Vergnügen als auch die Last, mich permanent über neue Entwicklungen in der EDV auf dem Laufenden zu halten, denn die Halbwertszeit von Computerwissen ist ziemlich kurz. Dementsprechend ist mein Job zwar anstrengend, aber vor allem immer wieder spannend. Mit den verschiedenen Techniken im AJAX-Umfeld befasse ich mich schon recht lange. Bereits 1996 ist mein erstes Buch zu HTML erschienen, dem mittlerweile zahlreiche Bücher und einige Video-Trainings zu JavaScript, CSS, XML sowie Java und JavaFX, PHP und noch einigen anderen Programmier- und Webtechnologien gefolgt sind. Mit dem Begriff AJAX als solches habe ich mich erstmals 2005 im Rahmen eines ersten Buchs zu diesem Thema intensiv beschäftigt und dabei schnell erkannt, dass es eigentlich nur eine Bezeichnung für die Zusammenfassung verschiedener Technologien ist, mit denen ich mich bereits seit zehn Jahren auseinandersetze.8 In der Zwischenzeit habe ich noch einige weitere Bücher sowie ein Video-Training zu AJAX pro6 7 8
In manchen Listings lassen sich längere Passagen nicht auf mehrere Zeilen im Editor aufteilen – etwa bei Internetadressen. Was Sie auch auf dem Buchcover sehen könnten ;-). Ich fand das damals echt nett, dass sich da jemand mein Tätigkeitsprofil angesehen und dem einen knalligen Namen gegeben hatte. Später hat man mir dann gesagt, dass ich dabei überhaupt keine Rolle gespielt habe – das war wiederum frustrierend ;-).
23
1 Einleitung
duziert, zahlreiche AJAX-Schulungen gehalten, auf verschiedenen Kongressen zu AJAX referiert und auch schon zu zwei AJAX-Frameworks9 (GWT10 und Atlas11) sowie einigen Google Web-APIs Bücher geschrieben. Tipp Unter http://rjs.de finden Sie meine Homepage und unter http://rjsedv. blogspot.com meinen Blog. Daneben betreue ich ein Portal zu AJAX unter http://www.ajax-net.de und unter http://www.javafx.cc eine Seite zu JavaFX.
Ja – und dann gibt es mich natürlich auch noch jenseits der Computerwelt. Ich lebe im Rhein-Main-Gebiet, habe Zwillinge im Grundschulalter und mein eines großes Hobby kann man ganz pauschal mit Sport bezeichnen – von Leichtathletik über Rasenkraftsport, Mountainbiken, Motorradfahren bis zum Gleitschirmfliegen. Und dann mache ich noch Musik in einer Rockband (Saxophon).
1.4
Wer sind Sie? – der Versuch einer Zielgruppendefinition
Sie haben in unserer Partnerschaft den Vorteil, dass Sie nun etwas von mir wissen. Ich kenne Sie natürlich nicht. Und die privaten sowie beruflichen Details differieren mit absoluter Sicherheit. Aber ich habe eine gewisse Vorstellung, wer sich warum mit AJAX respektive AJAX-Frameworks beschäftigen wird und dieses Buch lesen könnte. Ich denke, Sie haben bereits Webseiten erstellt und auch schon in irgendeiner Form programmiert. Sollten Sie damit noch keine Erfahrung haben, wird das Buch wohl zu mühselig für Sie. Ich vermute weiter, Sie sind irgendwann den Einschränkungen einer statischen HTML-Seite überdrüssig geworden und Sie haben auch bereits erste Erfahrungen mit dynamischen Webseiten. Und Sie haben wahrscheinlich schon Anwendungen gesehen oder davon gehört, die ein Antwortverhalten quasi wie Desktopanwendungen aufweisen. Schlagworte wie das Web 2.0 oder Interaktives Web sind Ihnen bekannt oder machen Sie neugierig. Und ich vermute, Sie wollen den Zug erwischen, der in die RIA-Zukunft des WWW fährt.
9
Beide sind aber explizit nicht als clientseitige JavaScript-Bibliotheken konzipiert, wie es die Frameworks und Toolkits sind, die dieses Buch behandelt. 10 Das Google Web Toolkit ist ein Framework von Sun, bei dem zur Erstellungszeit einer RIA unmittelbar auf Serverseite im Java-Umfeld gearbeitet wird. Erst zum Veröffentlichen der Applikation wird der Java-Code in ein Gemisch aus HTML, JavaScript und CSS übersetzt, das dann der endgültigen RIA entspricht. 11 Atlas ist der frühere Name des AJAX-Frameworks von Microsoft im .NET-Umfeld. Mittlerweile nennt Microsoft das Framework ASP.NET AJAX.
24
1.4 Wer sind Sie? – der Versuch einer Zielgruppendefinition
Können Sie bereits AJAX programmieren? Ich meine von Hand? Da bin ich mir nicht sicher. Die Antwort auf diese Frage geht einher mit einer anderen Frage.
1.4.1
Für wen lohnen sich eigentlich AJAX-Frameworks?
Wie gesagt, AJAX-Applikationen kann man durchaus von Hand erzeugen, gänzlich ohne den Einsatz von Frameworks. Der Aufwand eines AJAX-Frameworks lohnt sich beileibe nicht für jeden. Beim Einsatz eines Frameworks begeben Sie sich natürlich teilweise auch in erhebliche Abhängigkeit von einem Hersteller respektive einem Projekt. Und um ein AJAX-Framework nutzen zu können, müssen Sie auf jeden Fall die Idee und Arbeitsweise von AJAX verstanden haben und alle Grundtechnologien zumindest im Ansatz begreifen. Das gilt insbesondere für die Frameworks, die in diesem Buch besprochen werden und als reine JavaScript-Funktionsbibliotheken konzipiert sind. Dazu kommt noch, dass auch in umfangreichen Frameworks ziemlich sicher genau das Problem nicht gelöst wird, das Sie eigentlich interessiert – frei nach Murphy ;-). In jedem Fall erfordert der Einsatz von AJAX-Frameworks die Einarbeitung in die jeweiligen Funktionsbibliotheken und Arbeitsweisen eines Frameworks. Diese Mühe lohnt sich bei kleineren Webpräsenzen mit wenigen asynchronen Datenanforderungen kaum. Auf der anderen Seite werden Sie nach der Mühsal der Einarbeitung und der Aufgabe der vollständigen Kontrolle über Ihren Quellcode Ihre AJAX-Applikationen mit einem Framework viel effektiver, effizienter, reichhaltiger und robuster entwickeln können. Das wirkt sich besonders bei großen Webangeboten mit umfangreichen asynchronen Datenanforderungen aus. Als Faustformel kann gelten: Je größer die Webpräsenz und – in Bezug auf AJAX – je mehr asynchrone Datenaustausche Sie benötigen, desto sinnvoller ist der Einsatz eines Frameworks – insbesondere, wenn Sie mit Problemen konfrontiert werden, deren manuelle Umgehung aufwändig ist. Nun aber zurück zur eingangs schon gestellten Frage – beherrschen Sie bereits AJAX und die damit verbundenen Grundlagentechnologien? Ich denke, das kann man mit einem klaren Jein beantworten. Mit anderen Worten – ein Teil der Leserschaft wird bereits fit darin sein, der andere Teil noch nicht. Dieser sollte sich allerdings parallel zum Einarbeiten in AJAX-Frameworks über dieses Buch die notwendigen Grundlagentechniken darauf schaffen.
1.4.2
Wie sieht also die Zielgruppe des Buchs aus?
Basierend auf den bisherigen Ausführungen lässt sich die Zielgruppe recht klar eingrenzen. Das Buch wendet sich im Wesentlichen an Webseitenersteller, Webdesigner und Webprogrammierer, die bereits zumindest etwas Erfahrung mit (X)HTML, CSS und JavaScript und vielleicht auch XML haben. Insbesondere das YUI und Dojo las-
25
1 Einleitung
sen sich auch schon ohne tiefergehende Kenntnisse in den genannten Techniken effektiv nutzen, während Prototype eher die sattelfeste Beherrschung der Techniken voraussetzt. Was in dem Buch nicht als Grundlagen von Ihnen als Leser erwartet wird, ist, dass Sie in der Programmierung spezieller AJAX-Techniken geübt sind. Ebenso werden keine Kenntnisse in serverseitiger Programmierung vorausgesetzt. Hinweis Um dieser etwas heterogenen Zielgruppe Rechnung zu tragen, beschäftigt sich das folgende Grundlagenkapitel kompakt mit allen relevanten Dingen, die Sie rund um AJAX kennen müssen, um AJAX Frameworks sinnvoll anwenden zu können. Dazu finden Sie im Anhang diversere Ergänzungen zu den einzelnen Grundlagentechniken.
1.5
Was benötigen Sie?
Beschäftigen wir uns nun ein wenig mit dem, was Sie für den nachfolgenden Umgang mit dem Buch und die Arbeit mit AJAX-Frameworks als Voraussetzungen haben sollten. Insbesondere auf die nachfolgend beschriebene Software werden wir gelegentlich zurückkommen.
1.5.1
Hardware und Betriebssystem
Wenn Sie sich für die Programmierung auf einen reinen Texteditor beschränken wollen, werden an Ihren Computer keine besonderen Anforderungen gestellt. Ich möchte Ihnen im Rahmen des Buchs allerdings einige Tools empfehlen, deren Anforderungen an die Hardware nicht ganz genügsam sind. Es wäre also nicht schlecht, wenn Ihre Hardware halbwegs auf einem vernünftigen Stand ist.12 Und selbstverständlich benötigen Sie einen Internetzugang. Empfehlenswerte Betriebssysteme sind alle grafischen Systeme wie Linux, Windows oder MacOS. Das spielt – wie meist im Web – in der Regel keine Rolle. Es sollte sich jedoch um ein halbwegs aktuelles Betriebssystem handeln. Ich persönlich arbeite am liebsten mit Linux, aber ich kann auch mit Windows leben und hoffe, dass ich bald meinen Plan umsetze, mir endlich einmal einen Mac zuzulegen.
12 Also ein Mehrkernprozessor und 2 oder mehr Gigabyte RAM.
26
1.5 Was benötigen Sie?
1.5.2
Die Frameworks bzw. Toolkits
Sie benötigen natürlich für das Nachvollziehen der Ausführungen die jeweiligen AJAX-Frameworks bzw. -Toolkits. Wir werden bei den Kapiteln zu den konkreten Frameworks genauer besprechen, wie Sie diese erhalten beziehungsweise verwenden können. Tipp Die zum Zeitpunkt der Bucherstellung aktuellen Versionen der behandelten Frameworks und Toolkits finden Sie auch auf der BuchCD. Dennoch wird es sinnvoll sein, im Internet zu überprüfen, ob es mittlerweile neuere Versionen gibt.
1.5.3
Die Browser-Armada
Was Sie zwingend brauchen werden, ist natürlich ein Webbrowser, der AJAX unterstützt.13 Dies sind derzeit unter anderem alle Browser, die zum Microsoft Internet Explorer ab der Version 4.014 (eingeschränkt) oder besser höher kompatibel sind, Opera 7.6 und höher, für Linux-Anwender neuere Versionen des Konqueror, auf einer aktuellen Gecko-Engine basierende Browser wie Firefox, Mozilla oder Netscape ab der Version 7.1 und für Apple-Anwender Safari 1.2 und höher. Sie sollten nun als Webseitenersteller (natürlich auch für RIAs) auf jeden Fall mehrere Browser zur Verfügung haben. Denn leider gilt auch unter AJAX sowie den entsprechenden Frameworks, dass man Webapplikationen unbedingt in allen relevanten Browsern testen muss. Sie können ja schon bei einer etwas anspruchsvolleren normalen Webapplikation niemals sicher sein, wie diese in verschiedenen Browsern aussieht. Es gibt auch heutzutage zahlreiche Sonderfälle, die Sie testen müssen. Und in der Regel wissen Sie nicht, mit welchen Browsern Ihre Besucher auf Ihren Webseiten vorbeikommen. Für einen effektiven Test sind sowohl Browser von verschiedenen Herstellern notwendig als auch verschiedene Versionen eines Browsers. Gerade mehrere Versionen eines Browsers können sich im Verhalten auch massiv unterscheiden. Daher gehören ältere sowie die derzeit topaktuellen Browser für Webdesigner und Webprogrammierer zur Pflichtausstattung.
13 Sie müssen Ihre Beispiele ja ausprobieren können. 14 In der Tat war der Internet Explorer der erste Browser, der mehr oder weniger AJAX unterstützt hat. Das liegt daran, dass die entscheidenden Parts von AJAX im Grunde von Microsoft erfunden wurden. Darauf kommen wir im folgenden Grundlagenkapitel zurück.
27
1 Einleitung
Achtung Beachten Sie, dass die vorausgesetzten Browser Versionen für die meisten mächtigen Frameworks und Toolkits sehr hoch sind. Genau aus dem Grund sollten Sie aber auch ältere Versionen zur Verfügung haben, um zu testen, wie Ihre Seite bei Besuchern mit solchen Browsern aussehen wird.
15
Hinweis Der kommende Internet Explorer 8.0 ist wieder so ein Fall, bei dem eine Inkompatibilität mit den Vorgängerversionen nach ersten Tests von Betaversionen vorprogrammiert (bzw. sogar gewünscht) ist. In der Vergangenheit hat Microsoft unbestritten keinen großen Wert auf die Einhaltung von Webstandards gelegt. Aber der Internet Explorer 8 soll nun die offiziellen Webstandards besser als seine Vorgänger unterstützen. Dies betrifft u.a. RSS-Funktionen, die CSS-Implementierung, DOM und die AJAX-Unterstützung. Nun besteht aber ein Problem. Was soll der Internet Explorer mit Seiten machen, die für die nicht standardkonformen Vorgängerversionen optimiert wurden? Diese würden im neuen standardkonformen Internet Explorer 8 nicht mehr korrekt angezeigt. Die Lösung ist zwar nicht elegant, aber wohl unumgänglich. Der Internet Explorer 8 wird gleich drei Darstellungsmodi beherrschen. Es gibt einmal den neuen Modus, in dem sich der neue Browser tatsächlich an Webstandards halten soll.15 Und dann gibt es einen Modus, in dem der Browser weiter wie die Vorgängerversionen mit Webseiten umgeht. Zu diesem zum Internet Explorer 7 kompatiblen Modus muss man den Internet Explorer 8 aber wahrscheinlich erst durch Einfügen eines neuen Meta-Tags in den Kopfbereich der Website zwingen, wobei der IE 8 in der Betaversion einen eingebauten Schalter zur Emulation des IE7-Verhaltens besitzt. Neben diesen beiden Modi gibt es weiterhin den »Quirks Mode« für explizit nicht standardkonforme Webseiten.
15 Erste Experimente mit der Betaversion und standardkonformen Webseiten zeigen jedoch massive Abweichungen zur Interpretation in wirklich standardkonformen Browsern wie Opera oder Firefox sowie Vorgängerversionen. Der Umstieg auf echte Standardkonformität scheint schwer zu sein ;-).
28
1.5 Was benötigen Sie?
Abbildung 1.1: Der IE 8 Nun gibt es unter Anwendern den verbreiteten Irrglauben, dass man nur einen Browser auf einem Computer bzw. unter einem Betriebssystem installieren kann. Das ist natürlich nicht so. Sie können parallel beliebig viele Browser auf einem einzigen Computer installieren und auch parallel ausführen. Dabei können Sie meist sogar verschiedene Versionen des gleichen Browsers auf einem Rechner verwenden. Nur beim Internet Explorer geht das dummerweise nicht bzw. nicht so einfach. Hier kollidieren mehrere Versionen des Internet Explorer auf einem Rechner, da dieser sich tief im Betriebssystem verankert. Hinweis Angeblich bedeutet die parallele Installation von mehreren Versionen des Internet Explorer ein Sicherheitsrisiko. Dies habe ich so zumindest als Verlautbarung des Pressesprechers von Microsoft in einem Forum gelesen. Ehrlich gesagt halte ich es persönlich für eine Bankrotterklärung, wenn aus so einer elementaren Anforderung ein Sicherheitsrisiko resultiert. Um mehrere Versionen des Internet Explorer verwenden zu können, benötigen Sie also in der Regel mehrere Windows-Installationen – entweder auf verschiedenen Computern oder als parallele Betriebssysteminstallationen.
29
1 Einleitung
16
Tipp Oder aber Sie greifen auf spezielle Tools zu, die eine solche Parallelinstallation mit etwas Aufwand gestatten. Ein solches Programm finden Sie unter http://tredosoft.com/Multiple_IE. Es nennt sich Multiple IE Installer. Aber sogar von Microsoft selbst gibt es ein entsprechendes kostenloses Tool mit Namen Internet Explorer 6 Application Compatibility VPC Image16, das die Parallelinstallation des IE in verschiedenen Versionen gestattet. Dabei läuft zum Beispiel der Internet Explorer 7 direkt auf dem System, während das Image den IE 6 auf dem Rechner emuliert.
1.5.4
Betriebssysteme
Idealerweise haben Sie zum Testen Ihrer Applikationen mehrere Betriebssysteme zur Verfügung. Natürlich ist Windows das Referenzsystem schlechthin. Die meisten Anwender im Web verwenden dieses System – ohne Wenn und Aber. Jedoch sollten Sie als Testsystem auf jeden Fall auch Linux verwenden. Erstens hat es eine durchaus relevante Verbreitung und zweitens ist es interessant zu sehen, wie sich verschiedene Webapplikationen unter verschiedenen Betriebssystemen verhalten. 1718
Tipp Nun brauchen Sie keine Angst zu haben, dass Sie als WindowsAnwender parallel zu Ihrem Betriebssystem ein weiteres Betriebssystem installieren oder sich gar einen neuen Rechner kaufen müssen, wenn Sie Linux als Testsystem verwenden wollen. Es gibt ausgezeichnete sogenannte Live-CDs bzw. Live-DVDs17, von denen Sie Linux direkt starten können, ohne dass auf Ihrer Festplatte irgendeine Änderung durchgeführt wird. Eine ganz hervorragende Live-Distribution ist Knoppix, das auf Debian basiert und Sie sich ohne Schwierigkeiten18 aus dem Internet laden (http://www.knoppix.org/) und auf CD oder DVD brennen können. Alternativ können Sie es immer wieder über diverse Computerzeitschriften beziehen, bei denen diese Distribution regelmäßig beigelegt wird. Die Knoppix-CD enthält u.a. den Konqueror als Webbrowser sowie einige weitere Browser, deren Gegenstück Sie unter Windows oder MacOS wahrscheinlich kennen, die sich aber in Feinheiten durchaus von diesen Versionen unterscheiden können. 16 Oder auch nur Internet Explorer Application Compatibility VPC Image oder abgekürzt VPC – http://www.microsoft.com/downloads/details.aspx?FamilyID=21eabb90-958f-4b64-b5f1-73d0a413 c8ef&DisplayLang=en. 17 Oder auch Live-Distributionen genannt. 18 Und natürlich kostenlos.
30
1.5 Was benötigen Sie?
Abbildung 1.2: Die Homepage des Knoppix-Projekts Sehr wichtig ist natürlich auch MacOS. Aber hier besteht leider das Problem, dass man zu einer Verwendung explizit den passenden Rechner benötigt. 19
Tipp Für Leser mit ausreichend leistungsfähiger Hardware könnte es äußerst interessant sein, sich eine sogenannte Virtualisierungslösung (VM – Virtual Machine) wie VMWare (http://www.vmware.com/de), Virtual PC von Microsoft (http://www.microsoft.com/germany/windows/virtualpc/) oder auch VirtualBox19 (http://www.virtualbox.org/) anzusehen. Diese sind – zumindest für den privaten Gebrauch – kostenlos und simulieren innerhalb eines Betriebssystems ein anderes Betriebssystem. Sie können damit beispielsweise innerhalb von Windows ein Linux-System starten und umgekehrt oder Sie können dann zum Beispiel unter einer Windows-Installation in einem weiteren, parallel laufenden Windows auch eine andere Version des Internet Explorer installieren (das oben angesprochene VPC Image basiert auf einer VM auf Basis von Virtual PC). Und nicht zuletzt ist es in Bezug auf AJAX sehr interessant, dass das sogenannte Gastsystem (das System, welches in der VM läuft) als Server oder Client fungieren kann und Sie damit zwei vollkommen getrennte Systeme zur Verfügung haben, um eine Client-Server-Beziehung wie in der Realität auszuprobieren. 19 VirtualBox wurde unlängst von Sun aufgekauft.
31
1 Einleitung
Abbildung 1.3: Knoppix in einer VM (VirtualBox) unter Windows
Abbildung 1.4: Selbst Vista und XP können parallel unter Linux gestartet werden, wenn die Hardware das hergibt.
32
1.5 Was benötigen Sie?
1.5.5
Der Webserver
Letztlich basiert der gesamte »Trick« von AJAX ja darauf, dass von einem Browser aus Daten von einem Webserver angefordert werden. Deshalb ist es für die praktische Ausführung und damit auch das Testen von solchen Applikationen unabdingbar, dass Sie Zugang zu einem Webserver im Internet haben und dort Programme oder Skripte ausführen können. Das wird letztendlich auch für ein AJAX-Projekt in der Praxis notwendig sein. Allerdings ist es in der Praxis ebenso unüblich, schon bei der Entwicklung einer Webapplikation direkt auf einem Webserver im Internet zu arbeiten. Vor allem, wenn Sie nur Dinge testen wollen. Sie sollten sich also eine Testumgebung mit einem Webserver auf einem lokalen Rechner oder in einem lokalen Netzwerk schaffen. Gerade Linux-Distributionen beinhalten fast immer bereits ein oder mehrere Webserver. Damit sind Sie natürlich auf der sicheren Seite. Aber auch wenn Sie keinen Webserver automatisch zur Verfügung haben oder sich die Sache nur möglichst einfach machen wollen, bietet sich ein Rundum-Sorglos-Paket wie XAMPP an, das Sie einfach für verschiedene Betriebssysteme aus dem Internet laden können (unter http://www.apachefriends.org/de/).
Abbildung 1.5: Die Homepage von Apache Friends – dem Projekt hinter XAMPP Dieses Paket bezeichnet eine Sammlung von Programmen mit dem Webserver Apache im Zentrum, der durch das Datenbankmanagementsystem MySQL (inklusive phpMyAdmin zur Administration des Datenbankmanagementsystems) und PHP-Unterstützung sowie einige weitere Webtechnologien ergänzt wird. Sie brauchen dieses Paket mit einem einfachen Assistenten nur zu installieren und schon haben Sie einen voll funktionstüchtigen Webserver in einer Grundkonfiguration zur Verfügung.
33
1 Einleitung
Achtung Beachten Sie aber, dass diese Pakete in der Grundeinstellung ausschließlich für lokale Testzwecke konfiguriert sind. Um die Sache möglichst einfach zu halten, sind sämtliche Sicherheitseinstellungen extrem niedrig eingestellt.
Sobald die Installation von XAMPP fertig ist, können Sie entweder Apache manuell starten oder aber auch so einrichten, dass Apache als Dienst bzw. Prozess in Ihrem Betriebssystem integriert und sogar automatisch beim Start des Rechners aufgerufen werden kann. XAMPP stellt zur Verwaltung ein komfortables und sehr einfach anzuwendendes Kontrollprogramm zur Verfügung.
Abbildung 1.6: Das XAMPP Control Panel Achtung Beachten Sie, dass bei Pfadangaben unter Apache in der Regel Großund Kleinschreibung relevant ist. Dies betrifft auf jeden Fall alle Apache, die unter Linux bzw. Unix laufen. Und dies wird in der Praxis bei den meisten Providern der Fall sein. Am besten benennen Sie alle Verzeichnisse und Dateien konsequent klein.
34
1.5 Was benötigen Sie?
1.5.6
Die Entwicklungstools
Sie werden als Rückgrat einer RIA auf Basis von AJAX wie bei jeder Webseite immer ein HTML- bzw. XHTML-Gerüst verwenden. Zur Erstellung des HTML-Quelltextes sowie sämtlicher anderer verwendeten Techniken bei AJAX-Anwendungen im Allgemeinen genügt als Minimalausstattung bereits ein reiner Klartexteditor, wie er bereits bei jedem Betriebssystem mitgeliefert wird. Für Masochisten20 kann das beispielsweise der extrem einfache Notepad unter Windows sein. Oder KEdit unter Linux. In der Praxis und insbesondere im Umgang mit AJAX und AJAX-Frameworks verwenden Sie jedoch meist mächtigere Programmierwerkzeuge, die Sie bei der Erstellung und Analyse des Quelltextes unterstützen. Solche Programme kennen einige Bestandteile einer Programmier- oder Beschreibungssprache (etwa HTML, CSS oder JavaScript) und unterstützen einfache und teilweise auch komplexere Standardvorgänge, beispielsweise das Maskieren (die kodierte Darstellung) von Sonderzeichen, das Einfügen von Quellcodeschablonen oder die bessere Übersichtlichkeit durch farbliche Kennzeichnung von bekannten Befehlen. Einige Editoren bieten einem Programmierer die Befehle einer verwendeten Sprache auch direkt an – etwa durch Menüs oder Symbolleisten, wo der Anwender diese auswählen kann (auch mit der Maus). Ein weiteres Feature, das einige Programme bieten, ist die Bereitstellung von verschiedenen Ansichten eines Dokuments. Das ist insbesondere bei reinen HTML-Editoren oft zu finden. Dort kann man in vielen Fällen zwischen der Vorschau einer Webseite (also wie sie in einem Browser aussehen wird), einem grafischen Erstellungsmodus und vor allem einer Ansicht des eigentlichen HTML-Codes hin- und herschalten. Alle diese Features erleichtern sowohl die Erstellung von Webseiten als auch von AJAX-Applikationen.
1.5.7
Firefox zur IDE für die Webentwicklung ausbauen
Firefox ist nicht nur einer der populärsten und besten Webbrowser. Es gibt mittlerweile für Firefox bzw. dessen Verwandte zahlreiche Erweiterungen (sogenannte Add-ons), die für die Webentwicklung sehr sinnvoll sind.21 Damit können Sie Firefox (oder auch teilweise seine Verwandten) fast zu einer IDE für die Webentwicklung ausbauen, wenn man den Editor zur Erzeugung des Quellcodes einmal außen vor lässt. Auch interagieren einige AJAX-Toolkits und -Frameworks unmittelbar mit verschiedenen Firefox-Add-ons (und oft auch mit Standardkomponenten von Firefox wie der Konsolenebene).
20 ;-). 21 Für keinen anderen Browser haben Sie derzeit eine so aktive Community, die immer wieder neue Add-ons entwickelt.
35
1 Einleitung
Hinweis Eine IDE (Integrated Development Enviroment – auf Deutsch »Integrierte Entwicklungsumgebung«) bezeichnet eine Programmierumgebung mit verschiedenen Features wie beispielsweise einer Vorschau, der grafischen Erstellung von Quellcodestrukturen, diverser Fehlersuchmöglichkeiten. Das bedeutet, unter einer Oberfläche beziehungsweise im Rahmen eines Programms werden verschiedene Tools für die unterschiedlichen Aspekte bei der Entwicklung einer Applikation zusammengefasst. Der Entwickler kann über diese zentrale Oberfläche alle oder zumindest die wichtigsten Dinge machen, die bei der Entwicklung notwendig sind. Um die volle Funktionalität von Firefox nutzen zu können, sollten Sie Firefox (auf den wir uns hier beschränken – Analoges gilt aber auch für seine Verwandten) erst einmal auf eine besondere Art und Weise installieren. Sie dürfen – zumindest bei einigen Varianten von Firefox – nicht die Standardinstallation wählen, sondern sollten eine benutzerdefinierte Installation durchführen. Tipp Sollten Sie Firefox schon mit dem Standardverfahren installiert haben, installieren Sie ihn einfach noch einmal benutzerdefiniert neu in das gleiche Verzeichnis. Eventuelle Einstellungen, Lesezeichen etc. bleiben dabei erhalten.
Der entscheidende Grund ist, dass Sie erst dann in einigen Firefox-Versionen in einem Dialog spezielle Komponenten für die Webentwicklung auswählen können, auf denen auch einige Erweiterungen explizit aufsetzen und die Ihnen andernfalls nicht zur Verfügung stehen. Insbesondere können Sie bei der benutzerdefinierten Installation den sogenannten DOM Inspector auswählen, wenn Ihnen dieser noch nicht zur Verfügung steht. Dieser ist ein hervorragendes Hilfsmittel, um unter anderem die Bestandteile einer Webseite oder auch eines XML-Dokuments in Form einer baumartig aufgebauten Objektstruktur zu analysieren (dem sogenannten DOM, auf den wir noch sehr ausführlich in dem Buch zu sprechen kommen). Zudem gibt er zahlreiche Informationen über Stylesheets in einer Webseite. Sie finden ihn, wenn Sie ihn in der benutzerdefinierten Installation ausgewählt haben, im Menü EXTRAS.
36
1.5 Was benötigen Sie?
Abbildung 1.7: Der DOM Inspector hilft bei der Analyse einer Webseite.
Die prinzipielle Installation von Erweiterungen (Add-ons) für Firefox Mithilfe der Add-ons können Sie Firefox zu einer Zentrale der Webentwicklung aufbauen. Der mit Abstand einfachste Weg zur Installation einer Firefox-Erweiterung ist, dass Sie auf die Download-Seite des Mozilla-Projekts (https://addons.mozilla.org/) gehen, in dem Suchdialog den Namen des gewünschten Add-on eingeben und dann den Installations-Hyperlink für Ihren Browser anklicken. Auch über ein Menü von Firefox kommen Sie zu der Webseite für die Installation der Add-ons. Wählen Sie dazu einfach EXTRAS/ERWEITERUNGEN oder EXTRAS/ADD ONS. Im folgenden Dialog, der Ihnen alle bereits installierten Add-ons anzeigt, finden Sie unten rechts den Befehl ERWEITERUNGEN HERUNTERLADEN. Dieser öffnet ein neues Browser-Fenster mit der Download-Seite des Mozilla-Projekts. Die interessanteste Kategorie in der Download-Seite des Mozilla-Projekts dürfte für unser Thema Webentwicklung sein. Es lohnt sich sicher, in einer ruhigen Minute alle verfügbaren Add-ons durchzublättern. Sie werden sicherlich einige echte Perlen finden.
37
1 Einleitung
Abbildung 1.8: Die Add-ons-Seite für Firefox mit komfortablen Suchmöglichkeiten
Abbildung 1.9: Über den Link unten gelangen Sie auch zur Webseite, über die sich Erweiterungen von Firefox finden und installieren lassen.
38
1.5 Was benötigen Sie?
Hinweis Im Anhang finden Sie einige interessante Add-ons für Firefox beschrieben. Was Sie auf jeden Fall installieren sollten, ist das Add-on Firebug. Das ist mehr oder weniger das Schweizer Taschenmesser für die Webentwicklung.
1.5.8
Aptana
Aus verschiedenen Gründen soll im Rahmen dieses Buchs eine kostenlose IDE zur Entwicklung von Webapplikationen besonders hervorgehoben werden – Aptana (http://aptana.com/)!
Abbildung 1.10: Die Homepage des Aptana-Projekts
39
1 Einleitung
Aptana22 basiert unmittelbar auf einer anderen IDE – Eclipse (http://www.eclipse.org). Eclipse steht unter der EPL23, ist selbst in Java geschrieben und benötigt von daher zum Ausführen eine passende Java-Laufzeitumgebung. Es handelt sich um eine modulare, plattformunabhängige Entwicklungsumgebung, die ursprünglich von IBM entwickelt wurde und die es für verschiedene Betriebssysteme gibt. Obwohl Eclipse auch auf den Schwerpunkt der Entwicklung von Java-Applikationen ausgerichtet ist, kann die IDE mithilfe unzähliger Plug-ins für nahezu alle Programmiertechniken, Designtechniken wie UML sowie Dokumentenbeschreibungstechnologien wie HTML oder XML verwendet werden24 – oder eben mit einer spezialisierten Erweiterung davon wie Aptana. Aptana kann sowohl als Teil einer vorhandenen Eclipse-Umgebung (als Plug-in) installiert werden wie auch als eigenständige Applikation, die funktional die gleichen Möglichkeiten in Hinsicht auf Webprogrammierung bereitstellt, die Eclipse mit Aptana-Plug-in auch bietet.25
Abbildung 1.11: Aptana gibt es für Windows, Mac, Linux und als Eclipse-Plug-in. Die Aptana-IDE bietet einen Quellcodeeditor und unterstützt mit zahlreichen Features direkt JavaScript, HTML und CSS sowie den Zugriff auf das DOM-Objektmodell und auch AJAX selbst. Dabei versucht die Code-Assist-Funktion, verschiedene Benutzereingaben in Form einer Autovervollständigung zu ergänzen und Syntax wird durch Syntaxhighlighting (farbliche Kennung von Schlüsselbegriffen und Syntaxstrukturen) hervorgehoben. Besonders interessant ist aber die Möglichkeit, die Eigenschaften und Methoden von Objekten angezeigt zu bekommen. Das Programm bietet sogar einen Debugger für JavaScript. Und Aptana beinhaltet zudem einen eigenen kleinen Webserver, über den Sie eine AJAX-Applikation ohne die Installation eines eigenständigen Webservers testen können. 22 Bzw. vollständig Aptana Studio. 23 Eclipse Public License (EPL) ist eine Open Source-Softwarelizenz. 24 Allerdings ist Eclipse durch die Mächtigkeit nicht ganz einfach im Umgang. Und wegen der Java-Basis muss die Hardware auch entsprechend gut bei Kräften sein. Dennoch lohnt sich eine Beschäftigung mit dieser IDE in sehr vielen Fällen. 25 Ich habe sowohl mit dem Eclipse-Plug-in als auch der eigenständigen Version experimentiert und bin persönlich mit der eigenständigen Version zufriedener. Die Varianten des Plug-ins, die ich ausprobiert habe, waren etwas instabil. Allerdings hatte es sich dabei um Betaversionen gehandelt.
40
1.6 Zusammenfassung
Für das Thema AJAX-Frameworks ist es jetzt besonders interessant, dass Aptana eine ganze Reihe von Frameworks, die wir in dem Buch behandeln, direkt unterstützt beziehungsweise gleich mitliefert, beispielsweise Dojo, Prototype, Rico oder YUI.
Abbildung 1.12: Aptana gestattet den Import und die Verwaltung von JavaScript-basierenden AJAX-Frameworks. Darauf werden wir natürlich explizit zurückkommen, wobei wir die Frameworks und Toolkits unabhängig vom Aptana-Assistenten einsetzen.
1.6
Zusammenfassung
Sie haben in diesem einleitenden Kapitel erfahren, wer Sie durch das Buch führt, um was es in dem Buch geht und an wen es sich wendet, sowie wie das Buch aufgebaut ist. Dazu wurden alle wichtigen Voraussetzungen besprochen, damit Sie erfolgreich die Erstellung von RIAs auf Basis von AJAX und AJAX-Frameworks angehen können. Und das ist nun das Thema der nächsten Kapitel.
41
2
Die Welt von AJAX – zentrale Grundlagen
Viele Frameworks und Toolkits für AJAX1 und die Erstellung von Webapplikationen im Allgemeinen sind als reine JavaScript-Erweiterungen für den Browser konzipiert – also JavaScript-Bibliotheken mit diversen nützlichen Funktionen, die wir in diesem Buch in den Fokus stellen. Andere Frameworks laufen auf dem Webserver und arbeiten dort mit Programmiersprachen wie PHP, ASP.Net, Java oder Python. Die eigentliche Oberfläche der Webapplikation, wie sie der Besucher in seinem Client letztendlich sieht, wird – quasi unsichtbar für den Programmierer – auf dem Server generiert und dann zum Client geschickt. Weitere Frameworks gestatten selbst die visuelle Erstellung von den Oberflächenparts einer Web- bzw. AJAX-Applikation (sogenannte Web-Controls oder auch Komponenten bzw. Widgets) mit dem Zuordnen von spezifischen Events zu bestimmten Komponenten des Web-Interface, wenn ein Framework eine grafische Entwicklungsumgebung (IDE) mitbringt oder sich darin integrieren lässt. In diesem Kapitel wollen wir uns mit den Grundlagen zu den zentralen Technologien rund um AJAX beschäftigen. Ich möchte noch einmal eindringlich davor warnen, zu glauben, dass AJAX-Frameworks und -Toolkits2 ohne elementare Grundlagenkenntnisse der Basistechnologien sinnvoll und effektiv angewendet werden können. So wie Marketingaussagen vieler Softwareproduzenten das Gefühl suggerieren sollen, dass die Erstellung von Webseiten beispielsweise mit ihrem ach so guten WYSIWYG3-Editor vollkommen ohne HTML-Kenntnisse funktioniert, so scheinen einige Ausführungen rund um AJAX-Frameworks und -Toolkits den Eindruck vermitteln zu wollen, dass man bloß ein solches System anwenden muss und schon hat man wie von Zauberhand eine RIA. Aber dem ist nicht so. Never ever! Es ist unabdingbar, dass Sie sich richtig gut mit HTML und möglichst auch XHTML und vor allen Dingen JavaScript auskennen und zumindest grundlegende Kenntnisse im Aufbau von TCP/IP, HTTP samt den Details zum Datenaustausch mit AJAX und CSS haben. Und dazu sollten Sie wie gesagt auch ganz grob wissen, was es mit XML und JSON auf sich hat. Und genau dieses doch recht umfangreiche Wissen – zumindest die Grundlagen – soll dieses einleitende Kapitel vermitteln. 1 2 3
Bzw. die Bibliotheken von Toolkits. Insbesondere solche, die explizit als JavaScript-Bibliotheken konzipiert sind. What you see is what you get.
2 Die Welt von AJAX – zentrale Grundlagen
2.1
Das WWW
Das WWW entstand im Jahr 1989 im Kernforschungszentrum CERN in der Nähe von Genf. Das WWW sollte die Bedienung des bis dato rein kommandozeilenbasierenden Internets erheblich vereinfachen. Kern des neuen Dienstes wurden das Dienstprotokoll HTTP, die Dokumentenbeschreibungssprache HTML sowie die Programmtypen Webserver und Webbrowser. Hinweis Im Anhang finden Sie ein paar grundlegende Informationen zu den technischen Grundlagen des Internets selbst (Client-Server-Prinzip, TCP/IP, verbindungsorientierte versus zustandsloser Datenkommunikation).
Nun ist das Internet ein Client-Server-System, bei dem jede Aktion aus einem Zyklus »Anfordern einer Leistung – Bereitstellen der Leistung« besteht. Im Fall des WWW ist das der Zyklus »Anfordern einer Webseite oder Datei, die in der Webseite verwendet wird4 – Senden der Webseite oder Datei«. Sobald die angeforderte Datei im Client angekommen ist, kann sie verwendet werden. Konkret bedeutet das, dass im Web so gut wie immer ein Browser eine neue Webseite anfordert und eventuell darin referenzierte externe Ressourcen wie Grafiken nachgefordert werden, die dann zusammen mit der Webseite im Browser dargestellt werden. In der Anfangsphase des Webs war so ein Anfordern einer Webseite durch einen Client und deren Darstellung nach Erhalt der Antwort vollkommen ausreichend. Aber bereits nach wenigen Jahren genügten vielen Leuten rein statische Webseiten nicht mehr. Insbesondere die mangelnden Möglichkeiten der Interaktion mit einem Betrachter einer Webseite stellten ein Dilemma dar. Das Problem war zum damaligen Zeitpunkt nicht, dass jede Eingabe einer neuen Webadresse in der Adresszeile des Browsers oder der Klick auf einen Hyperlink mit einer Verknüpfung zu einer anderen Webseite eine Webseite notwendig machte. Der Anwender will ja in so einem Fall bewusst eine neue Information haben, die bis dato noch nicht auf seinem Rechner verfügbar ist. Aber auch jede beliebige andere Anwenderaktion, auf die reagiert werden muss, ergab zu dieser Zeit eine Anforderung an einen Server, eine neue Webseite zu schicken und gegebenenfalls vorher schon gewisse Operationen wie Plausibilisierungen vorzunehmen. Betrachten wir folgende Situation: Ein Anwender soll in einem Webformular seine Zahl eingeben. Er gibt aber einen Buchstaben ein. Alleine die primitive Plausibilisierung dieser Eingabe erforderte das Versenden der kompletten Formulareingaben an den Webserver und die Rücksendung einer
4
44
Zum Beispiel eine Grafik.
2.1 Das WWW
vollständigen neuen Webseite, in der zu einer Fehlermeldung zudem alle anderen bisherigen Eingaben des Anwenders erhalten bleiben sollten, sofern diese korrekt sind. Allgemein stellt jede Reaktion auf eine Anwenderaktion einen solchen Zyklus aus der Übermittelung von Formulardaten an einen Webserver, Verarbeitung auf dem Webserver und der Sendung einer vollständigen Webseite als Antwort dar. Aufgrund der Tatsache, dass Daten unter Umständen mehrfach um die Erde kreisen und ein Webserver also bei jeder Anfrage durch einen Nutzer eine vollständig neue Webseite erzeugen und übermitteln muss, ist das Verhalten einer typischen Webapplikation sehr träge und zudem sehr belastend für den Webserver sowie die Kommunikationswege.
2.1.1
Clientseitige Webprogrammierung als erste Optimierung
Um der mangelnden Performance von Webapplikationen bei gleichzeitiger Belastung der Kommunikationswege und des Servers sowie dem Brachliegen der Clientressourcen zu begegnen, entstanden etwa 1995 clientseitige Programmiertechniken. Auf der einen Seite waren es Skriptsprachen wie JavaScript oder VBScript, die im Webbrowser ausgeführt werden. Auf der anderen Seite entwickelten verschiedene Firmen Möglichkeiten, vollständige Programme in eine Webseite zu implementieren – etwa in Form von Java-Applets oder ActiveX-Controls. Die Hauptfunktion von allen clientseitigen Programmiertechniken war eine Verlagerung von der Funktionalität vom Server auf den Client, die dort bereits erledigt werden kann. Denken wir noch einmal an Daten, die auf dem Client in einem Webformular erfasst werden. Wenn dort ein Anwender wie gesagt statt Zahlen Buchstaben einträgt, werden die fehlerhaften Daten – unter Umständen rund um die Welt – zum Server geschickt und dann die banale Fehlermeldung als Antwort zurück zum Client geschickt. Mit clientseitiger Programmierung ist es möglich, dass der Fehler bereits beim Client bemerkt wird und die Daten überhaupt nicht zum Server gesendet werden müssen. Clientseitige Skripte und Programme in Webseiten erlauben es einem Webbrowser, selbst auf eine intelligente Weise mit Situationen umzugehen, die sonst ein Programm auf dem Webserver oder eine Aktion durch den Anwender erforderlich machen. Wesentlicher Effekt ist damit eine Beschleunigung vieler Vorgänge, da der Browser keine Anfrage an den Server schicken und die Antwort nicht abwarten muss. Hinweis Wenn schon damals die Marketingleute das Internet entdeckt hätten, wäre der Begriff Web 2.0 hier schon angebracht gewesen. Und er hätte meiner Meinung nach viel besser gepasst als heute.
45
2 Die Welt von AJAX – zentrale Grundlagen
Probleme bei clientseitiger Programmierung Über clientseitige Programmiertechniken ließen sich natürlich nicht alle Aufgaben auf einen Client verlagern. Alle Aktivitäten mit zentraler Datenhaltung müssen zum Beispiel zwingend auf dem Server erledigt werden. Ebenso sollten sicherheitsrelevante Dinge wie die Überprüfung von Zugangsdaten nicht im Client stattfinden. Dummerweise hat der Einsatz von clientseitiger Programmierung aber noch weitere gravierende Nachteile. Es muss vor allen Dingen gewährleistet sein, dass das Skript oder Programm im Rahmen einer Webseite beim Client auch ausgeführt werden kann. Und das hat sich bei clientseitiger Programmierung als riesiges Problem erwiesen. Wegen unterschiedlichster Gründe bekam clientseitige Programmierung insbesondere ab etwa dem Jahr 2000 immer mehr Probleme. Einige clientseitige Programmiertechniken erwiesen sich als gravierend unsicher. Deshalb wurde von vielen Leuten eine Art Sippenhaft für clientseitige Programmierung und Clienttechniken im Allgemeinen gefordert (auch für weitgehend ungefährliche Techniken wie JavaScript). Ein weiteres Problem clientseitiger Programmierung bestand darin, dass es einige proprietäre Standards gab, die nicht in allen Webbrowsern implementiert wurden, und einige Techniken durch marktpolitische Spielchen großer Softwarefirmen unter die Räder kamen.
2.1.2
Rückverlagerung auf den Server
Die verschiedenen Probleme bei clientseitiger Programmierung bewirkten etwa ab dem Jahr 2000 die zunehmende Rückverlagerung von Aktivität auf den Webserver, obwohl im Client viele dieser Aufgaben bereits gelöst werden konnten. Aufgrund dieser Situation im Web kann man rückblickend beobachten, dass das Web ab dem Jahr 2000 für einige Zeit auf das Niveau zurückgefallen war, das es bereits vor 1995 hatte.
2.1.3
Der Status quo
Mittlerweile ist die Hysterie bezüglich der Gefahren clientseitiger Programmierung abgeklungen und clientseitige Programmierung erobert sich den Teil an Aktivität im Web zurück, der sinnvollerweise schon im Client erledigt werden sollte. Zwar ist als einziger Vertreter der clientseitigen Zunft nur noch JavaScript übrig geblieben, aber der wird mittlerweile wieder flächendeckend eingesetzt. Schauen Sie sich heute einmal populäre Webseiten im Internet an. Keine einzige der heutzutage angesagten Webseiten kommt ohne clientseitige Programmierung mit JavaScript daher. Und fast alle Anwender im Web haben JavaScript im Browser aktiviert. Denn kaum ein Anwender möchte auf den Nutzen populärer Webangebote wie Google, Amazon, eBay, Wikipedia oder Yahoo verzichten. Als Ersteller von Webangeboten können Sie im Umkehrschluss also JavaScript samt zusammenhängenden Techniken heutzutage wieder bei den meisten Clients voraussetzen.
46
2.1 Das WWW
2.1.4
Das Konzept von AJAX und das Web 2.0
Nun reden wir in diesem Buch ja über AJAX-Frameworks und -Toolkits. Was bezeichnet denn AJAX konkret und woher kommt der Begriff? Ein Problem von HTTP ist weder durch einseitige Programmierung auf Server oder Client noch einer Arbeitsteilung zu lösen: die Notwendigkeit, bei der Reaktion auf eine Anfrage nach neuen Daten durch einen Webbrowser an einen Webserver immer eine vollständige Webseite als Antwort zu senden. Und hier kommt AJAX ins Spiel! AJAX beschreibt im engeren Sinne nur eine sukzessive immer weiter standardisierte Vorgehensweise, wie man eine Reaktion einer Webapplikation in (nahezu) Echtzeit gewährleisten kann, obwohl neue Daten vom Webserver angefordert werden. Statt einer vollständigen Webseite wird eine AJAX-Datenanfrage dazu führen, dass nur die neuen Daten vom Webserver geschickt und diese dann in die bereits beim Client geladene Webseite »eingebaut« werden. Vereinfacht gesagt, werden Daten5 bei der Verwendung von AJAX also erst dann vom Webserver angefordert, wenn sie benötigt werden, dann für JavaScript6 verfügbar gemacht und anschließend in die bestehende Webseite eingebaut. Dabei wird in der Regel die normale Interaktion des Benutzers mit der Webapplikation nicht durch das Laden einer neuen Webseite unterbrochen. Das Laden erfolgt bei Bedarf asynchron zur Interaktion, die der Benutzer wahrnimmt, was einen weiteren Teil des Namens erklärt. Diese asynchrone Kommunikation kann und wird im Extremfall so weit gehen, dass ein Anwender in einem Webformular über ein Eingabefeld ein Zeichen auf der Tastatur eingibt und direkt nach Eingabe des Zeichens bereits eine ergänzende Information vom Server nachgeladen wird. So etwas kennen Anwender bereits von vielen Desktop-Anwendungen mit Suchfunktionen. Aber im Web ist diese komfortable Unterstützung des Anwenders bisher daran gescheitert, dass immer eine vollständige Webseite ausgetauscht werden musste.
AJAX – eine Ansammlung von Totgesagten Nun bezeichnet AJAX ganz konkret im Wesentlichen Technologien, die schon lange im Web etabliert sind und vielfach von sogenannten Experten schon totgesagt wurden7 – beginnend bei HTML und HTTP über JavaScript und CSS bis hin zu XML. Auch die asynchrone Nachforderung von Daten, die in eine Webseite integriert werden sollen, gibt es schon seit ungefähr 1998. Allgemein wurde dieses Verfahren zur asynchronen Nachforderung von Daten per HTTP, die in einen HTML-Kontext eingebaut werden sollten, früher mit dem Begriff XMLHttpRequest beschrieben.8 Die ersten Techniken zur clientseitigen Anforderung 5 6 7 8
Entweder einfacher Klartext oder strukturierter Klartext wie bei JSON oder XML, wobei Letzteres zur Namensgebung von AJAX entscheidend beiträgt. Daher das JavaScript in »Asynchronous JavaScript and XML«. Und wie so oft – Totgesagte leben länger! Dieser Bezeichner findet sich heute als Name für das Kommunikationsobjekt wieder.
47
2 Die Welt von AJAX – zentrale Grundlagen
von Daten auf diese Weise per HTTP gehen auf das Outlook Web Access Team von Microsoft zurück und wurden in den Microsoft Exchange Server als auch den Internet Explorer integriert. Später folgten weitere isolierte Anwendungen, die sich aber nicht flächendeckend durchsetzen konnten. Der Zusammenschluss dieser also schon einige Zeit bekannten, aber teilweise noch nicht lange standardisierten Techniken, unter dem Begriff AJAX ist relativ neu. Wem genau die Erfindung dieses Begriffs zuzuordnen ist, ist nicht eindeutig. Allerdings hat ihn ein Mitarbeiter der Agentur Adaptive Path mit Namen Jesse James Garrett in seinem Essay »Ajax: A New Approach to Web Applications« maßgeblich geprägt und bekannt gemacht.
Abbildung 2.1: Der berühmte Beitrag von Jesse James Garrett, der zum Begriff AJAX führte
48
2.1 Das WWW
Und da das Schlagwort AJAX unmittelbar mit dem Begriff Web 2.0 einhergeht, muss natürlich auch Tim O’Reilly erwähnt werden, der mit seinem Artikel »What is Web 2.0« im September 2005 dieses zweite bekannte Buzzword erstmals geprägt und den Boom initiiert hat.
Abbildung 2.2: Der Begriff Web 2.0 – die Urzelle Richtig populär begann AJAX als Begriff zu werden, als Google das Verfahren immer mehr für einige bekannte Anwendungen wie beispielsweise Google Groups, Google Maps, Gmail und Google Suggest verwendete und die AJAX-Unterstützung in der Gecko-Engine, auf der viele wichtige Browser basieren, erheblich weiterentwickelt wurde.
49
2 Die Welt von AJAX – zentrale Grundlagen
Abbildung 2.3: Google suggest ist eine der ersten »echten« AJAX-Applikationen mit RIACharakter.
2.2
Die Kerntechniken von AJAX
Wir werfen nun einen genaueren Blick auf alle relevanten Techniken, die bei AJAX eine Rolle spielen. Sie werden beim Einsatz von Frameworks und Toolkits unweigerlich damit in direkte Berührung kommen – teils direkt, teils auch indirekt.
2.2.1
HTML und XHTML
Im Kern jeder RIA bzw. AJAX-Applikation steht ohne wenn und aber HTML oder XHTML – genau wie bei jeder »klassischen« Webapplikation. Bei HTML handelt es sich um eine Weiterentwicklung der von IBM entwickelten und in der ISO-Norm 8779:1986 festgeschriebenen Sprache SGML (Structured Generalized Markup Language) mit einem festgelegten Satz von Anweisungen, mit der die logischen Strukturen eines Textdokuments beschrieben werden.
50
2.2 Die Kerntechniken von AJAX
Zu einer so beschriebenen logischen Dokumentenstruktur gehören Texte, Überschriften und Bilder, aber auch Verweise, Kapitel, Unterkapitel, Absätze, Aufzählungen, Tabellen, Formatvorlagen, Skripte, Referenzen auf multimediale Elemente (Grafik, Sound, Video usw.) gehören dazu. Die Einbindung von externen Ressourcen erfolgt als Referenz auf eine entsprechende Datei in Form eines URL. HTML-Dateien bestehen – wie nahezu alle interpretierten Formate im Web – aus reinem Klartext. Dies bewirkt die Plattformunabhängigkeit von Webseiten. Plattformabhängig ist immer nur die Software zum Interpretieren der HTML-Dateien (der Browser). Hinweis Kenntnisse zu HTML und XHTML werden in diesem Buch weitgehend vorausgesetzt. Im Anhang finden Sie dennoch einige Ausführungen zu grundlegenden Details. Sollten auch diese Ihnen zu knapp sein, finden Sie eine Vielzahl an guten Lehrbüchern und Dokumentationen speziell zu HTML. Sogar im Internet gibt es frei verfügbare Quellen.
2.2.2
Das Prinzip der Fehlertoleranz
Nun werden auch Dokumentenbeschreibungssprachen wie HTML über die Zeit immer weiterentwickelt. Es gibt dementsprechend eine Vielzahl von Browser-Varianten und ältere Browser kennen nicht die Befehle neuerer Sprachversionen, da zu deren Entstehungszeit die entsprechenden Befehle noch nicht vorhanden waren. Und selbst aktuelle Browser kennen oft nicht jeden Befehl im Sprachumfang der gesamten HTML-Familie – insbesondere, wenn es sich um eine Sonderanweisung irgendeines Browser-Herstellers handelt. Kurz gefasst – es gibt also Befehle, die der eine Browser kennt, der andere jedoch nicht. Hinweis Sinngemäß lassen sich diese Ausführungen auch auf andere Webtechnologien wie Stylesheets ausdehnen.
Was soll nun aber geschehen, wenn ein Browser eine Webseite mit einer Anweisung lädt, die er nicht versteht. Abstürzen? Oder eine Fehlermeldung bringen, mit der üblicherweise kein Anwender etwas anfangen kann? Es gibt noch eine dritte Lösung – ignorieren. Das mag zwar erst einmal nicht gerade positiv erscheinen, ist aber – zumindest bei der Beschreibung von Dokumenten – immer noch die beste der drei
51
2 Die Welt von AJAX – zentrale Grundlagen
Varianten. Das Ignorieren von unbekannten Anweisungen durch den Browser basiert auf dem Prinzip der Fehlertoleranz, welches zu den fundamentalen Verhaltensweisen von Browsern bei der Verarbeitung von HTML (und auch Stylesheets) gehört. Das Prinzip der Fehlertoleranz veranlasst Programme zur Auswertung von HTMLDokumenten, bei der Interpretation so fehlertolerant wie irgend möglich zu sein. Der äußerst positive Effekt ist, dass dann auch syntaktisch unkorrekte Dokumente so weit wie möglich ausgewertet werden können. So weit Browser korrekte Anweisungen vorfinden, werden diese Anweisungen ausgeführt. Falsche oder unvollständige Anweisungen werden ganz einfach ignoriert.9 Im ungünstigsten Fall bleibt reiner, unformatierter Text übrig und damit die eigentliche Information weitgehend erhalten. Das Prinzip der Fehlertoleranz ist unumgängliche Voraussetzung dafür, dass immer neue HTML-Anweisungen oder neue Technologien, die über Webseiten mit speziellen HTML-Anweisungen referenziert werden, im WWW eingeführt werden können und dennoch die älteren Browser beim Laden solcher Webseiten nicht »abschmieren«.10 Was sie nicht kennen, wird einfach ignoriert. Der Rest wird dargestellt. Eine Abwärtskompatibilität der HTML-Dokumente ist also immer sichergestellt, auch wenn signifikante Informationen beim Anzeigen teilweise verloren gehen können. Und das Prinzip der Fehlertoleranz sorgt ebenso dafür, dass fehlende Elemente in einer HTML-Seite quasi automatisch vom Browser im Hintergrund ergänzt werden, wenn die Ergänzung eindeutig möglich ist. So können Sie beim Erstellen einer Webseite im Grunde sogar auf das Grundgerüst verzichten. Es würde vom Browser quasi »hinzugedacht«. Hinweis Das Prinzip der Fehlertoleranz vereinfacht die Bereitstellung von Informationen erheblich und hat in der Anfangszeit ohne Zweifel erst den Erfolg des Webs ermöglicht. Allerdings verlieren solche nur lose reglementierten Klartextdokumente die Möglichkeit, zuverlässig von automatischen Analysesystemen (etwa Suchmaschinen oder Lesegeräten von Sehbehinderten) ausgewertet zu werden. Und natürlich geht ein Stück Information verloren, wenn es keine Eindeutigkeit von Strukturen gibt.
9
Wobei „syntaktisch unkorrekt“ dennoch voraussetzt, dass ein Browser diese „Fehler“ in gewisser Weise „erwartet“ und damit umgehen kann. 10 Im Gegensatz zu einer geschlossenen Nutzergruppe können Sie den Teilnehmern im Internet ja nicht so einfach mitteilen, dass es einen neuen Standard gibt und alle Teilnehmer zu dessen korrekter Verarbeitung auf ein neues Programm umzusteigen haben.
52
2.2 Die Kerntechniken von AJAX
2.2.3
JavaScript & Co
Eine der wichtigsten Erweiterungen von HTML sind Skriptsprachen. Bei den Skriptsprachen handelt es sich wie bei HTML um Interpretersprachen – nur eben nicht zur Beschreibung einer Dokumentenstruktur, sondern zur Programmierung. Es gab in der Geschichte des WWW nun diverse Skriptsprachen auf der Clientseite. Aber heutzutage sind eigentlich nur drei noch zu erwähnende Vertreter für die Steuerung und Programmierung eines Webbrowsers übrig geblieben. Das sind JavaScript, JScript und VBScript. VBScript wurde von Microsoft aus Visual Basic für das Web extrahiert und ist weitgehend auf die WINTEL-Plattform (Windows-Betriebssystem + INTEL-basierende Prozessoren) beschränkt. In der Praxis spielt VBScript im Web auf Clientseite11 heutzutage jedoch so gut wie keine Rolle mehr, denn die fehlende Unterstützung in allen relevanten Browsern außer dem Internet Explorer sowie gravierende Sicherheitsmängel haben nie zu einer wirklichen Akzeptanz geführt. Auf Clientseite programmiert man im Web heutzutage fast ausschließlich mit JavaScript respektive dessen weitgehend kompatiblem Microsoft-Clone JScript12, wenn man von isolierten und auf ein bestimmtes System beschränkten Lösungen absieht.13
Was ist JavaScript? Bei JavaScript handelt es sich um eine Skriptsprache mit einer Syntax, die von C stammt und die syntaktisch eine parallele Entwicklung wie Java genommen hat. Entwickelt wurde JavaScript im Wesentlichen in einer Kooperation von Netscape und Sun (dem Erfinder von Java). Hinweis Trotz der Ähnlichkeit des Namens und der teilweise gemeinsamen Wurzeln haben Java und JavaScript außer großen Teilen der Syntax wenig gemein. Insbesondere weichen das Konzept und die Zielrichtung vollkommen voneinander ab.
Bei JavaScript handelt es sich im Detail um eine plattformunabhängige, offene, (einigermaßen)14 leistungsfähige, einfach zu erlernende, fast überall im Internet unter11 Sowohl auf Seiten von Microsoft-Webservern als auch im Desktop-Bereich unter Windows hingegen hat VBScript auch heute noch eine gewisse Bedeutung. 12 JScript werden wir in der Folge nicht mehr ausdrücklich erwähnen. 13 Beispielsweise ActionScript für Flash oder echte Programme, die in Webseiten eingefügt werden und beim Anwender meist eine ganze Reihe von Voraussetzungen bezüglich der Plattform und der Umgebung erfordern. 14 Da muss man realistisch bleiben.
53
2 Die Welt von AJAX – zentrale Grundlagen
stützte und in Klartext notierte Skriptsprache zur Programmierung von Webseiten bzw. deren einbindenden Programmen. Skriptsprachen sind in der Regel von relativ einfacher Struktur15 und müssen als Interpretersprachen natürlich in irgendeinen Interpreter implementiert werden – natürlich auch im Web. Dabei ist es egal, ob es sich um serverseitige oder clientseitige Skriptsprachen handelt.16 Das ist beispielsweise über einen skriptfähigen Browser gewährleistet, wenn man ein Webskript in ein HTML-Gerüst einbindet, aber auch bei diversen Webservern. JavaScript ist so als eine unmittelbare Ergänzung und Erweiterung zu HTML zu sehen und nur als eingebundener Bestandteil eines HTML-Gerüsts zu verwenden. Webskripte werden als Klartext in eine Webseite direkt notiert oder hinzugebunden und zur Laufzeit interpretiert. Es gibt verschiedene Techniken, wie Skripte mit einer Webseite verbunden werden können. Hinweis Wichtige Details zur Einbindung von JavaScript in Webseiten finden Sie im Anhang. Ebenso finden Sie dort einige wichtige grundlegende Ausführungen zur JavaScript-Syntax, sofern Sie mit der Programmierung in JavaScript nicht vertraut sind.
2.2.4
DOM und der Zugriff auf Elemente einer Webseite
Es wird oft vorkommen, dass Sie in JavaScript selbst Objekte erzeugen oder Klassenelemente verwenden. So gut wie immer werden Sie in JavaScript-Codes Objekte nutzen, die Ihnen automatisch vom Browser zur Verfügung gestellt werden. Und diese Objekte basieren auf einem Objektmodell, das nicht zu JavaScript oder auch (X)HTML zählt, sondern die Strukturen von weitgehend beliebigen baumartig aufgebauten Dokumenten beschreibt – das DOM-Konzept (Document Object Model). Diese Objektbibliothek kann mittels diverser Techniken genutzt werden, sowohl aus Programmier- und Skriptsprachen als auch aus Anwendungen heraus. Dem Zugriff auf eine Webseite unter diesem Objektgesichtspunkt liegt mit DOM ein Konzept zugrunde, das sowohl eine plattform- als auch eine programmiersprachenübergreifende Schnittstelle bezeichnet.
15 Meist viel einfacher als vollständige Programmiersprachen. 16 Das im Internet praktizierte Client-Server-Prinzip erlaubt bei einer komplexeren Applikation – insbesondere einer RIA – die Aufteilung von Funktionalität auf beide beteiligten Partner. Sowohl der Client als auch der Server können diverse Funktionalitäten durchführen. Und auf beiden Seiten kommen Skripte zum Einsatz.
54
2.2 Die Kerntechniken von AJAX
In diesem Konzept wird eine (X)HTML-Seite (oder allgemein ein baumartig aufgebautes Dokument, z.B. auch ein XML-Dokument) nicht als statisch aufgebaute, fertige und nicht unterscheidbare Einheit, sondern als differenzierbare Struktur betrachtet, deren einzelne Bestandteile Programmen und Skripten dynamisch zugänglich sind. Dieser Ansatz ermöglicht die individuelle Behandlung von Bestandteilen einer Webseite auch dann, wenn die Webseite bereits in den Browser geladen ist – und zwar eine Behandlung, die weit über die einfache Interpretation durch den Browser beim Laden eines Dokuments von oben nach unten hinausgeht. Das DOM-Konzept beinhaltet verschiedene Teilaspekte. Es veranlasst beispielsweise einen Browser, eine (X)HTML-Seite zwar wie eine gewöhnliche Textdatei zu lesen und entsprechende (X)HTML-Anweisungen auszuführen. Darüber hinaus wird der Browser jedoch beim Laden der Webseite alle ihm im Rahmen des Konzepts bekannten und einzeln identifizierbaren Elemente einer Webseite bezüglich ihres Typs, ihrer relevanten Eigenschaften und ihrer Position innerhalb der Webseite indizieren. Dies ist eine Art Baum im Hauptspeicher des Rechners, der beim Laden der Webseite aufgebaut und beim Verlassen der Seite wieder gelöscht wird. Ähnliche Elemente werden dabei bei der Indizierung vom Browser gemeinsam in einem Feld verwaltet. Auf diese Weise hat der Browser nach dem Laden der Webseite genaue Kenntnis über alle relevanten Daten sämtlicher eigenständig für ihn ansprechbaren Elemente in der Webseite. Welche das jedoch sind und was er damit anstellen kann, das kann sich je nach Browser erheblich unterscheiden. Jedes ansprechbare Element (etwa ein bestimmtes (X)HTML-Tag) kann bei Bedarf auch während der Lebenszeit der Webseite aktualisiert werden – etwa wenn mittels eines Skripts die Position eines Elements in der Webseite verändert oder über Stylesheets nach dem vollständigen Laden der Webseite das Layout eines Elements dynamisch verändert wird. Viele Objekte im DOM-Konzept sind in Form einer Objekthierarchie verfügbar. Wenn ein Objekt einem anderen untergeordnet ist, notiert man das in der DOT-Notation, indem man erst den Namen des oberen Objekts und dann den des darunter angesiedelten Objekts notiert. Wenn man beispielsweise eine Webseite nimmt, ist sie über das Objekt document aus JavaScript heraus verfügbar. Da sich die Webseite in einem Browser-Fenster befindet und dieses als window ansprechbar ist, erfolgt der Zugriff über window.document. Ein Formular in einer Webseite ist über ein document untergeordnetes Objekt (oder genauer einem Datenfeld aus Objekten – ein sogenanntes Objektfeld) mit Namen forms und einem Index verfügbar. Beispiel: Listing 2.1: Das erste Formular in einer Webseite window.document.forms[0]
55
2 Die Welt von AJAX – zentrale Grundlagen
Über diese streng entlang der Verschachtelung der Objekte orientierte Zugriffsmöglichkeit auf DOM-Objekte hinaus gibt es weitere syntaktische Wege, die aber letztendlich alle das gleiche Objekt referenzieren und unabhängig von der Art des Zugriffs immer die gleichen Eigenschaften und Methoden bereitstellen. So gibt es zum Zugriff die Methoden getElementById(), getElementsByTagName() und getElementsByName() sowie die direkte Angabe des Namens. Wenn Sie für den Zugriff die Methode getElementsByName() (oder direkt den Namen) verwenden, müssen Sie den Namen des Elements (in der Regel als (X)HTML-Parameter bzw. -Attribut beim Tag notiert) als String-Parameter angeben (natürlich funktioniert diese Methode nicht, wenn ein Element keinen Namen hat). Allerdings müssen Sie zum Zugriff auf ein konkretes Element noch einen Index angeben, da die Methode getElementsByName() ein Array als Rückgabewert liefert. Beispiel: Listing 2.2: Beispiel für den Zugriff auf ein Element über den Namen document.getElementsByName("abc")[0]
Hinweis Ein name-Parameter in einer Webseite muss nicht eindeutig sein. So können durchaus mehrere Formularfelder in einer Webseite den gleichen Namen haben, wenn sie sich in verschiedenen Formularen befinden. Und durch das extrem fehlertolerante Verhalten der Browser können sogar Elemente den gleichen Namen haben, wenn sie sich im gleichen Namensraum befinden. Dann ist jedoch wegen der Mehrdeutigkeit ein Zugriff über den Namen diffizil (und vor allen Dingen browserabhängig). Sollte für ein Element im (X)HTML-Tag ein id-Attribut spezifiziert sein, können Sie mit getElementById() darauf zugreifen. Sie geben als String-Parameter einfach die ID an. Beispiel: Listing 2.3: Beispiel für einen Zugriff über die ID document.getElementById("user")
Wenn Sie auf ein Element einer Webseite über getElementsByTagName() zugreifen, geben Sie als String-Parameter einfach das Tag an. Allerdings müssen Sie noch einen Index angeben, da auch diese Methode ein Array als Rückgabewert liefert.
56
2.2 Die Kerntechniken von AJAX
Beispiel: Listing 2.4: Beispiel für einen Zugriff über die ID document.getElementsByTagName("h1")[3]
Textinhalt von DOM-Objekten ansprechen Bei AJAX wollen Sie in der Regel Textinhalte in einer Webseite austauschen, ohne die Webseite neu zu laden oder neu aufzubauen. Sie können dazu bei einem Element in der Webseite, das einen Text als Inhalt hat, diesen per JavaScript ansprechen und austauschen. Besonders wichtig ist im Zusammenhang mit der Datennachforderung per AJAX die Eigenschaft innerHTML. Als Alternative steht innerText zur Verfügung. Der Unterschied zwischen innerHTML und innerText ist recht gering. Sowohl über innerHTML als auch innerText haben Sie Zugang zum Inhalt eines HTML-Elements. Wenn Sie beim dynamischen Ändern des gespeicherten Inhalts bei innerHTML jedoch HTMLTags notieren, werden diese bei der Aktualisierung des Elementinhalts interpretiert. Das ist offiziell bei innerText nicht der Fall. Allerdings wirkt sich das bei vielen Browsern nicht aus. Wenn Sie HTML-Tags senden, werden sie bei beiden Eigenschaften interpretiert. Auch sonst sind diverse Probleme im Zusammenhang mit innerText bekannt, weshalb man in der Praxis fast ausschließlich innerHTML verwendet. Hinweis Im Anhang finden Sie eine Aufstellung der wichtigsten verfügbaren DOM-Objekte. Diese können Sie unmittelbar mit JavaScript aus einem Browser heraus verwenden.
2.2.5
Stylesheets und DHTML
Bei AJAX ist es ein zentraler Aspekt, dass eine Webseite verändert wird, nachdem sie im Browser geladen wurde. Und das ist im Grunde genau die Definition von DHTML. Wobei DHTML oft auch als die Verbindung von HTML bzw. XHTML, JavaScript und Stylesheets bezeichnet wird. Und auch damit haben wir einen zentralen Part von AJAX beschrieben. Formatvorlagen bzw. Stylesheets bestehen – wie HTML – aus reinem Klartext, der Regeln zur Formatierung von Elementen beschreibt. Moderne Webseiten reduzieren die Bedeutung von HTML und XHTML fast vollständig auf die reine Strukturierung der Seite, während das Layout gänzlich Stylesheets übertragen wird.
57
2 Die Welt von AJAX – zentrale Grundlagen
Hinweis Bei moderner Textauszeichnung von Webseiten greift man auf Regeln zurück, die schon ganz am Anfang des WWW eingeführt wurden, dann aber lange als rückständig galten. Am Anfang hat man im WWW zur Textauszeichnung meist sogenannte logische Beschreibungsanweisungen verwendet. Logische Hervorhebungen von Texten waren bei nichtgrafischen Oberflächen und darunter laufenden Browsern notwendig, da diese fette und kursive Zeichen nicht anzeigen konnten. Bei logischen Befehlen zur Textformatierung entscheidet der Browser, wie ein Text hervorgehoben wird. Im Zusammenhang mit CSS schätzt man, dass diese Auszeichnungen keine feste optische HTML-Eigenwirkung haben. Stylesheets stellen einmal den – mehr oder weniger erfolgreich umgesetzten – Versuch dar, den unterschiedlichen Interpretationen von Webseiten auf verschiedenen Plattformen einen Riegel vorzuschieben. Über Stylesheets können Sie in Formatregeln das Layout von Webseiten viel genauer als mit HTML festgelegen. Aber dies ist im Grunde nur ein Nebenprodukt. Stylesheets eröffnen die Möglichkeit, das Vermischen von Gestaltungsbefehlen und Informationsträgern aufzuheben. Es kann eine klare Trennung von Struktur und Layout erreicht werden. Und Sie können mittels JavaScript und Stylesheets eben auch gezielt Layout- oder Positionseigenschaften eines Elements der Webseite verändern, nachdem sie bereits in den Browser geladen wurde.
CSS – die Standardsprache des Webs Stylesheets bezeichnen keine eigene Sprache, sondern nur ein Konzept. Und es gibt nicht nur eine einzige Stylesheet-Sprache, sondern diverse Ansätze bzw. verschiedene Sprachen. Die genauen Regeln und die syntaktischen Elemente für die Stylesheets werden je nach verwendeter Sprache etwas differieren, aber oft ähnlich aussehen. Im Web kommen derzeit hauptsächlich die sogenannten CSS (Cascading Style Sheets) zum Einsatz. Allgemein liegen bei einer Anwendung von Stylesheets Daten in einer Rohform oder einer nicht gewünschten Darstellungsweise vor, die auf spezifische Weise verändert werden soll. Die Darstellung der Daten erfolgt dann in einer anderen Form, wobei die Informationen selbst meist erhalten bleiben. Unter Umständen werden allerdings im Ausgabedokument Daten der Quelle unterdrückt und/oder durch Zusatzdaten ergänzt. Die Beschreibung der Transformation bzw. Formatierung erfolgt in der Regel in Form einer externen Datei, kann aber auch in einigen Situationen direkt in die Datei mit den Daten notiert werden (etwa eine Webseite). Stylesheets geben vorhandenen Informationen also einfach ein neues Aussehen. Dazu werden die Daten und die Formatierungsinformationen von einem interpretierenden System zu einer neuen Darstellung verarbeitet.
58
2.2 Die Kerntechniken von AJAX
Stilregeln können in Webseiten im Grunde auf beliebige HTML- beziehungsweise XHTML-Elemente angewendet werden. Es gibt jedoch einige Elemente, die sich besonders nachdrücklich für die Anwendung von Stylesheets eignen und manchmal sogar ihren einzigen Nutzen daraus beziehen, dass sie mit Stylesheets formatiert werden. Hinweis Im Anhang finden Sie verschiedene ergänzende Ausführungen zu CSS sowie Angaben, wie Sie Stylesheets in einer Webseite einbinden und verwenden können.
2.2.6
XML
In den letzten Jahren gewann XML (Extensible Markup Language) mehr und mehr an Bedeutung – im allgemeinen Datenaustausch, im Datenbankumfeld, zur Konfiguration von Programmen, zur Speicherung von Programmeinstellungen, aber auch im Rahmen des WWW. Viele Sprachen rund um das WWW sind aus XML entwickelt worden und jeder moderne Browser kann direkt XML-Daten anzeigen. Wenn Sie die XML-Daten dann auch noch mit Stylesheets formatieren, kann XML sogar wie gewöhnliches HTML zum Aufbau einer Webseite verwendet werden, obgleich dies beileibe nicht die Hauptaufgabe von XML darstellt und in der Praxis derzeit so kaum gemacht wird. Und XML ist natürlich im Zusammenhang mit AJAX immens wichtig. Hier scheint ja das X in der Abkürzung AJAX eine zwingende Verbindung zu XML zu bedeuten. Zwar ist das explizit nicht der Fall,17 denn durch die sehr unterschiedliche Behandlung von XML durch verschiedene Browser ist es derzeit oft besser, zum Client statt XML bereits aufbereitete (X)HTML-Fragmente, JSON oder Klartext zu schicken. Das ändert nichts daran, dass die Möglichkeiten von XML natürlich viele Perspektiven im Client eröffnen, die bei einer zuverlässigen Unterstützung in kommenden BrowserGenerationen immer wichtiger werden. Mit anderen Worten – XML ist nicht zwingend, aber sehr oft sinnvoll und zukunftsorientiert. Dies betrifft sowohl das Format für die Daten, die zwischen Server und Client ausgetauscht werden, als auch die Navigation auf den Daten im Client.
Die Struktur von XML-Dokumenten XML-Dokumente sind im Grunde reiner Klartext, der mit jedem Klartexteditor erstellt werden kann. Sie liegen aber immer in Form einer Baumstruktur vor und müssen strengen Regeln genügen. 17 Sie müssen kein XML zum Datenaustausch bei einer AJAX-Applikation verwenden.
59
2 Die Welt von AJAX – zentrale Grundlagen
Tipp Für die Erstellung von XML-Dokumenten bieten sich XML-Editoren an. Auch für Eclipse gibt es diverse Plug-ins zum Umgang mit XML.
Abbildung 2.4: Ein XML-Dokument in einem XML-Editor – hier ein Eclipse-Plug-in Auf einem XML-Baum ist eine Navigation zu den einzelnen Zweigen des Baums möglich. Dabei ist XML im Grunde wie HTML oder XHTML erst einmal nur eine Auszeichnungssprache (Markup Language), um über die Textinformation hinaus eine Struktur der Information zu bieten. Die in einem Dokument enthaltenen Informationen werden dazu durch Tags strukturiert, die wie in HTML auch unter XML in spitzen Klammern notiert werden.
60
2.2 Die Kerntechniken von AJAX
XML-Elemente Sogenannte Komponenten bilden die Bausteine eines XML-Dokuments. Die Grundstruktur eines XML-Dokuments besteht dabei aus Elementen, die – sofern sie nicht eingeschränkt werden – selbst Unterelemente enthalten können und die wichtigste Form von Komponenten darstellen. Elemente selbst sind so aufgebaut, wie man es im Wesentlichen von HTML kennt. Es gibt wie dort ein Anfangs-Tag und ein Ende-Tag, das hinter einem Slash den Bezeichner wiederholt – es sei denn, ein Tag wird als leeres Element gekennzeichnet. Die Elemente in XML sind im Gegensatz zu HTML oder XHTML aber nicht vorgegeben. Es gibt keinen vorgefertigten, beschränkten Sprachschatz an Elementen. Mit anderen Worten – es gibt keine vorgegebenen XML-Tags in dem Sinne, wie die meisten Anwender HTML-Tags kennen. Es existieren also keine Tags wie oder mit einer festen Bedeutung. Beispiel: Listing 2.5: Schema eines XML-Elements ...
Eventuell im Anfangs-Tag notierte Attribute werden auf keinen Fall im Ende-Tag wiederholt. Im Inneren des Elements kann – sofern nicht besondere Regeln vorgegeben sind – beliebiger Inhalt notiert werden. Das können weitere Elemente oder Text sein. Auch gemischte Formen sind erlaubt. XML erlaubt die Deklaration von leeren Elementen. Diese werden meist in Verbindung mit Attributen verwendet. Ein leeres Element wird mit einem Slash am Ende gekennzeichnet. Beispiel: Listing 2.6: Ein leeres Element
Zwischen dem Slash und dem Bezeichner darf ein Leerzeichen notiert werden. Diese Schreibweise wird sogar vom W3C empfohlen. Alternativ können Sie auch direkt nach dem Beginn-Tag das Ende-Tag notieren. Dabei darf aber nicht einmal ein Leerzeichen im Container stehen. Listing 2.7: Eine alternative Schreibweise für ein leeres Element
61
2 Die Welt von AJAX – zentrale Grundlagen
Hier wäre ein Beispiel einer vollständigen XML-Datei (trainings.xml): Listing 2.8: Eine vollständige XML-Datei 01 02 03 04 JavaScript - Video-Training 05 Einstieg für Anspruchsvolle 06 März 2007 07 http://www.video2brain.com/de/products-109.htm 08 DVD 09 10 11 JavaFX - Video-Training 12 Einstieg in JavaFX und JavaFX Script 13 April 2008 14 http://www.video2brain.com/de/products-223.htm 15 DVD 16 17 18 HTML und CSS - Online-Training 19
20 Mai 2008 21
22 Online 23 24 25 JavaScript - Online-Training 26
27 Mai 2008 28
29 Online 30 31 32 AJAX - Video-Training 33
34 Juni 2008 35
36 DVD 37 38 39 Eclipse - Video-Training 40
41 Juli 2008 42
43 DVD 44 45
62
2.2 Die Kerntechniken von AJAX
Im Gegensatz zu HTML oder XHTML, die auch über eine solche Semantik verfügen und neben jedem Tag auch dessen Bedeutung beschreiben, besteht XML lediglich aus einer Beschreibung der Syntax für Elemente und Strukturen. Damit ist XML freilich beliebig erweiterbar. Die XML-Spezifikation beschreibt lediglich, nach welchen Regeln Sie Elemente zu definieren haben. Die Festlegung der Elemente machen Sie selbst. Daher kann ein Leser oder Parser (zum Beispiel ein Webbrowser) die Bedeutung eines Elements aber auch nicht aus dem Kontext oder einer vorgegebenen Liste erschließen. Für einen konkreten Anwendungsfall (die Interpretation eines XMLDokuments) müssen sämtliche relevanten Details spezifiziert werden. Dies betrifft insbesondere die Festlegung der Strukturelemente und ihre Anordnung innerhalb des Dokumentenbaums. Im Gegensatz zu HTML ist XML syntaktisch eine sehr strenge Sprache, bei der es kein Prinzip der Fehlertoleranz gibt. Die XML-Spezifikation ist streng formal und lässt keine Ausnahmen und unklaren Strukturen zu. Dadurch ist XML jedoch einfach und automatisiert zu validieren. XML beschreibt nur wenige einfache, aber eben sehr strenge und absolut eindeutige Regeln, nach denen ein Dokument zusammengesetzt sein kann. Auch die Zielrichtung von XML und HTML beziehungsweise XHTML ist unterschiedlich. HTML und XHTML sind auf das Design von Webseiten hin optimiert, während ein zentraler Aspekt von XML die Trennung von Daten und ihrer Darstellung ist. Und nicht zuletzt kann man mit XML eine neue Sprache definieren. Diese muss dann alle Regeln einhalten, die für XML gelten. Eine solche Sprache definieren Sie, indem Sie Elemente einführen und eine Grammatik festlegen, wie diese Elemente zu verwenden sind. Genau so ist beispielsweise XHTML entstanden.
Die Anzeige von XML-Dokumenten Natürlich können Sie ein XML-Dokument in jedem Klartexteditor ansehen,18 aber eine interpretierte Darstellung der Struktur ist meist aussagekräftiger. Für so eine strukturelle Anzeige von XML-Dokumenten können Sie nahezu jeden neueren Webbrowser verwenden. Die meisten modernen Browser stellen die Struktur einer XMLDatei in Form eines Baums dar. Dabei erfolgt die Darstellung der verschiedenen Ebenen im Elementbaum entweder kollabiert (mit einem Pluszeichen, das dem Element vorangestellt ist) oder expandiert (mit einem Minuszeichen).
18 Damit kann es ja auch erstellt werden.
63
2 Die Welt von AJAX – zentrale Grundlagen
Abbildung 2.5: Darstellung einer XML-Datei in einem Browser
64
2.2 Die Kerntechniken von AJAX
Das Plus- und das Minuszeichen im Rahmen der Webseite sind sensitiv. Das bedeutet, wenn Sie es anklicken, wird der Zustand umgeschaltet. Ein kollabiertes Element wird expandiert und ein expandiertes Element kollabiert.
Abbildung 2.6: Außer dem Wurzelelement ist der Baum kollabiert. Die optische Darstellung der Baumstruktur wird mittels innerer Standard-CSS vom jeweiligen Webbrowser umgesetzt. Hinweis Sie können mit dem Firefox-Add-on Firebug sehr gut die Umsetzung der optischen Darstellung einer XML-Seite in eine Darstellung aus HTML und CSS erkennen.
Hinweis Sofern explizit eine Stylesheet-Datei mit dem XML-Dokument verknüpft ist, kann auch eine andere Darstellung der XML-Datei erfolgen. Dann wird von den meisten Browsern keine Baumdarstellung mehr gewählt.
65
2 Die Welt von AJAX – zentrale Grundlagen
Abbildung 2.7: Firebug zeigt, was wirklich hinter der optischen Darstellung der XML-Datei im Browser steckt. Tipp Im Anhang finden Sie noch einige ergänzende Ausführungen zur Syntax von XML.
2.2.7
JSON
Für den Datenaustausch in AJAX setzt sich mehr und mehr ein Datenformat mit Namen JSON (JavaScript Object Notation) als Alternative zu Klartext respektive HTML, was dann im Client nur noch dargestellt wird, oder XML, was Sie im Client weiterverarbeiten können, durch. JSON ist ein maschinenlesbares Klartextformat, das recht neu ist und trotz des Token JavaScript im Namen keinesfalls auf JavaScript beschränkt ist. Das Format ist zwar als Untermenge von JavaScript entwickelt wor-
66
2.2 Die Kerntechniken von AJAX
den, aber die vorhandenen Strukturen findet man so auch in Java und damit eigentlich in allen C-basierten Sprachen. Und es gibt zahlreiche Sprachenimplementierungen zur Verarbeitung von JSON. JSON ist zwar bedeutend weniger flexibel als etwa XML, aber damit viel kompakter und leichter sowie zuverlässiger zu verarbeiten. Mit JSON steht Ihnen eine Alternative zur Verfügung, die einerseits eine Struktur in das Übertragungsformat packt, andererseits aber einfacher wie XML ist und vor allen Dingen in verschiedenen Webbrowsern viel konsistenter verarbeitet wird. JSON beinhaltet direkte Datenstrukturen bzw. Datentypen (Objekte, Arrays, Zeichenketten, Zahlen, die booleschen Werte true und false sowie den Wert null), die verschachtelt und beliebig durch Leerzeichen und andere Whitespace-Zeichen strukturiert werden können. Das Konzept von JSON baut im Kern auf zwei zentralen Strukturen auf: Name/Wert-Paare. Solche Kombinationen findet man in fast allen modernen
Skript- und Programmiersprachen. Sie werden dann meist als Objekt (object), Satz (record), Struktur (struct), Wörterbuch bzw. Verzeichnis (dictionary), Hash-Tabelle (hash table), Schlüsselliste (keyed list) oder als ein assoziatives Array (associative array) implementiert. Oft findet man auch mehrere solcher Konstrukte in einer Sprache. Geordnete Werteliste. Auch solche Listen findet man in den meisten gängigen
Sprachen. Die Implementierung erfolgt je nach Programmiersprache über Arrays (array), Vektoren (vector), Listen (list), Sequenzen (sequence) oder mehrere solcher Strukturen. Beim Grundkonzept von JSON handelt es sich also um die Beschreibung von universellen Datenstrukturen, die von so gut wie allen modernen Programmiersprachen in der einen oder anderen Form unterstützt werden. Mit JSON steht damit ein Datenformat zum Austausch zwischen Programmiersprachen zur Verfügung, das auf diesen Strukturen aufbaut und insbesondere von diversen Programmiersprachen unmittelbar verarbeitet werden kann. Es ist mehr als naheliegend, sich beim Datenaustausch per AJAX auf so eine universelle Struktur zu verlassen, wenn man Logik rein über das Datenformat zum Client übermitteln möchte. Die konkrete Syntax von Formatdefinitionen ist in JSON an JavaScript angelehnt, wobei es keine Bezeichner für Objekte oder Datenfelder gibt.19 Eine Objektdefinition beginnt mit der geschweiften Klammer { und endet mit der geschweiften Klammer }. So ein Objektblock kann eine durch Kommas separierte,
ungeordnete Liste von Eigenschaften enthalten. Eine Eigenschaft wiederum besteht aus einem Schlüssel und einem Wert. Beide
werden durch einen Doppelpunkt getrennt. Der Schlüssel ist dabei eine Zeichenkette und der zugehörige Wert ist ein beliebiger Datentyp (ein Objekt, ein Array, eine Zeichenkette, eine Zahl oder einer der Ausdrücke true, false oder null). 19 Wie bei anonymen Klassen in Java.
67
2 Die Welt von AJAX – zentrale Grundlagen
Ein Array in JSON beginnt mit der eckigen Klammer [ und endet mit der eckigen Klammer ]. Auch ein Array kann eine durch Kommata separierte, hier aber geord-
nete, Liste von Werten enthalten. Eine Zeichenkette in JSON beginnt und endet wie üblich mit den doppelten Anführungszeichen ". Sie kann beliebige Unicode-Zeichen und Escape-Sequenzen enthal-
ten. Eine Zeichenkette in JSON ist einer Zeichenkette in C oder Java sehr ähnlich. Eine Zahl ist einfach eine Folge der Ziffern 0–9. Dabei kann man Vorzeichen und Dezimalpunkte sowie einen Exponenten über e oder E verwenden. Auch eine Zahl in
JSON ist einer Zahl in C oder Java ähnlich. Es gibt aber einen wesentlichen Unterschied. In JSON kann keine oktale oder hexadezimale Darstellung verwendet werden. Ein boolescher Wert wird wie üblich durch die Ausdrücke true bzw. false reprä-
sentiert. Nachfolgend finden Sie ein Beispiel für ein vollständiges JSON-Dokument: Listing 2.9: Ein vollständiges Dokument im JSON-Format 01 { 02 "Name" : "Steyer", 03 "Vornamen" : { 04 "VName1" : "Ralph", 05 "VName2" : "Jürgen", 06 "VName3" : null 07 }, 08 "Webseiten" : [ 09 "www.rjs.de", 10 "rjsedv.blogspot.com", 11 "haudichraus.blogspot.com", 12 "www.ajax-net.de", 13 "www.javafx.cc", 14 "www.safety-first.de.vu " 15 ] 16 }
Das Schöne an JSON ist, dass die Sprache wirklich einfach ist. Mit Ausnahme weniger Details zur Kodierung ist mit dem oben Gesagten bereits die gesamte Sprache beschrieben. Weitere Informationen finden Sie bei Bedarf unter http://json.org/json-de.html. Hinweis Wir werden im nächsten Abschnitt die Verarbeitung von JSON im Browser an Hand einer vollständigen AJAX-Anfrage sehen.
68
2.3 Come together right now – AJAX
2.3
Come together right now – AJAX
Schauen wir uns nun an, wie die bisher besprochenen Grundlagentechnologien im Rahmen von AJAX zusammenspielen. Dazu müssen wir zuerst noch einen genaueren Blick auf das Dienstprotokoll HTTP (HyperText Transfer Protocol) werfen, über das im WWW grundsätzlich die Kommunikation zwischen einem Webbrowser und einem Webserver erfolgt. Es ist schnell, einfach und zuverlässig. Auf der anderen Seite ist HTTP jedoch zustandslos, was die Verfolgung von Sitzungen und die ressourcenschonende Nachforderung von Daten erschwert.
2.3.1
Datenübertragung per HTTP
Sowohl beim -Tag eines Webformulars in HTML bzw. XHTML und dem dort vorkommenden method-Parameter als auch direkt unter AJAX legen Sie für die Datenübertragung per HTTP die genaue Art und Weise fest, wie die eingegebenen Daten zum Server gelangen und dort zu behandeln sind. Dabei wird gewöhnlich einer von den nachfolgenden zwei20 Werten verwendet: GET POST
Diese beiden Angaben spezifizieren unterschiedliche Möglichkeiten, mit HTTP Daten vom Client zum Server zu schicken. HTTP ist wie gesagt ein zustandsloses und transaktionsorientiertes Protokoll. Das bedeutet, zu jeder Anfrage eines Clients (der sogenannte Request) wird vom Empfänger (dem Webserver) genau eine Antwort (englisch: Response) generiert. Ein solcher HTTP-Request wird zum Beispiel von einem Webbrowser generiert, wenn Anwender einen URL in die Adresszeile des Browsers eingegeben oder auf einen Hyperlink in der Webseite geklickt haben. Ist die Anfrage erfolgreich, dann enthält die Antwort des Servers die angefragte Ressource zur Darstellung. Bei einer klassischen Webseite ohne Anwenderinteraktion ist der Frage-Antwort-Zyklus damit beendet. Ein solcher Zyklus läuft aber ebenso ab, wenn Benutzereingaben in einem HTMLFormular durch den Client abgeschickt werden oder auch per AJAX Daten vom Server angefordert werden. Und das soll dann ja im Fall von AJAX möglicherweise unbemerkt vom Anwender erfolgen.
20 Es gibt noch weitere Methoden, die aber in AJAX nur eine geringe bis gar keine Rolle spielen.
69
2 Die Welt von AJAX – zentrale Grundlagen
Hinweis Die sogenannten HTTP-Header (HTTP Request Header für die Anfrage und HTTP Response Header für die Antwort) werden dabei in Environment-Variablen (Umgebungsvariablen) auf dem Server übertragen. Diese Header-Informationen bestehen aus reinem Klartext.
Bevor die Daten vom Client an den Webserver gesendet werden, werden sie zunächst vom Browser zu einer einzigen Zeichenkette verpackt. Und die Art und Weise der weiteren Behandlung kann durch die Angabe von GET oder POST21 gesteuert werden. Bei der GET-Methode werden die Daten vor dem Versenden zusammen an das Ziel der Datenübertragung (den URL) angehängt, wobei die Daten durch ein ? von dem ursprünglichen URL abgetrennt werden. Diesen entstehenden Pseudo-URL sieht ein Anwender nach dem Abschicken eines Formulars im Adressfeld des Browsers.
Abbildung 2.8: Den Pseudo-URL kann man beim Versenden von Daten mit der GET-Methode in der Adresszeile des Browsers sehen. Tipp So einen Pseudo-URL können Sie natürlich auch manuell im Adressfeld des Browsers eingeben oder in einem Hyperlink aufrufen.
Bei POST werden die Daten in einem HTTP-Header-Feld versendet. Unabhängig22 von der verwendeten Versandmethode wertet das empfangende Programm beziehungsweise Skript auf dem Server den Inhalt dieser Umgebungsvariablen aus, wobei einige Arbeit zu leisten ist.
21 Und wie gesagt noch einigen weiteren Werten, die wir hier nicht verfolgen, da sie für AJAX nicht von Bedeutung sind. 22 Wenngleich meist mit verschiedenen serverseitigen Techniken. PHP verwendet neben einer universellen Technik zur Entgegennahme etwa $_POST zur gezielten (und ausschließlichen) Verarbeitung von POST-Anfragen und entsprechend $_GET für GET-Anfragen.
70
2.3 Come together right now – AJAX
Die URL-Kodierung Der Pseudo-URL mit der Übergabe von Werten an ein Skript beziehungsweise Programm beinhaltet die Zeichen der Benutzereingabe nicht unverändert. Bei der Generierung der Pseudo-URLs wird in der Regel der Prozess der URL-Kodierung durchlaufen, was beim Versenden von Formulardaten automatisch erfolgt. Diese URL-Kodierung erfolgt hauptsächlich, damit bei der Übertragung von Sonderzeichen über das Internet/Intranet keine Probleme entstehen. Dabei werden alle Leerzeichen in dem String, der aus den Benutzereingaben zusammengesetzt wird, durch Pluszeichen ersetzt. Zusätzlich werden sämtliche reservierte Zeichen, die ein Benutzer beispielsweise im Formular eingegeben hat (etwa das Gleichheitszeichen und natürlich auch das Pluszeichen oder das kaufmännische Und), in hexadezimale Äquivalente konvertiert. Ein so konvertiertes Zeichen wird jeweils mit dem Prozentzeichen eingeleitet. Danach folgt der Hexadezimalcode. Hinweis In dem String des Pseudo-URL können also weder das Gleichheitszeichen, das Prozentzeichen, das Fragezeichen, das Pluszeichen noch das kaufmännische Und (Ampersand) durch Benutzereingaben vorkommen. Aber auch zahlreiche andere Zeichen wie deutsche Umlaute oder das ß werden verschlüsselt.
Wenn die Daten an ein auswertendes Skript beziehungsweise Programm auf dem Server übermittelt werden, kommen alle Daten als ein Satz von Name-Wert-Paaren an. Der Name repräsentiert eine Variable, die beispielsweise über ein entsprechendes Tag in der HTML-Seite festgelegt wurde. Die Werte sind das, was die Variable für einen Wert an den Server übermitteln soll. Das kann z.B. eine Anwendereingabe sein. Dieser Satz von Name-Wert-Paaren wird in einem Teilstring der URLs übermittelt, den ein Webskript wieder auflösen muss. Ein solcher String ist ungefähr so aufgebaut: Listing 2.10: Der Teilstring mit zwei Wertepaaren user=admin&passwort=geheim
Der String mit den Wertepaaren muss vom auswertenden Skript beziehungsweise Programm beim kaufmännischen UND (&) sowie dem Gleichheitszeichen (=) in einzelne Stücke zerlegt werden. Die entstandenen Teilstücke müssen dann noch dekodiert werden.
71
2 Die Welt von AJAX – zentrale Grundlagen
Achtung Beim manuellen Versenden von Daten per AJAX wird die URLKodierung vom Browser respektive dem AJAX-Kommunikationsobjekt nicht automatisch durchgeführt. Sie müssen sie von Hand erledigen. Hier erleichtern AJAX-Frameworks die Arbeit erheblich, denn es gibt teilweise – eigentlich kaum zu erwartende – Probleme bei der Kodierung und Dekodierung, wenn bestimmte Webbrowser und Webserver miteinander Daten austauschen und Sie manuelle Kodierungen vornehmen. So bequem GET ist – in vielen Fällen kann es angebracht sein, auf POST zurückzugreifen. Die Länge des Pseudo-URL ist beschränkt und natürlich möchte man nicht immer die übertragenen Werte für jedermann sichtbar in der Adresszeile des Browsers anzeigen. Wenn Sie beim Versenden von Daten die Methode POST verwenden, werden die zu verschickenden Daten in eine Umgebungsvariable gepackt, die im HTTP-Rumpf versteckt ist. Für eine AJAX-Anfrage verwendet man dennoch meistens GET, denn hier ist in der Adresszeile des Browsers grundsätzlich nichts zu sehen ist (die Kommunikation läuft ja explizit am Browser vorbei) und die Menge der ausgetauschten Daten ist pro Anfrage fast immer sehr, sehr klein.23
HTTP-Interna Derzeit gibt es von HTTP zwei Versionen – HTTP/1.0 und HTTP/1.1. Wesentlicher Unterschied ist, dass bei HTTP/1.1 bei Bedarf im Gegensatz zur Version 1.0 mehrere Anfragen und Antworten in einer einzigen TCP-Verbindung gesendet und abgebrochene Übertragungen fortgesetzt werden können. Zudem lassen sich Dateien vom Client zum Server übertragen oder dort auch löschen. Für die konkrete Arbeit mit AJAX ist das allerdings meist irrelevant. Hinweis HTTP arbeitet normalerweise auf dem Standard-Port 80.
23 Oft sogar nur ein Zeichen (etwa bei Google suggest und verwandten Angeboten). Man kann bei einer AJAX-Anfrage zwar theoretisch auch große Datenmengen zum Server schicken, aber dann hebelt man den eigentlichen Sinn von AJAX aus und sollte besser eine klassische Datenanfrage zum Server schicken.
72
2.3 Come together right now – AJAX
Bei einem typischen HTTP-Request durch einen Client besteht die gesamte Anfrage ausschließlich aus dem HTTP-Header. Schauen wir uns so einen typischen HTTPRequest exemplarisch an: Listing 2.11: Ein HTTP-Request an Google mit einer Suchanfrage 01 http://www.google.de/search? hl=de&client=firefox-a&rls=org.mozilla%3Ade%3Aofficial&hs=WMn& q=ralph+steyer&btnG=Suche&meta= 02 03 GET /search? hl=de&client=firefox-a&rls=org.mozilla%3Ade%3Aofficial&hs=WMn& q=ralph+steyer&btnG=Suche&meta= HTTP/1.1 04 Host: www.google.de 05 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 06 Accept: text/xml,application/xml,application/xhtml+xml, text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 07 Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 08 Accept-Encoding: gzip,deflate 09 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 10 Keep-Alive: 300 11 Connection: keep-alive 12 Referer: http://www.google.de/search? q=ralph+steyer&ie=utf-8&oe=utf-8&aq=t& rls=org.mozilla:de:official&client=firefox-a 13 Cookie: SS=Q0=cmFscGggc3RleWVy; PREF=ID=963386b28a21f438:TM=1208512520: LM=1208512520:S=agQkQca7ypGmdKYF
Deutlich sind in Zeile 1 ein URL und in Zeile 3 die Methode der Datenanforderung (hier GET) und die Protokollversion (hier HTTP 1.1) zu erkennen. Auf die Startzeile des Requests folgen eine Reihe von Feldern in mehr oder weniger beliebiger Reihenfolge, die die Anfrage genauer beschreiben. Jedes Header-Feld besteht aus einem Namen und einem Wert. Das Wertepaar wird durch einen Doppelpunkt voneinander getrennt. Die Werte gleichnamiger Header-Felder können in einem Header zusammengefasst werden, indem sie mit einem Komma getrennt werden. Tipp Zur Auswertung der HTTP-Header bieten sich sogenannte Sniffer an. Für Firefox gibt es zum Beispiel ein entsprechendes Plug-in mit Namen HTTP Live Headers, das ganz hervorragende Dienste leistet.
73
2 Die Welt von AJAX – zentrale Grundlagen
Bei der Antwort des Webservers (der HTTP-Response) wird neben den HeaderInformationen, die wie die vom Request aussehen und oftmals gleich benutzt werden, der tatsächliche Inhalt als Nutzlast transportiert. Das sind dann Teile der Datei, die ein Client vom Webserver angefordert hat. Tipp Im Anhang finden Sie eine Tabelle mit den Meldungen eines Webservers.
2425
Tipp Wenn Sie mit einem lokalen Webserver arbeiten,24 steht Ihnen dieser nach dem Start über die Angabe von localhost zur Verfügung, wenn Sie ihn auf dem gleichen Rechner laufen lassen wie Ihren Webbrowser. Diese Angabe localhost ist ein Alias für den aktuellen Rechner. Sie nennt man auch die Loopback-Adresse. Damit können Sie auf Ihren eigenen Rechner so zugreifen, als würden Sie dies über ein Netzwerk tun. Sie benötigen dazu nicht einmal eine Netzwerkkarte. Als IPAdresse für Loopback steht die 127.0.0.1 (oder genauer eigentlich alle IP-Nummern, die mit 127.0.0 beginnen) zur Verfügung. Das Bereitstellen von Daten über den Webserver erfolgt bei allen Webservern über ein spezielles Verzeichnis.25 Dieses ist das Wurzelverzeichnis aller Zugriffe über den Webserver. Oder mit anderen Worten: Wenn ein Anwender die Adresse des Webservers ohne weitere Verzeichnis- oder Dateiangaben angibt, bekommt er den Inhalt dieses Verzeichnisses beziehungsweise die Default-Datei darin angezeigt. Wurzelverzeichnis eines Webservers bedeutet aber auch, dass sämtliche Verzeichnisangaben beim Zugriff aus einem Browser auf einem Host ab diesem Verzeichnis aus gesehen werden. Der Webserver darf in der Regel keinesfalls Zugang zu Verzeichnisstrukturen bieten, die nicht innerhalb des Wurzelverzeichnisses liegen.
24 Was für einen Test von AJAX-Applikationen ja fast unumgänglich ist. 25 Unter Apache in der Regel über das Unterverzeichnis htdocs.
74
2.3 Come together right now – AJAX
2.3.2
Details zum XMLHttpRequest-Objekt
AJAX hätte im Grunde als eine Erweiterung des JavaScript-Objektmodells eingeführt werden können. Mit so einer banalen Marketingstrategie wäre meiner Meinung nach das Konzept zwar niemals so erfolgreich wie mit dem Buzzword AJAX geworden. Aber rein vom Konzept her könnte man AJAX so beschreiben. Moderne Browser bieten nun mit dem als Erweiterung aufgenommenen Objekt XMLHttpRequest eine eingebaute Schnittstelle zur Kontrolle von HTTP-Transaktionen aus clientseitigen Programmiersprachen (hauptsächlich JavaScript), die unabhängig von der »normalen« Datenanforderung des Webbrowsers ablaufen. Diese XMLHttpRequest-Objekte sind damit unmittelbar am internen Aufbau von HTTP orientiert und bilden das Rückgrat jeder AJAX-Anfrage. Und sie werden in allen Frameworks und Toolkits, die sich mit dem Titel AJAX schmücken, in irgendeiner Form zur Verfügung gestellt. Für die asynchrone Kommunikation zwischen Browser und Webserver erlaubt das Objekt mit Funktionsreferenzen die Registrierung von sogenannten Callback-Funktionen, die bei jeder Änderung des Transaktionszustands ausgewertet werden. Zudem kann über ein XMLHttpRequest-Objekt auf alle HTTP-Header-Felder sowohl von einer AJAX-Anfrage als auch von einer AJAX-Antwort zugegriffen werden.
Ein XMLHttpRequest-Objekt erzeugen Um mit einem XMLHttpRequest-Objekt arbeiten zu können, muss dieses entsprechend der Regel der eingesetzten Programmiersprache erzeugt werden. Dies erfolgt in JavaScript über den Einsatz einer passenden Konstruktormethode. Ein Objekt vom Typ XMLHttpRequest stellt dann alle relevanten Methoden und Eigenschaften zur asynchronen Kommunikation per AJAX bereit. Dabei können auf Basis der üblichen Übertragungsmethoden (in der Praxis POST bzw. meistens GET) Daten verschickt und Antworten empfangen sowie der Request-Header gesetzt und ausgewertet werden. Beachten Sie, dass mit AJAX-Anfragen aus Sicherheitsgründen in der Regel nur Daten von der gleichen Domain angefordert werden dürfen, von der die anfordernde Webseite stammt. Das ist ein oft zu findendes Sandkastenprinzip (Sandbox). Nun kann man mit JavaScript innerhalb eines Browsers ein Objekt vom Typ XMLHttpRequest auf verschiedene Arten erzeugen. Es gibt einmal den Weg über die
Erzeugung eines ActiveX-Objekts. Das macht Microsoft im Rahmen der älteren Internet Explorer so. Und hier gibt es auch keine Alternative. Beispiel: Listing 2.12: Ein Beispiel für das Erzeugen eines XMLHttpRequest-Objekts für den Internet Explorer mit dem ActiveXObject-Konstruktor resObjekt = new ActiveXObject("MSXML2.XMLHTTP");
75
2 Die Welt von AJAX – zentrale Grundlagen
Leider gibt es hierbei aber verschiedene Werte für den Parameter des Konstruktors, die je nach zugrunde liegender Plattform ausgewählt werden müssen. Und bekanntlich unterstützt aus Sicherheitsgründen sowieso kein anderer Browser als der Internet Explorer ActiveX. Deshalb muss in diesen Fällen die Erstellung über eine andere Syntax erfolgen, die mittlerweile aber auch neuere Versionen vom Internet Explorer alternativ unterstützen. Beispiel: Listing 2.13: Erzeugen eines XMLHttpRequest-Objekts für alle anderen Browser mit einem anderen Konstruktor resObjekt = new XMLHttpRequest();
Eine automatische Unterscheidung zwischen den verschiedenen Wegen zur Erzeugung des Kommunikationsobjekts kann man in einem Skript nun mehr schlecht als recht mit einer sogenannten Browser-Weiche lösen, die verschiedene Browser automatisch trennt. Nur sind Browser-Weichen zum einen ziemlich unzuverlässig und zum anderen recht komplex, wenn man viele Details26 in Kombination überprüfen will oder muss. Definitiv eleganter und auch praxistauglicher ist der Aufbau einer universellen Vorgehensweise zum Erzeugen eines Objekts vom Typ XMLHttpRequest über eine Ausnahmebehandlung (Exceptionhandling). Dies bedeutet die Verwendung eines universellen Konzepts, das es gestattet, mit diversen Situationen umzugehen, die den normalen Ablauf eines Skripts oder Programms stören. Dies sind keine Fehler im eigentlichen Sinne, sondern allgemein Situationen zur Laufzeit eines Programms oder Skripts, die eine unmittelbare Reaktion erzwingen. Andernfalls kann das Programm/Skript nicht sinnvoll weiter ausgeführt werden und muss in der Regel beendet werden. Unter Umständen helfen aber geeignete und standardisiert vorzubereitende Gegenmaßnahmen, um das Skript oder Programm am Leben zu halten und sinnvoll weiter abarbeiten zu können! Und genau hier greift die Ausnahmebehandlung ein. Grundsätzlich setzt eine Ausnahmebehandlung auf einem Mitteilungsobjekt auf, das vom Laufzeitsystem von JavaScript bei Bedarf automatisch generiert wird und sowohl den normalen Skriptablauf unterbricht als auch Informationen über die aktuelle Störung enthält. Der ausführende Interpreter wird zudem veranlasst, nach einer geeigneten Behandlungsstruktur zu suchen.
26 Browser-Typ, Browser-Version, Betriebssystem etc.
76
2.3 Come together right now – AJAX
Hinweis Das Konzept der Ausnahmebehandlung wurde in JavaScript in der Version 1.4 respektive 1.5 eingeführt. Alle modernen Browser unterstützen es mittlerweile, auf jeden Fall diejenigen Browser, die für die Frameworks und Toolkits in diesem Buch vorausgesetzt werden.
Wenn eine Ausnahme in Ihrem JavaScript aufgetreten ist, müssen Sie also darauf reagieren. Das nennt man das Auffangen der Ausnahme. Um nun eine in einer Sprache wie Java, C# oder auch JavaScript ausgeworfene Ausnahme behandeln zu können, umgibt man den Aufruf einer Methode oder Struktur, die möglicherweise eine Ausnahme auswirft, mit einer try-catch-Struktur. Das sieht schematisch wie folgt aus:27 Listing 2.14: Das Schema einer abgefangenen potenziellen Ausnahme try{ [kritische Anweisung] } catch ([Ausdruck]) { [Maßnahmen für den Ausnahmefall] }
Der Ausdruck in den Klammern des catch-Zweigs ist der Bezeichner für das konkrete Fehlerobjekt. Im catch-Zweig selbst stehen innerhalb geschweifter Klammern einfach die Anweisungen, die beim Auftreten der Ausnahme durchgeführt werden sollen. Wenn ein Problem auftauchen sollte (sprich, es wird eine Ausnahme ausgeworfen), wird dieses sofort entsprechend im passenden catch-Block gehandhabt und alle nachfolgenden Schritte in diesem try-Block werden nicht mehr durchgeführt. Wenn also eine der Anweisungen innerhalb des try-Blocks ein Problem erzeugt, wird dieses durch die passenden catch-Anweisungen aufgefangen und entsprechend behandelt (sofern die catch-Anweisung dafür die passende Behandlung enthält). Werden hingegen alle Anweisungen in dem try-Block ohne Probleme abgearbeitet, wird der catchBlock übersprungen. Was Sie nun im catch-Teil konkret tun, ist nicht weiter festgelegt. Sie können jede Ihnen sinnvoll erscheinende Maßnahme ergreifen, die das Skript folgerichtig weiterlaufen lässt. Oft ist das eine Fehlermeldung mit anschließendem Rücksprung zu der Situation, die sich mit der ausgelösten Ausnahme sinnvoll umgehen lässt – etwa im Fall einer Benutzereingabe ein Fokussieren des kritischen Eingabefelds. Oder aber Sie können einen alternativen Weg zur Durchführung einer Aktion probieren, wenn der 27 Alle potenziell kritischen Anweisungen stehen bei dieser Konstruktion im try-Zweig.
77
2 Die Welt von AJAX – zentrale Grundlagen
erste Weg gescheitert ist. In letzterem Fall werden Sie oft auch try-catch-Strukturen verschachteln. Und genau mit so einem Konzept werden wir einfach versuchen, die möglichen Konstruktoranwendungen zur Erzeugung eines XMLHttpRequest-Objekts nacheinander auszuführen. Der Trick beruht darauf, dass eine Erzeugung entweder klappen kann oder eine Ausnahme ausgeworfen wird, die wir auffangen. Die Ausnahme an sich ist uninteressant, aber im zugehörigen catch-Teil probieren wir einfach die nächste Variante. So werden im Fall eines Scheiterns der Objekterzeugung sukzessive alle anderen möglichen Varianten zur Erzeugung ausprobiert. Beachten Sie die nachfolgende JavaScript-Funktion, die in einer externen JavaScriptDatei (ajax1.js) definiert sein soll: Listing 2.15: Die universelle Erzeugung eines XMLHttpRequest-Objekts 01 function erzXMLHttpRequestObject(){ 02 var resObjekt = null; 03 try { 04 resObjekt = new ActiveXObject("Microsoft.XMLHTTP"); 05 } 06 catch(Error){ 07 try { 08 resObjekt = new ActiveXObject("MSXML2.XMLHTTP"); 09 } 10 catch(Error){ 11 try { 12 resObjekt = new XMLHttpRequest(); 13 } 14 catch(Error){ 15 alert( 16 "Erzeugung des XMLHttpRequest-Objekts gescheitert"); 17 } 18 } 19 } 20 return resObjekt; 21 }
Die Funktion erzXMLHttpRequestObject() legt zuerst eine lokale Variable resObjekt an (Zeile 2). Diese wird eine Referenz auf das XMLHttpRequest-Objekt aufnehmen und als Rückgabewert der Funktion dienen. Am Anfang hat sie den Wert null. Damit wird sie von JavaScript implizit den Datentyp Object erhalten. In der vierten Zeile versuchen wir innerhalb eines try-Blocks das erste Mal, ein XMLHttpRequest-Objekt zu erzeugen. Es ist im Grunde vollkommen ohne Belang, welche der zur Verfügung stehenden Varianten wir zuerst probieren. Hier wird mit resObjekt = new ActiveXObject("Microsoft.XMLHTTP"); zuerst versucht, das Objekt mit dem älteren XML-Parser von Microsoft zu erzeugen.
78
2.3 Come together right now – AJAX
Hat dies funktioniert, wird der nachfolgende catch-Block komplett übersprungen und mit return resObjekt; in Zeile 20 das XMLHttpRequest-Objekt an den Aufrufer der Funktion zurückgegeben. Geht der erste Versuch zur Erzeugung des XMLHttpRequest-Objekts jedoch schief, wird eine Ausnahme ausgeworfen und der Programmfluss macht mit der ersten Anweisung im ersten catch-Block (Zeile 7) weiter. Hier finden Sie eine weitere try-catchStruktur, die in den äußeren catch-Block geschachtelt ist. Wir versuchen dort dann in Zeile 8, das Objekt mit der neueren Version des XML-Parsers von Microsoft zu erzeugen (resObjekt = new ActiveXObject("MSXML2.XMLHTTP");). Auch hier gilt wieder: Hat dies funktioniert, wird der nachfolgende catch-Block komplett übersprungen und in Zeile 20 mit return resObjekt; das XMLHttpRequest-Objekt zurückgegeben. Ist auch der zweite Versuch gescheitert, springt der Programmfluss in den zweiten catch-Block in Zeile 10 und fährt mit dem dritten Versuch fort, das Objekt zu erzeugen, dieses Mal mit new XMLHttpRequest(); (Zeile 12).
Nun ist die weitere Abfolge eine Frage der Programmlogik. In unserem Fall packen wir auch den dritten Versuch in ein try-catch-Konstrukt. Das ist im Grunde nicht notwendig, denn wenn auch der dritte Versuch scheitert, sollte das Skript zum Nachladen von Daten per AJAX beendet werden. Eine nicht aufgefangene Ausnahme würde genau das bewirken. Wir gehen jedoch etwas eleganter vor. Im Erfolgsfall gilt wieder, dass wie gewünscht das Objekt zurückgegeben wird. Bei Misserfolg wird dem Besucher eine Fehlermeldung angezeigt und dann von der Funktion der Wert null zurückgegeben (das ist der Initialisierungswert – dieser wurde nicht verändert, wenn das Skript bis zu dieser Stelle kommt). Diesen kann der Aufrufer der Funktion bei Bedarf verwerten.
Die Methoden eines XMLHTTPRequest-Objekts Ein Objekt vom Typ XMLHttpRequest stellt einige wichtige Methoden bereit. Nachfolgend finden Sie die Methoden eines XMLHttpRequest-Objekts: Die Methode abort() stoppt die aktuelle Serveranfrage. Mit getAllResponseHeaders() erhalten Sie als Rückgabe die vom Server gesendeten
Header-Felder als String. Die Methode getResponseHeader("headerLabel") gibt das als Parameter benannte
Header-Feld als String zurück. Die Methode open("method", "URL"[, asyncFlag[, "userName"[, "password"]]]) ist eine
der wichtigsten Methoden. Darüber legen Sie die Verbindungsdaten zu einem Webserver fest. Dabei werden mindestens zwei Parameter angegeben – die Methode und der URL. Der URL ist der relative oder absolute Pfad zum Serverskript, wobei gegebenenfalls (bei GET) der Querystring angefügt und ein Pseudo-URL verwendet wird. Das dritte Argument gibt an, ob eine Anfrage synchron (false)
79
2 Die Welt von AJAX – zentrale Grundlagen
oder asynchron (true) verarbeitet wird. Sofern eine synchrone Verarbeitung festgelegt wird, wird der folgende Versand der Daten mit der send()-Methode die Ausführung des Skripts so lange blockieren, bis die Antwort des Servers vollständig empfangen wurde. In diesem Fall kann die Antwort des Servers im unmittelbar folgenden Schritt des Skripts verarbeitet werden. Beim asynchronen Anfordern von Daten wird das blockierende Warten des Browsers auf die Antwort vermieden. Das Skript läuft dann nach dem Absenden des Requests einfach weiter. Wenn Sie eine solche asynchrone Anfrageform wählen, wird man in der Regel eine Callback-Funktion definieren, die immer dann aufgerufen wird, wenn sich der Bearbeitungszustand der Transaktion ändert. Der optionale Parameter userName ist ein gegebenenfalls benötigter Benutzername für eine Ressource auf dem Server und password entsprechend das Passwort. Die Methode send(content) wird zum Abschicken einer Anfrage verwendet. Sie wird nach dem Aufruf der open()-Methode aufgerufen. Der Parameter content ist entweder null (bei GET) oder ein Querystring bei POST. Mit der Methode setRequestHeader("label", "value") können individuelle Header-
Felder gesetzt werden. Über setMimeType("mimetype") erfolgt das Setzen des MIME-Typs der angeforderten Daten (Response). Der Parameter mimetype ist die übliche Angabe eines MIME-Typs als String (z.B. "text/xml" oder "text/html"). Die Methode wird aber von einigen
Browsern nicht unterstützt.
Die Eigenschaften eines XMLHTTPRequest-Objekts Ein XMLHttpRequest-Objekt besitzt neben den Methoden eine Reihe von Eigenschaften, die für jede AJAX-Applikation benötigt werden: Die Eigenschaft onreadystatechange28 ist ein Eventhandler, der jedes Mal aufgerufen wird, wenn sich der Verbindungsstatus (readyState) eines XMLHttpRequest-Objekts
ändert. Man registriert bei diesem Eventhandler in der Regel eine Funktionsreferenz auf eine Callback-Funktion. Die Eigenschaft readyState enthält den aktuellen Verbindungsstatus einer Transaktion. Mögliche Werte sind 0 bzw. UNINITIALlZED29, 1 bzw. LOADING30, 2 bzw. LOADED31, 3 bzw. INTERACTIVE32 und vor allen Dingen 4 bzw. COMPLETED33. Die Eigenschaft responseText enthält die vom Server gesendeten Daten als Text. 28 Dieser Eventhandler ist extra für AJAX eingeführt worden. Es gibt hierfür kein Gegenstück als HTML-Eventhandler. 29 Das Objekt wurde noch nicht initialisiert. 30 Das XMLHttpRequest-Objekt wurde erstellt und initialisiert, aber es wurde noch keine Anfrage mit send() gesendet. 31 Die Anfrage wurde gesendet und der Antwort-Header sowie der Antwortstatus können ausgewertet werden. 32 Die Daten vom Server treffen gerade ein. 33 Die Kommunikation mit dem Server ist abgeschlossen und alle Daten sind angekommen.
80
2.3 Come together right now – AJAX
Die Eigenschaft responseXML enthält die vom Server gesendeten Daten als XML-Da-
ten (also als Baum, auf dem man navigieren kann). Wenn die Daten nicht in XMLForm gesendet worden sind, enthält responseXML den Wert null. Die Eigenschaft status enthält den HTTP-Status der Verbindung als Zahl. Die Eigenschaft statusText enthält den HTTP-Status als Textmeldung, sofern eine
solche übermittelt wurde.
2.3.3
Exemplarischer Ablauf einer AJAX-Anfrage
Besprechen wir in einer Zusammenfassung die Regeln, wie jede AJAX-Applikation vom System her arbeitet. Eine AJAX-Anfrage kann sich zwar in diversen Details unterscheiden und von einem Framework oder Toolkit verborgen werden, folgt aber in der Regel immer dem gleichen Schema: 1. Zuerst wird ein Objekt vom Typ XMLHttpRequest erzeugt, über das die Kommunikation laufen soll. 2. Eine Callback-Funktion wird beim XMLHttpRequest-Objekt als Funktionsreferenz registriert. Diese wird dann bei jeder Zustandsänderung der Transaktion aufgerufen. Die angegebene Funktion wird fortan für jede Statusänderung des XMLHttpRequest-Objekts aufgerufen. Dabei gibt das Feld readyState des XMLHttpRequestObjekts Aufschluss über den aktuellen Status der Transaktion beim Aufruf dieser Callback-Funktion. So lassen sich einzelne Phasen der Datenübertragung unterscheiden. Der wichtigste Fall ist hier das Erreichen des Status COMPLETED mit dem Statuscode 4. Nur dieser Status wird in den verschiedenen Browsern einheitlich gehandhabt. Deshalb werden fast alle AJAX-Anwendungen darauf prüfen. 3. Die Verbindung wird geöffnet, indem die open()-Methode des XMLHttpRequestObjekts aufgerufen wird. Das ist aber noch nicht die konkrete Anfrage. Deshalb ist es auch unerheblich, ob Schritt 2 und 3 vertauscht werden. 4. Die AJAX-Anfrage an den Webserver wird mit der send()-Methode abgeschickt. 5. Die Antwort des Webservers wird verwertet. Dazu kann die Statusänderung eines XMLHttpRequest-Objekts explizit genutzt werden.
2.3.4
Praktische AJAX-Beispiele – von Hand
Wir erstellen nun zwei praktische AJAX-Beispiele von Hand, also von Grund auf mit allen notwendigen Strukturen und explizit ohne die Hinzunahme eines Frameworks.
Klartext vom Server anfordern In unserem ersten AJAX-Beispiel wollen wir einfach Klartext vom Server anfordern. Der Anwender soll beim Überstreichen eines Bilds in einer Webseite eine Zusatzinformation in der Webseite angezeigt bekommen. Dabei wird für jedes Bild einfach eine eigene Textdatei mit spezifischen Informationen vom Server geladen und in einem individuellen Bereich der Webseite angezeigt, ohne die Webseite neu zu laden.
81
2 Die Welt von AJAX – zentrale Grundlagen
Hier ist die HTML-Datei, die dem Beispiel zugrunde liegen soll (ajax1.html): Listing 2.16: Die HTML-Datei für das AJAX-Beispiel 01 03 04 05
07 Beispiel AJAX 1 08
09 10 11 Beispiel AJAX 1 12
Bild | 15Info | 16|
---|---|---|
19 2.3 Come together right now – AJAX 46 | 47 49 | 50 51 |
Kennzeichen | Gebiet |
---|---|
" + meinJSONObjekt.bindings[i].kennzeichen + " | " + meinJSONObjekt.bindings[i].gebiet + " |
Bild | Info |
---|---|
135 3 Das YUI – Yahoo User Interface 57 | 58 59 |