e he ab sc g ut aus De nal i ig Or Sauberes Ajax für Java-Businessanwendungen Das Google Web Toolkit: GWT O’Reilly Michael Seemann 719-5.book Seite II Mittwoch, 9. Januar 2008 10:58 10 719-5.book Seite III Mittwoch, 9. Januar 2008 10:58 10 Das Google Web Toolkit: GWT Michael Seemann Beijing · Cambridge · Farnham · Köln · Paris · Sebastopol · Taipei · Tokyo 719-5.book Seite IV Mittwoch, 9. Januar 2008 10:58 10 Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen. Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Kommentare und Fragen können Sie gerne an uns richten: O’Reilly Verlag Balthasarstr. 81 50670 Köln Tel.: 0221/9731600 Fax: 0221/9731608 E-Mail: [email protected] Copyright der deutschen Ausgabe: © 2008 by O’Reilly Verlag GmbH & Co. KG 1. Auflage 2008 Die Darstellung eines Muntjaks im Zusammenhang mit dem Thema Google Web Toolkit ist ein Warenzeichen von O’Reilly Media, Inc. Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar. Lektorat: Christine Haite, Köln Fachliche Unterstützung: Lars Schulten, Köln & Christof Vollrath, Berlin Korrektorat: Petra Bromand, Düsseldorf Satz: Tim Mergemeier, reemers publishing services gmbh, Krefeld; www.reemers.de Umschlaggestaltung: Edie Freedman, Boston & Michael Oreal, Köln Produktion: Andrea Miß, Köln Belichtung, Druck und buchbinderische Verarbeitung: Druckerei Kösel, Krugzell; www.koeselbuch.de ISBN 978-3-89721-719-5 Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt. 719-5.book Seite V Mittwoch, 9. Januar 2008 10:58 10 Inhalt Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IX ........................................................ 1 Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Der Google-Weg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Über dieses Buch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1 Einleitung 2 Das Google Web Toolkit – eine Rundreise 15 .............................. Download und Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsprinzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Projekt generieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Projektstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Hosted-Modus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Web-Modus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anpassung der Oberfläche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elemente anordnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auswertung von Ereignissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommunikation mit einem Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hinzufügen einer weiteren Sprache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 17 21 22 23 24 26 28 30 32 3 Von der Idee über die Architektur zur Projektstruktur . . . . . . . . . . . . . . . . . . . . . 33 Mehr-Schichten-Architektur oder eine Schicht? . . . . . . . . . . . . . . . . . . . . . . . . . . 34 GWT-Projekte unter Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 | V 719-5.book Seite VI Mittwoch, 9. Januar 2008 10:58 10 4 Model View Controller und das GWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Das Model View Controller-Entwurfsmuster . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein allgemeiner Ansatz für GWT-Dialoge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein konkreter Dialog am Beispiel der persönlichen Daten . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 61 71 84 5 Remote Procedure Call mit dem GWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Schnittstellen und Klassen des GWT-RPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schnittstelle definieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementierung des Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein asynchrones Datenzugriffsobjekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 87 92 93 99 6 Sitzungsverwaltung und Sicherheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Sitzungsverwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cross-Site Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cross-Site Request Forgery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 108 109 114 7 Java Script Native Interface – JSNI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 JSNI-Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 GWT und Google Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 8 Kombination der GWT-Konzepte in eigenen Widgets . . . . . . . . . . . . . . . . . . . . 133 Architektur des Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Umsetzung des Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 9 Deployment und Performance-Optimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Der Startvorgang einer GWT-Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Allgemeine Optimierung für Webanwendungen . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Know-how-Schnipsel ............................................. DeferredCommand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deferred Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lokalisierung und ImageBundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementierung in der Moduldefinition austauschen . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VI | Inhalt 153 158 165 166 167 167 171 179 181 184 719-5.book Seite VII Mittwoch, 9. Januar 2008 10:58 10 11 Fremdbibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Einbinden der Bibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übersicht Fremdbibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auswahlkriterien für Fremdbibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rocket-GWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GWT-Google-APIs/Google Gears . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GWT-DND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 187 190 191 196 204 207 A Übersicht GWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 B Die Moduldefinition Index .............................................. 245 ............................................................... 249 Inhalt | VII 719-5.book Seite VIII Mittwoch, 9. Januar 2008 10:58 10 719-5.book Seite IX Mittwoch, 9. Januar 2008 10:58 10 Vorwort Es ist gut anderthalb Jahre her, dass Google mit dem Google Web Toolkit (GWT) einen Weg vorgestellt hat, wie sich die Entwicklung von Ajax-Webanwendungen deutlich beschleunigen lässt. Ganz nebenbei werden wir Entwickler vor den Problemen abgeschirmt, die JavaScript mit sich bringen kann. Diese sind nämlich, gerade für Entwickler mit begründeten Berührungsängsten gegenüber Script-Sprachen (zu denen ich mich auch zähle), durchaus nicht gering. Moderne Softwareentwicklung benötigt aus meiner Sicht die Unterstützung durch funktional hervorragende Werkzeuge – wie beispielsweise Eclipse. Auch möchte ich auf die Möglichkeit automatisierter Tests nicht verzichten. Und wenn ich den Servercode in Java schreibe, dann ist es eine erhebliche Erleichterung, wenn auch der Clientcode in Java geschrieben werden kann. Genau das ist mit dem GWT möglich! Inzwischen habe ich eine ganze Reihe von Projekten mit dem Google Web Toolkit umgesetzt und bin nach wie vor begeistert. In diesem Buch werden Sie deshalb nicht nur eine nüchterne Beschreibung der Möglichkeiten des GWT finden, sondern auch von den Erfahrungen profitieren, die sich in über einem Jahr Arbeit mit diesem Werkzeug angesammelt haben. An einigen Stellen wird Ihnen der eine oder andere dargestellte Weg vielleicht etwas überstrukturiert vorkommen – wenn man aber nicht nur mal eben ein kleines Beispiel zusammenhackt, dann ist ein strukturierter Weg zwingend erforderlich, um für zukünftige Entwicklungen die Tür offen zu halten. Trotzdem muss die Entwicklung zügig vorangehen können. Nach jeder kleinen Änderungen einen vollständigen Buildprozess anstoßen zu müssen, ist da wenig hilfreich. Ich hoffe, einen annehmbaren Kompromiss gefunden zu haben (zumindest ist er das für mich). Falls Sie das nach der Lektüre des Buches anders sehen, können Sie gern mit mir darüber diskutieren. Am besten per E-Mail: [email protected]. Ein solches Buch zu schreiben ist kein Spaziergang – auch nicht beim dritten Mal. Deshalb bin ich froh, dass Kollegen und Verlag mich bei diesem Projekt sehr gut unterstützt haben. Von meinen Kollegen musste Peter Zorn das Manuskript kritisch unter die Lupe nehmen. Klaus von Einem war immer eine gute Quelle für Anregungen zur Architektur | IX 719-5.book Seite X Mittwoch, 9. Januar 2008 10:58 10 und Jens Prilop – passionierter Läufer – hat sich tatsächlich getraut, das Fitnesstagebuch, das ich in diesem Buch als durchgehendes Beispiel verwende, einem Praxistest zu unterziehen. Ob es bei der Bewältigung des Berlin-Marathons geholfen hat, werde ich erst wissen, wenn das Buch schon im Druck ist. Auf Verlagsseite möchte ich mich besonders bei Ariane Hesse für die unkomplizierte Zusammenarbeit bedanken, beim Fachgutachter Christof Vollrath für die vielen guten Kommentare zum Manuskript. Und nicht zuletzt habe ich meiner Lektorin Christine Haite für ihre Geduld zu danken. Von ihrem Sachverstand war ich begeistert. Viel Spaß bei der Lektüre! Michael Seemann Rostock, September 2007 X | Vorwort 719-5.book Seite 1 Mittwoch, 9. Januar 2008 10:58 10 KAPITEL 1 Einleitung Dieses Kapitel stellt einen kurzen Einstieg in die Materie Ajax und das Google Web Toolkit dar. Sie werden erfahren, was für mich der Begriff Ajax – absichtlich nicht AJAX – bedeutet und was das Google Web Toolkit ist. Keine Angst, ich werde nicht die einhundertste Beschreibung des XMLHttpRequest-Objektes liefern! Zum einen ist das in den letzten Jahren ausreichend erfolgt, und zum anderen kommt man beim Arbeiten mit dem Google Web Toolkit damit so gut wie gar nicht in Berührung. Außerdem werde ich kurz erläutern, wie das Buch aufgebaut ist, welche Voraussetzungen Sie als Leser mitbringen sollten und was es mit dem durchgehenden Beispiel in diesem Buch auf sich hat. Ajax Sie werden sicherlich schon einmal gehört haben oder wissen, dass AJAX für Asynchronous JavaScript and XML steht. Damit wird ein technisches Verfahren beschrieben, bei dem es darum geht, dass Browser aktualisierte Inhalte nicht mehr synchron nachladen und damit für die Zeit des Datenholens die Eingabe blockieren, sondern das Nachladen von Inhalten asynchron – also quasi im Hintergrund – erfolgt. Damit ändert sich nichts Grundsätzliches an der Art und Weise, wie der Browser mit dem Server kommuniziert, aber das sonst übliche vollständige Neuzeichnen der HTMLSeiten im Browser entfällt. Und das hat gravierende Auswirkungen für den Benutzer der Webseite und für uns als Entwickler solcher Webanwendungen. Ajax und moderne Webanwendungen Bei Webanwendungen, die mit Ajax umgesetzt sind, geht es um ein völlig anderes Bedienkonzept. Es wird nicht mehr das herkömmliche Request-Response-Verfahren benutzt, das zu einem Seitenwechsel-Arbeitsverfahren geführt hat. Dabei musste jedes Mal, wenn eine Interaktion mit einem Server erforderlich war, die Seite wieder komplett neu aufgebaut werden. Der Anwender musste sich in diesem Fall mit dem Weiterarbeiten so lange gedulden, bis die Seite wieder komplett dargestellt war. Bei umfangreichen Webformularen kann es dann ziemlich nervtötend werden, wenn wegen jedes Fehlers bei | 1 719-5.book Seite 2 Mittwoch, 9. Januar 2008 10:58 10 der Eingabe selbst simpelste Vorgänge Minuten in Anspruch nehmen. Außerdem muss sich der Anwender nach jedem Laden der Webseite neu orientieren, da die gesamte Seite ersetzt wurde. Beim asynchronen Arbeiten werden nur die Inhalte aktualisiert, die sich wirklich geändert haben. Bei einer idealtypischen Anwendung wird die Seite nach dem ersten Laden im Browser nie wieder ersetzt. Die Vorteile liegen auf der Hand: • Das Arbeiten ist zügiger möglich, weil weniger Daten und weniger einzelne Requests mit einem Server ausgetauscht werden müssen. In der Regel reicht sogar nur ein einziger Request für einen Arbeitsschritt, da das Nachladen von Scripten, Stylesheets und Bildern entfällt. • Das Ajax-Prinzip sorgt fast von sich aus dafür, dass der Anwender sich nicht nach jedem Request auf der Seite neu orientieren muss. In herkömmlichen Webanwendungen mussten die Seiten dazu homogen sein, und bei Seiten, die größer sind als das Browserfenster, musste der Entwickler dafür sorgen, dass die Seite wieder an die richtige Stelle scrollt. • Der Zustand einer Anwendung kann im Client gespeichert werden. Dadurch werden weniger Ressourcen auf dem Server benötigt. • Umfangreiche Arbeitsschritte lassen sich zusammenfassen, bis überhaupt ein Request zum Server nötig wird. Der Erfolg von Ajax-basierten Webanwendungen spricht für sich – wie z.B. das gern zitierte Beispiel Google Mail zeigt. Jeder, der selbst schon einmal mit Webanwendungen gearbeitet hat, die sich eher wie Desktop-Anwendungen und nicht wie typische Webanwendungen verhalten, wird mir sicher zustimmen, dass man dieses zügige Arbeiten nicht mehr vermissen möchte. Ajax und seine Probleme Natürlich gibt es auch Nachteile, die diese Technologie mit sich bringt: • Wenn nur minimale Änderungen an der Seite erforderlich sind, bemerkt der Anwender diese Änderung möglicherweise nicht. Deshalb muss man sich Gedanken machen, wie man dem Anwender visualisiert, dass sich etwas geändert hat, oder man verzichtet nicht ganz auf synchrones Verhalten. (Auch auf dem Desktop arbeitet man schließlich nicht gleichzeitig in zwei Fenstern – es gibt immer nur ein aktives Fenster.) • Ein-Seiten-Anwendungen sind nicht sehr suchmaschinentauglich. Diese betrachten HTML-Seiten nämlich meist als statisch – dass es eventuell Bereiche gibt, die erst per JavaScript nachgeladen werden, können sie nicht auswerten. • Die Umsetzung einer Webanwendung mit JavaScript kann sehr zeitaufwendig werden – weshalb es auch diese enorme Menge an verschiedenen Ajax-Toolkits und -Frameworks gibt. 2 | Kapitel 1: Einleitung 719-5.book Seite 3 Mittwoch, 9. Januar 2008 10:58 10 • Das Testen von Webanwendungen ist ebenfalls kein Kinderspiel, und Ajax erfordert hier noch mehr Aufwand als herkömmliche Webanwendungen. In diesen konnte beispielsweise der Quellcode für die Eingabeprüfung durch Test-Frameworks wie JUnit geprüft werden. Bei einer Ajax-basierten Webanwendung kommt neben dem Servercode aber noch JavaScript-Code dazu, der ebenfalls getestet werden muss. Beschränkt man sich auf die Betrachtung von JavaScript, um eine Ajax-Anwendung umzusetzen, dann ist diese Sprache nicht gerade der eleganteste Weg – und zwar aus folgenden Gründen: • JavaScript ist nicht typisiert. Deshalb können Fehler erst zur Laufzeit auftreten, die eine typisierte Sprache schon während des Kompilierens moniert hätte. Denken Sie an den typischen Fall des NaN-Wertes, wenn eine Zahl erwartet wird. • Die hohe Flexibilität der Sprache macht es für Werkzeuge schwierig, dem Entwickler unter die Arme zu greifen. Von den Refaktorierungsmöglichkeiten, die Eclipse beim Umgang mit Java bietet, kann man bei JavaScript nur träumen. • Von Hause aus bietet JavaScript kaum einfache Möglichkeiten, Quelltext wirklich wartbar zu strukturieren. Wie es trotzdem gehen kann, zeigt das Dojo Toolkit (http://www.dojotoolkit.org). • Trotz einer standardisierten Sprache gibt es von Laufzeitumgebung zu Laufzeitumgebung – für Webseiten also die verschiedenen Browser – Unterschiede, um die man sich als Entwickler kümmern muss. So mag der IE es überhaupt nicht, wenn man die Definition eines Arrays mit einem Komma zu viel abschließt. Der FireFox ist hier toleranter. Um nur ein Beispiel zu nennen. • JavaScript ist nur schwer zu debuggen. Das gilt besonders dann, wenn man sehr viel von den dynamischen Bestandteilen der Sprache Gebrauch macht. Auch hier gibt es inzwischen Werkzeuge und Hilfsmittel, die ein Debuggen nicht mehr nur auf die Ausgabe mit der JavaScript-Funktion alert beschränken. Als Beispiel sei hier FireBug (http://www.getfirebug.com/) genannt. Auf dieses kleine Werkzeug möchte ich auf gar keinen Fall mehr verzichten. Auch in diesem Buch wird uns dieses Werkzeug noch einmal begegnen. • Für fast alle Programmiersprachen gibt es inzwischen Test-Frameworks, wie beispielsweise JUnit für Java. Auch hier ist das Angebot für JavaScript noch eher dürftig. Warum also setzt man bei all diesen Problemen trotzdem auf JavaScript für die Realisierung von Webanwendungen? Man könnte doch auch auf Flash o. Ä. zurückgreifen. Der unschlagbare Vorteil von JavaScript ist, dass es in fast jedem Browser verfügbar ist, ohne dass ein zusätzliches Plugin installiert werden muss. Dadurch hat man eine Umgebung, die unabhängig von Browser und Betriebssystem verfügbar ist. Außerdem ist diese ScriptSprache standardisiert und ist vergleichsweise leicht zu erlernen. Ajax | 3 719-5.book Seite 4 Mittwoch, 9. Januar 2008 10:58 10 Ein anderer Aspekt bei Ajax-Anwendungen ist die Modifikation des Document Object Models (DOM) der gerade geladenen Webseite. Und hier können die unterschiedlichen Browser einem das Leben wirklich schwer machen. Wenn man dann noch beachtet, dass Browser im so genannten Quirks-Modus und in einem Strict-Modus arbeiten können und sich die Interpretationen von Maßangaben und Stylesheet-Definitionen dann unterschiedlich verhalten können, wird es gänzlich unübersichtlich. Gleiches gilt im Übrigen für die unterschiedlichen Ereignismodelle in den Browsern. Deshalb sind Hilfsmittel in Form von Toolkits oder Frameworks inzwischen Pflicht, da andernfalls eine kostengünstige Umsetzung von Projekten nicht mehr möglich ist. Quirks- und Strict-Modus Diese beiden Modi beschreiben, wie Browser ein HTML-Dokument darstellen. Der Strictoder Standard-Modus wird verwendet, wenn das geladene (X)HTML-Dokument über eine DTD verfügt, so dass die Gültigkeit des Dokuments vom Browser geprüft werden kann und diese DTD das Dokument als W3C-standardkonform ausweist. Zum Beispiel: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> oder: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> Diese Bedingung erfüllen aber längst nicht alle HTML-Dokumente, die im Web verfügbar sind. Das ist aus unterschiedlichen Gründen der Fall. Entweder weil die HTML-Dokumente so alt sind, dass es zum Zeitpunkt ihrer Erstellung noch gar keine Standards gab, weil Webentwickler sich dieses Problems nicht bewusst sind oder weil ein spezielles Verhalten der Browser gewünscht wird. Aus diesem Grund schalten einige Browser in den Quirks-Modus und versuchen »das Beste« aus dem HTML-Dokument zu machen. Prinzipiell sollte man sich also am Strict-Modus orientieren, da so die größte Kompatibilität erreicht wird und die erstellten HTML-Dokumente zumindest annähernd identisch in den verschiedenen Browsern erscheinen. Mat Gessel hat sich die Mühe gemacht und das unterschiedliche Verhalten der Browser am Beispiel der Größen- und Positionseigenschaften im Browserfenster analysiert (http:// www.asquare.net/javascript/tests/ViewportTestResults.html). Diese Übersicht macht das Chaos sehr deutlich! Umsetzungsstrategien für Ajax-Anwendungen Die Strategien und Konzepte sind teilweise recht unterschiedlich, wenn es darum geht, Ajax-Anwendungen möglichst einfach und zügig zu erstellen. So gibt es einige JavaScript-Toolkits schon beinahe so lange, wie es JavaScript gibt. Zu diesen gehören neben dem bereits erwähnten Dojo Toolkit auch Prototype (http://www.prototypejs.org), script.aculo.us (http://script.aculo.us) oder die Yahoo! User Interface Library (http:// developer.yahoo.com/yui). Die Liste lässt sich beliebig fortsetzen. 4 | Kapitel 1: Einleitung 719-5.book Seite 5 Mittwoch, 9. Januar 2008 10:58 10 Neben dem Einsatz von clientseitigen JavaScript-Bibliotheken besteht auch die Möglichkeit, die Anwendungslogik auf dem Server zu belassen und den Browser nur zum »Zeichnen« der Anwendung zu benutzen. Nach diesem Prinzip arbeitet beispielsweise das Framework Echo2 (http://www.nextapp.com/platform/echo2/echo). Der Browser lädt beim Starten eine so genannte Render-Engine, die sich um das Zeichnen der Oberfläche und das Weiterleiten von Ereignissen an den Server kümmert. Auf dem Server wird verwaltet, was im Browser zu sehen ist. Wenn die Anwendungslogik Änderungen an der Oberfläche erfordert, werden mit dem Browser Nachrichten ausgetauscht, die diese Änderungen beschreiben. Die Render-Engine sorgt dann dafür, dass sich die Oberfläche im Browser ändert. Dieses Verfahren hat allerdings Grenzen, da man nicht jedes Ereignis problemlos vom Browser an den Server schicken kann. Stellen Sie sich vor, man würde jeden Tastendruck an den Server übermitteln, um die Zahl der eingetippten Zeichen zu ermitteln – vom Ajax-Gefühl wäre dann nichts mehr übrig! In der dritten Gruppe lassen sich Toolkits und Frameworks unterbringen, die eine Anwendung zunächst weitgehend ohne die spätere Laufzeitumgebung beschreiben und dann nach JavaScript oder Flash übersetzen. OpenLaszlo (http://www.openlaszlo.org/) ist ein Vertreter dieser Gruppe. Framework oder Toolkit Vielleicht haben Sie bemerkt, dass ich scheinbar wahllos die Begriffe Toolkit und Framework verwendet habe. Diese beiden Begriffe lassen sich aber ganz gut auseinanderhalten. Ein Framework zeichnet einen Lösungsweg vor. Wer ein Framework benutzt, muss sich an diesen einmal umgesetzten Lösungsweg halten. Technisch wird das so umgesetzt, dass der eigene Code vom Framework aufgerufen wird. Bei einem Toolkit ist das nicht der Fall. Man kann es einsetzen, wo man es braucht, und lässt es an den Stellen bleiben, wo es nicht sinnvoll ist. Hier rufen wir den Code des Toolkits auf. Auch das Google Web Toolkit ist kein Framework. Man könnte zwar den Aufruf der onLoadMethode so interpretieren, dass wir Code zur Verfügung stellen, der vom GWT aufgerufen wird. Eigentlich handelt es sich aber nur um eine Möglichkeit, die Anwendung zu starten. Bei allem, was danach geschieht, benutzen wir die Möglichkeiten des Toolkits wie einen Werkzeugkasten, mit dem wir unsere Anwendung erstellen. Warum eigentlich Ajax und nicht AJAX? Der Begriff AJAX legt ziemlich genau die zu verwendende Technik fest. Er setzt XML als Mittel und JavaScript als Weg voraus. Diese Definition trifft zwar auf einige Verfahren und Lösungswege zu, aber die Regel sieht heute ganz anders aus: An Stelle von XML – entweder als rohes XML für den Austausch von Daten oder aufbereitet in Form von XHTML – tritt zunehmend das Austauschformat JSON. Ajax | 5 719-5.book Seite 6 Mittwoch, 9. Januar 2008 10:58 10 JSON (JavaScript Object Notation – http://www.json.org/) ist ein einfaches Textformat für den Datenaustausch. Ähnlich wie bei XML ist es möglich, nicht nur eine Aneinanderreihung von Werten zu übermitteln, man kann in diesem Format auch komplexe hierarchische Strukturen beschreiben. Der Clou an diesem Format ist, dass es der Syntax von JavaScript entspricht. Aus diesem Grund ist es für JavaScript-Interpreter in den Browsern besonders einfach, mit diesem Format umzugehen. Außerdem ist es deutlich schneller als das Parsen von XML mit Hilfe von JavaScript. Es lassen sich Objekte, Arrays und einfache Werte benutzen. Das Textformat wird der eval-Funktion übergeben, und das Ergebnis ist ein JavaScript-Objekt, auf dessen Eigenschaften man ganz einfach mit der Punktoder Index-Notation (bei Arrays) zugreifen kann. Es gibt heute kaum noch eine Programmiersprache, für die es nicht einen Parser gibt, der mit diesem Format umgehen kann. Auch für das Serialisieren von Daten in das JSONFormat gibt es unzählige Umsetzungen. Dieses Format hat aber auch Schwächen: So ist es nicht direkt möglich, Typ-Informationen zu übermitteln. Das ist für JavaScript selbst kein Problem, da JavaScript eine untypisierte Sprache ist. Für typisierte Programmiersprachen aber schon, da es zu Fehlinterpretationen von Werten kommen kann. Das Google Web Toolkit benutzt ebenfalls JSON, sorgt aber durch eine zusätzliche Semantik dafür, dass die ausgetauschten Daten in typisierte Informationen übersetzt werden. Außerdem wird dem JSON-String ein Kommentar vorangestellt, so dass die Verwendung sicherer wird. Damit wäre das X schon mal null und nichtig. Aber auch JavaScript muss es nicht zwingend sein. Auch nicht, wenn man sich auf den Browser beschränkt. Schon seit geraumer Zeit wird neben JavaScript beispielsweise Flash für die Umsetzung von Webclients benutzt. Aus den dargestellten Gründen ist der Begriff Ajax für mich auch zunehmend allgemeiner als die spezielle, technische Abkürzung AJAX. Ajax steht für eine bessere Interaktion zwischen Anwender und Webseite, die sich mit unterschiedlichen Mitteln technisch umsetzen lässt. Letztendlich gehören also auch die Modifikation des DOM der Webseite zu diesem Begriff und damit auch die vielen bunten Effekte, die seit einigen Jahren die Webseiten optisch aufwerten. Man könnte auch sagen: Ajax ist ein Synonym für Rich Internet Application (RIA). Der Google-Weg Auch Google hat sich mit dem Google Web Toolkit für eine Lösung entschieden, bei der die Ajax-Anwendung in einer anderen Sprache als JavaScript geschrieben wird und für die Laufzeitumgebung eine Konvertierung nach JavaScript erfolgt. Da die Anwendung selbst in Java entwickelt wird, lassen sich eine Reihe der oben angesprochenen Probleme lösen: 6 | Kapitel 1: Einleitung 719-5.book Seite 7 Mittwoch, 9. Januar 2008 10:58 10 • Java ist eine typisierte Sprache und ermöglicht deshalb eine Typprüfung bereits zur Entwicklungszeit. Ein API auf Basis einer typisierten Sprache beschreibt sich bei vernünftiger Umsetzung selbst. Damit ist deren Benutzung deutlich einfacher. • Die Unterstützung der Entwicklungsprozesse ist bei Java deutlich ausgereifter als bei JavaScript. Das betrifft z.B. die Code-Refaktorierung, das Debugging und das Testen. • Durch das Kompilieren nach JavaScript kann der JavaScript-Code für die Laufzeitumgebung optimiert werden (nur erreichbarer Code wird übersetzt, keine Strukturierung des Quellcodes zur Verbesserung der Lesbarkeit, Abkürzung von Variablennamen …). Warum man sich bei Google gerade für die Kombination Java – JavaScript entschieden hat, kann nur spekuliert werden. Wirft man aber beispielsweise einen Blick auf Abbildung 1-1, dann wird deutlich, dass beide Sprachen sehr weit verbreitet sind (für diese Grafik wurden die Buchverkäufe ausgewertet). Etwa 25% der verkauften Bücher befassen sich mit diesen beiden Sprachen. Daraus kann eine sehr breite Anwenderbasis abgeleitet werden. Die Prozentzahl in den Blöcken gibt an, wie groß die Veränderung gegenüber dem Vorjahr war. Am Zuwachs bei JavaScript um fast 50% dürfte der Ajax-Hype nicht ganz unschuldig sein. Abbildung 1-1: O’Reilly-Programmiersprachenindex, Stand 4. Quartal 2006 (Quelle: http://radar.oreilly.com/archives/2007/01/state_of_the_co_3.html) Der Google-Weg | 7 719-5.book Seite 8 Mittwoch, 9. Januar 2008 10:58 10 Besonders im kommerziellen Umfeld wird Java sehr häufig für die Implementierung der Serverlogik benutzt. Auch aus diesem Grund ist es sinnvoll, Java für die Entwicklung von Ajax-Anwendungen zu benutzen. Auf diese Weise können Entwickler von den Erfahrungen profitieren, die sie sowieso schon mit Java haben. Der Weg hin zu JavaScript über eine andere Sprache hat noch einen weiteren Vorteil. Die Sprachmittel von Java ermöglichen es, gegen Schnittstellen zu programmieren. Dadurch lassen sich Implementierungen austauschen. Gerade die vielen Browser-Inkompatibilitäten lassen sich so hervorragend verbergen. Man muss sich als Entwickler nicht darum kümmern, wie sich die Browser-Historie so verbiegen lässt, dass auch eine Ajax-Anwendung über die Vor- und Zurück-Buttons der Browser bedienbar wird. Das GWT-Prinzip Wenn man das Google Web Toolkit also für die Erstellung von Ajax-Webanwendungen einsetzt, dann programmiert man zunächst einmal in Java. Mit Hilfe des GWT-Compilers wird dieser Java-Quelltext dann nach JavaScript übersetzt. Nimmt man den JavaQuellcode für sich und verzichtet auf Oberflächenkomponenten und die direkte Integration von JavaScript (dazu später mehr), dann hat man aber auch Quellcode vor sich, der in jeder Java Virtual Machine lauffähig ist. Man kann den gleichen Quellcode zumindest theoretisch auf dem Server und im Client verwenden. Zur Laufzeit ist es im Client dann aber JavaScript. Wie wir noch sehen werden, ist das GWT auch in der Lage, für jeden Browser eine eigene JavaScript-Datei zu erstellen. Dieses so genannte Deferred Binding ermöglicht es, den zu ladenden Quellcode deutlich zu reduzieren. Andernfalls müsste jeder Browser auch Quellcode laden, der gar nicht für ihn bestimmt ist. Das Prinzip wird auch benutzt, um verschiedene Landessprachen einer Ajax-Anwendung zu unterstützen. Auch hier gilt: Es werden nur die Sprachinformationen geladen, die letztendlich auch zur Anzeige kommen. In die HTML-Seite muss die so erstellte JavaScript-Datei dann nur noch eingebunden werden – den Rest erledigt das kompilierte JavaScript. Dass eine Webseite überhaupt mit Hilfe des GWT umgesetzt wurde, erkennt man nur, wenn man diese JavaScript-Datei analysiert. Andere Hinweise gibt es nicht. Wer setzt das GWT ein? Etwa ein Jahr nach der Veröffentlichung des Toolkits durch Google wurde im Mai 2007 der millionste Download gezählt. Das Entwicklerforum (http://groups.google.com/ group/Google-Web-Toolkit) hat inzwischen über 9.000 Mitglieder und weist zum heutigen Zeitpunkt (September 2007) einen Umfang von mehr als 30.000 Beiträgen auf. Da man einer Webanwendung von außen nicht unbedingt ansieht, dass sie mit dem Google Web Toolkit umgesetzt wurde, ist es etwas schwierig herauszubekommen, wer das Toolkit für produktive Anwendungen einsetzt. In der Regel erfährt man das nur durch entsprechende Werbung der Unternehmen oder durch Forenbeiträge. 8 | Kapitel 1: Einleitung 719-5.book Seite 9 Mittwoch, 9. Januar 2008 10:58 10 Hier einige Beispiele: • www.eTripBuilder.com – ein Reiseplaner, vollständig mit dem GWT realisiert. • http://tellmewhere.com/ – eine typische Web 2.0-Anwendung, in der man seine Lieblingsorte anderen mitteilen kann. • http://openkm.com/index.pl/home_en – ein OpenSource-Dokumentenmanagement. • http://beta.contactoffice.com/ – eine Anwendung für Bürosoftware. • Ich verwende das Toolkit jetzt seit über einem Jahr für unterschiedliche Projekte: z.B. auf www.epivista.de, das auch Ausgangsbasis für das Beispiel in diesem Buch war. Google scheint sich momentan noch zurückzuhalten, was den Einsatz des Toolkits für die eigenen zahlreichen Ajax-Anwendungen angeht. Es gibt inzwischen auch eine sehr große Anzahl an Bibliotheken, die das GWT um Oberflächenkomponenten erweitern. Auch Werkzeuge zum Erstellen von Oberflächen sind inzwischen verfügbar. Für welche Projekte eignet sich das GWT, für welche eher nicht? Grundsätzlich lässt sich fast jede Form von Webanwendung mit dem Google Web Toolkit umsetzen. Wirklich sinnvoll ist der Einsatz aber nur dann, wenn es sich um hochdynamische Anwendungen handelt, die besonders viel Benutzerinteraktion erfordern. Das können typische Office-Anwendungen oder solche Anwendungen sein, bei denen der Anwender sehr viele Daten erfassen muss. Bei dem Beispiel zu diesem Buch ist das der Fall. Von Vorteil ist das GWT besonders, wenn auch die serverseitige Entwicklung bereits in Java erfolgt. Dann ist nämlich das nötige Know-how für einen sehr schnellen Ein-/ Umstieg bereits vorhanden. Nichtsdestotrotz lässt es sich aber auch für Anwendungen benutzen, die auf PHP oder einer anderen Sprache für die Erstellung dynamischer Webanwendungen basieren. Eher ungeeignet ist das GWT, wenn es ausschließlich darum geht, eine Seite mit den weitverbreiteten optischen Effekten zu versehen. Dazu gibt es zahlreiche JavaScriptBibliotheken, die sich genau an diese Zielgruppe wenden. Außer Acht lassen sollte man auch nicht, dass es viele Anwendungsgebiete gibt, die sehr hohe Anforderungen an die Sicherheit einer Webanwendung stellen. Da kann es durchaus eine Forderung geben, dass JavaScript nicht verwendet werden darf. Somit ist auch das GWT nicht einsetzbar. Auf diese Problematik werde ich in Kapitel 6 ausführlicher eingehen. Der Google-Weg | 9 719-5.book Seite 10 Mittwoch, 9. Januar 2008 10:58 10 Ausblick Momentan (September 2007) ist die Version 1.4 des GWT aktuell. Diese Version ist auch die Grundlage für dieses Buch. An einigen Stellen werde ich auf besondere Änderungen und Erweiterungen im Vergleich zur Version 1.3 hinweisen. Zu Beginn der Entwicklung waren der Quellcode des Compilers und der GWT-Shell nicht öffentlich verfügbar. Inzwischen ist das Google Web Toolkit vollständig Open Source. Ein sehr zu begrüßender Schritt. Trotzdem stellt sich natürlich die Frage, warum Google ein solches Toolkit vollständig öffentlich macht. Das dürfte mit der strategischen Zielsetzung von Google zu tun haben: Wenn es das Ziel ist, herkömmliche DesktopAnwendungen durch Webanwendungen zu ersetzen (eine klare Kampfansage an Microsoft), dann muss die Entwicklung solcher Anwendungen einfach und kostengünstig möglich sein. Und genau das ist mit dem Google Web Toolkit möglich. Auch in Kombination mit Google Gears – einer Browser-Erweiterung, um Webanwendungen mit der Möglichkeit zu versehen, offline zu arbeiten – ergeben sich völlig neue Einsatzmöglichkeiten für dieses Toolkit. Insofern ist die Investition in GWT-Know-how also keine vertane Zeit! Über dieses Buch In diesem Buch geht es nicht darum, jedes Feature des Google Web Toolkits vorzustellen und in ausführlichen Beispielen durchzuexerzieren. Ziel ist es, Ihnen ein Hilfsmittel für die Erstellung professioneller Lösungen auf Basis dieses Toolkits an die Hand zu geben. Dazu zählt es, die Arbeitsweise des Toolkits zu verstehen und die richtigen Design-Entscheidungen zu treffen. Zielgruppe und Voraussetzungen Das Buch wendet sich daher an Webentwickler, die bereits Erfahrungen mit Java haben. Außerdem sind grundlegende Kenntnisse über HTML, DOM, JavaScript, CSS – also die Basis jeder Webanwendung – zwingend erforderlich. Für Einsteiger in die Materie Ajax und Web ist es eher ungeeignet. Für Entwickler, die noch nie mit Java in Berührung gekommen sind, wird die Lektüre unter Umständen schwierig sein – allerdings muss auch niemand ein Java-Profi sein. Von Vorteil ist es auch, wenn einige Grundkenntnisse auf dem Gebiet der objektorientierten Entwurfsmuster vorhanden sind. Das Beispiel Die Kapitel enthalten für die einzelnen Themen eine allgemeine Beschreibung, bieten als »Gedankenstütze« aber auch immer eine ganz konkrete Lösung. Am Ende des Buches werden die Bausteine für ein vollständiges Fitnesstagebuch zusammengetragen sein, das Sie auch live unter http://www.gwt-buch.de/fitnesstagebuch ausprobieren können. 10 | Kapitel 1: Einleitung 719-5.book Seite 11 Mittwoch, 9. Januar 2008 10:58 10 Dieses Fitnesstagebuch ermöglicht dem Anwender, seine sportlichen Aktivitäten in einer Drei-Monats-Übersicht zu planen und zu dokumentieren. Er kann sich sämtliche Sportarten, Trainingsarten, Strecken und die verwendete Ausrüstung frei konfigurieren. Die zurückgelegten Strecken werden für jeden Monat aufsummiert. Durch die Möglichkeit, Einträge zu kopieren, auszuschneiden und einzufügen, lässt sich die Anwendung mit einer Geschwindigkeit bedienen, wie Sie sie sicherlich nur von Desktop-Anwendungen gewohnt sind. Für Auswertungen lassen sich die Daten als Excel-Datei herunterladen. Abbildung 1-2: Das Fitnesstagebuch Abbildung 1-2 zeigt den derzeitigen Stand (September 2007). Wenn Sie das Buch in den Händen halten, wird sich der Funktionsumfang vielleicht noch etwas erhöht haben – mit dem GWT zu arbeiten macht nämlich auch Spaß. Der Quelltext ist teilweise auf der Homepage zum Buch verfügbar. Bei Interesse am gesamten Projekt schreiben Sie mir einfach. Über dieses Buch | 11 719-5.book Seite 12 Mittwoch, 9. Januar 2008 10:58 10 Aufbau des Buches Im folgenden Kapitel werde ich Ihnen das Google Web Toolkit vorstellen. Ich werde die Prinzipien erläutern und anhand kurzer Beispiele die Verwendung demonstrieren. Wenn Sie mit dem GWT bereits vertraut sind, können Sie dieses Kapitel getrost überspringen. Die dann folgenden Kapitel gehen in die Tiefe und befassen sich mit der konkreten Entwicklung von Ajax-Anwendungen. Dabei sind die Kapitel chronologisch aufgebaut. Am Anfang stehen die Architekturentscheidungen und das Einrichten der Entwicklungsumgebung. Danach folgen Themen wie Remote Procedure Call, Sitzungsverwaltung und objektorientiertes Programmieren von Oberflächen – Stichwort MVC. Wenn die Anwendung in den Grundzügen steht, werden wir uns der Lokalisierung und der Integration von JavaScript-Bibliotheken widmen. Abschließend werden das Deployment von GWTAnwendungen und die Performance-Optimierung behandelt. Damit entspricht die Reihenfolge der Kapitel etwa der Abfolge, die auch in einem realen Projekt abgearbeitet wird. Konventionen Ich werde durchgehend Eclipse als Entwicklungsumgebung benutzen. Zum einen, weil es inzwischen nahezu ein Standard ist, was gerade auf die Entwicklung mit Java zutrifft, und zum anderen, weil es auch meine bevorzugte IDE ist. Außerdem wird Eclipse vom Google Web Toolkit direkt unterstützt. Die dargestellten Prinzipien sollten so oder so ähnlich aber auch in anderen Entwicklungsumgebungen verfügbar sein. Da das GWT momentan nur mit der Java-Version 1.4 arbeitet – um genau zu sein: nur Java 1.4-Quellcode lässt sich nach JavaScript übersetzen –, werde ich durchgehend diese Java-Version verwenden. Das gilt auch für Quellcode, der serverseitig eingesetzt wird. In der Version 1.5 des GWT wird es die Beschränkung auf Java 1.4 aber nicht mehr geben, so dass dann beispielsweise auch Generics, Annotations und Enums für die Entwicklung benutzt werden können. Einige Grafiken enthalten »Pseudo-UML-Diagramme«. Die Grafiken sind allerdings stark reduziert. Eigentlich genügt es zu wissen, dass ein Pfeil eine Ableitung meint und ein gestrichelter Pfeil andeutet, dass die Klasse ein Interface implementiert. Alles andere dürfte sich aus dem Zusammenhang erschließen. Ich werde mich bemühen, soweit möglich und sinnvoll, die deutsche Sprache zu verwenden. An einigen Stellen geht das aber nicht. Zum Beispiel dann, wenn Fachbegriffe und Eigennamen aus der Java- oder GWT-Welt benutzt werden, für die es keinen deutschen Begriff gibt. Diese werde ich nicht übersetzen, damit Sie die gleichen Begriffe auch in englischsprachigen Dokumentationen wiederfinden. Auch die verwendete Eclipse-Version ist englisch. Sicher gibt es auch deutsche Sprachpakete für Eclipse, die aber nur selten verwendet werden und im Allgemeinen nicht vollständig sind, so dass es wahrscheinlich dazu kommen würde, dass einige Eclipse-spezifische Begriffe englisch und andere in Deutsch erscheinen. 12 | Kapitel 1: Einleitung 719-5.book Seite 13 Mittwoch, 9. Januar 2008 10:58 10 Dieses Buch verwendet außerdem die folgenden typografischen Konventionen: Kursiv Wird für wichtige Begriffe, Programm- und Dateinamen, URLs, Ordner und Verzeichnispfade und zur Hervorhebung verwendet. Nichtproportionalschrift Wird für Programmcode, Klassen- und Methodennamen verwendet. Fette Nichtproportionalschrift Verwende ich, um wichtige Stellen im Code herauszustellen, auf die ich mich im erläuternden Fließtext beziehe. KAPITÄLCHEN Kennzeichnen Menüeinträge, Buttons und andere GUI-Schaltflächen. Dies ist ein praktischer Hinweis darauf, wie Sie Dinge einfacher und schneller durchführen können. Mit diesem Symbol wird auf Besonderheiten hingewiesen, die zu Problemen führen oder ein Risiko darstellen knnen. Über dieses Buch | 13 719-5.book Seite 14 Mittwoch, 9. Januar 2008 10:58 10 719-5.book Seite 15 Mittwoch, 9. Januar 2008 10:58 10 KAPITEL 2 Das Google Web Toolkit – eine Rundreise In diesem Kapitel werde ich Ihnen das Google Web Toolkit und die grundsätzliche Arbeitsweise mit dem Toolkit vorstellen. Dabei ist es nicht das Ziel, jedes Feature ausführlich darzustellen, sondern Ihnen einen Überblick zu verschaffen. Wenn Sie mit dem Toolkit bereits vertraut sind, können Sie dieses Kapitel getrost überspringen. Download und Installation Alles, was Sie zum Arbeiten benötigen, ist das Toolkit, das Sie auf der Homepage (http://code.google.com/webtoolkit/) herunterladen können, und ein Java Runtime Environment ab Version 1.4. Nach dem Entpacken des Toolkits in das Dateisystem befinden sich dort einige Jar-Dateien, DLLs (bei der Windows-Version), so-Dateien (bei der Linux-Version) bzw. jnilib-Dateien (bei der Mac-Version). Außerdem finden Sie dort die Dokumentation, einige Beispiele und ein paar Batch-Dateien, die den Aufruf der Kommandozeilenwerkzeuge etwas komfortabler machen. Dieses Verzeichnis werde ich in Zukunft als GWT-Home bezeichnen. Das Google Web Toolkit ist also zunächst einmal nichts weiter als eine Sammlung von Bibliotheken und einigen Kommandozeilenwerkzeugen. Diese Werkzeuge stellen auch nichts weiter dar als einen komfortableren Weg, die main-Methoden von Java-Klassen des GWT aufzurufen. Da das Toolkit in Java geschrieben ist, lässt es sich zudem sehr gut in jede Java-Entwicklungsumgebung integrieren. Arbeitsprinzip Wenn man eine Webanwendung mit Hilfe des Google Web Toolkits erstellen möchte, programmiert man gegen ein Java-API, das vom GWT zur Verfügung gestellt wird. Der eigene Quellcode wird mit Hilfe des GWT-Compilers nach JavaScript übersetzt. Die Packages java.lang und java.util werden dabei emuliert. Für das Ausführen einer mit dem GWT erstellten Webanwendung benötigt man daher später so gut wie keine Bibliotheken des GWT. Im Browser des Benutzers läuft die Anwendung völlig in JavaScript. | 15 719-5.book Seite 16 Mittwoch, 9. Januar 2008 10:58 10 Nur auf dem Server wird eine Bibliothek des GWT benötigt, wenn man den Remote Procedure Call-Mechanismus des GWT verwendet – das muss aber nicht zwingend der Fall sein. Durch die GWT-Shell wird der Entwickler bei der Umsetzung von GWT-Anwendungen unterstützt. Sie stellt eine Ablaufumgebung dar, in der die spätere Anwendung ohne ein Kompilieren nach JavaScript ausgeführt werden kann. Dazu bildet sie eine »Schale« um einen Browser (Internet Explorer unter Windows und Firefox unter Linux). So ermöglicht das GWT auch das Debuggen einer Webanwendung, die später in JavaScript ablaufen wird. Das Google Web Toolkit setzt sich aus folgenden Bestandteilen zusammen: • der GWT-Shell (mit einem integrierten Tomcat) – als Entwicklungswerkzeug • dem GWT-Compiler – zur Übersetzung des Java-Quellcodes nach JavaScript • dem GWT-API, gegen das wir die Webanwendung programmieren Projekt generieren Wenn man sich einem unbekannten Werkzeug oder einer neuen Programmiersprache nähert, war es schon immer ein bewährtes Vorgehen, mit einem Hallo-Welt-Beispiel zu beginnen. Das Google Web Toolkit macht es uns in dieser Hinsicht sehr einfach, weil das generierte Grundgerüst eines GWT-Projekts schon ein solches Beispiel ist. Um ein neues GWT-Projekt für die Eclipse-Entwicklungsumgebung zu erstellen, enthält das Toolkit zwei Kommandozeilenwerkzeuge, die ein Grundgerüst der Anwendung generieren können. Dabei ist projectCreator für das Erstellen eines nahezu leeren Eclipse-Projekts verantwortlich und applicationCreator für die eigentlichen Projektquellen. Das Eclipse-Projekt kann über den folgenden Befehl auf der Kommandozeile erstellt werden: projectCreator -eclipse HalloWelt -out HalloWelt Dazu kann man in das GWT-Home-Verzeichnis wechseln oder das GWT-Home-Verzeichnis der PATH-Variable hinzufügen, um den Befehl aus einem beliebigen Verzeichnis heraus aufzurufen. Im Ergebnis wird das Verzeichnis HalloWelt angelegt, und darin werden die beiden Verzeichnisse src und test erstellt. Außerdem werden die Dateien .classpath und .project erstellt, die die Eclipse-Umgebung konfigurieren. Das generierte Eclipse-Projekt erhält den Namen HalloWelt, wie von uns durch den Wert des Parameters –eclipse vorgegeben. Als Nächstes werden die eigentlichen Java-Quellen mit dem folgenden Aufruf generiert: applicationCreator -eclipse HalloWelt -out HalloWelt de.gwtbuch.client.HalloWelt Auch hier müssen wiederum der Name des Eclipse-Projekts und das Ausgabeverzeichnis angegeben werden. Zusätzlich wird der Name des zu erstellenden GWT-Moduls übergeben. Dieses muss im Package-Namen zwingend client enthalten. 16 | Kapitel 2: Das Google Web Toolkit – eine Rundreise 719-5.book Seite 17 Mittwoch, 9. Januar 2008 10:58 10 Das so generierte Projekt kann jetzt in Eclipse importiert werden. Dazu wird der Menüpunkt IMPORT (Kontextmenü oder Menü FILE) benutzt und im dann erscheinenden Dialog die Option »Existing Projects into Workspace« ausgewählt. Anschließend muss nur noch das Verzeichnis HalloWelt angegeben werden. Das Projekt HalloWelt wählt Eclipse automatisch aus. Die Projektstruktur Nach dem erfolgreichen Import des Projektes ist die in Abbildung 2-1 sichtbare Projektstruktur in Eclipse verfügbar. Abbildung 2-1: Die Standard-Projektstruktur in Eclipse Die beiden Batch-Dateien HalloWelt-compile und HalloWelt-shell kann man löschen, da sie für erste Tests mit der Eclipse-Entwicklungsumgebung nicht erforderlich sind und ich in späteren Kapiteln noch zeigen werde, dass man ganz gut ohne sie auskommt. Wer Eclipse nicht benutzt, ist aber auf diese beiden Befehle angewiesen. Damit lässt sich nämlich die GWT-Shell starten und das Projekt nach JavaScript kompilieren. In der Datei HalloWelt.launch speichert Eclipse die Run-Konfiguration für das Ausführen der GWT-Shell. Diese Datei ist dafür verantwortlich, dass sich bereits nach dem Import ein Eintrag HALLOWELT im Dialog für die Run-Konfigurationen befindet. Diesen muss man nur auswählen, und die Shell wird gestartet. Alle nötigen Einstellungen, wie der Classpath, die Parameter und die auszuführende Klasse, sind bereits automatisch eingetragen. Wird die Run-Konfiguration ausgeführt, startet die GWT-Shell und öffnet den Hosted-Browser. Die Projektstruktur | 17