Einführung in das Google Web Toolkit am Beispiel eines Projektes

Transcription

Einführung in das Google Web Toolkit am Beispiel eines Projektes
Einführung in das Google Web Toolkit am Beispiel eines
Projektes aus der Verkehrstelematik
Seminararbeit im Studiengang
Scientific Programming
vorgelegt von:
Sebastian Schilling
Matr.-Nr: 836371
15. Dezember 2011
1. Betreuer: Prof. Dipl.-Math. Hans Ulrich Stegelmann
2. Betreuer: Dipl.-Math. Michael Schmidt
Abstract.Die Entwicklung einer umfangreichen AJAX-Anwendung allein mit den vorhandenen Web-Techniken HTML, CSS und JavaScript ist äußerst aufwendig. Unterschiedliche
Interpretation der Browser von JavaScript und HTML, verschiedene Implementationen des
XMLHttpRequest-Objekts und Speicherlöcher erschweren die Entwicklung. Das Framework
Google Web Toolkit (GWT ) umgeht diese Probleme und gibt dem Entwickler die Möglichkeit,
AJAX-Anwendungen in der typensicheren Programmiersprache Java zu implementieren, welche später vom GWT-Compiler zu JavaScript compiliert wird.
In meiner folgenden Seminararbeit werde ich auf die grundsätzlichen Funktionen und Möglichkeiten des Frameworks eingehen. Im Schlussteil wird der Einsatz des Google Web Toolkits
am Beispiel eines Projektes aus der Verkehrstelematik dargelegt.
2
Inhaltsverzeichnis
1 Einleitung
1.1 Motivation . . . . . . .
1.2 Allgemeines . . . . . .
1.2.1 Ajax . . . . . .
1.2.2 Was ist GWT?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
6
6
7
2 Grundlagen
2.1 Projektstruktur . . . . . . . . . . . . .
2.1.1 Die HTML-Datei . . . . . . . .
2.1.2 Die Java-Datei . . . . . . . . .
2.2 Die GWT-Konfiguration über Module
2.3 Hosted- und Web-Modus . . . . . . . .
2.3.1 Hosted-Modus . . . . . . . . .
2.3.2 Web-Modus . . . . . . . . . . .
2.4 Entwicklungszyklus . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
8
9
10
11
11
12
12
.
.
.
.
.
.
.
.
.
.
14
14
14
14
15
17
18
19
20
20
20
4 Der Compiler von GWT
4.1 GWT-Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 JRE-Emulationsbibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
22
23
5 Vor- und Nachteile von GWT
5.1 Vorteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Nachteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
24
24
6 GWT im Einsatz am Beispiel eines Projektes aus
6.1 Projektbeschreibung . . . . . . . . . . . . . .
6.1.1 Anforderungen . . . . . . . . . . . . .
6.1.2 Randbedingungen . . . . . . . . . . .
6.2 Einsatz von GWT im Projekt . . . . . . . . .
26
26
26
26
27
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 GWT-Features
3.1 Gestaltung von Benutzeroberflächen
3.2 Remote Procedure Calls . . . . . . .
3.2.1 RPC mittels RequestBuilder .
3.2.2 GWT-RPC . . . . . . . . . .
3.3 JUnit . . . . . . . . . . . . . . . . .
3.4 XML-Parser . . . . . . . . . . . . . .
3.5 Browser History . . . . . . . . . . . .
3.6 JavaScript Native Interface . . . . .
3.6.1 JSNI-Syntax . . . . . . . . .
3.6.2 Java aus JavaScript aufrufen
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
der Verkehrstelematik
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Fazit
28
Abbildungsverzeichnis
29
Literaturverzeichnis
30
3
Eidesstattliche Erklärung
Hiermit versichere ich, dass ich die Seminararbeit mit dem Thema
"Einführung in das Google Web Toolkit am Beispiel eines Projektes
aus der Verkehrstelematik"
selbstständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt
habe, alle Ausführungen, die anderen Schriften wörtlich oder sinngemäß entnommen wurden,
kenntlich gemacht sind und die Arbeit in gleicher oder ähnlicher Fassung noch nicht Bestandteil einer Studien- oder Prüfungsleistung war.
Name: Sebastian Schilling
1 Einleitung
1.1 Motivation
In der Verkehrstelematischen Branche wird häufig eine Client-Server-Architektur für Anwendungen benutzt, da viele Systeme als Echtzeitsysteme ausgelegt sind und Daten, zum Beispiel
von der Verkehrsdichte, ständig aktualisiert werden müssen. Hierzu möchte ich gerne zwei
System-Architekturen kurz vorstellen:
Zum einem wäre ein sogenannter Fat-Client einsetzbar. Ein Fat-Client zeichnet sich dadurch
aus, dass er alle Funktionen der Präsentation und Anwendungslogik bereits implementiert
hat, und somit weitestgehend unabhängig vom Netzbetrieb arbeiten kann. Größter Nachteil
hierbei wäre der hohe Aufwand für die Aktualisierung von Updates, der aber nicht garantiert,
dass alle Systeme mit der gleichen Version laufen. Ein erhöhter Aufwand an Support ist die
Folge.
Hinzu kommen noch die Einrichtung und Wartung von eigenen Infrastrukturen. So müssen
eigene Protokolle entwickelt werden um über eigene Ports zwischen Client und Server kommunizieren zu können.
Eine andere Alternative ist der Thin-Client. Thin-Clients stellen nur die Benutzerschnittstelle zur Verfügung, sodass die Datenverarbeitung durch den Server erfolgt. Mittels der ”ZeroInstallation” wird die Applikation nicht wie üblich installiert und auf der Festplatte gespeichert, sondern nur per URL-Aufruf geladen. Hiermit wird sichergestellt, dass alle Anwender
die gleiche Version nutzen, da die Software zentral zur Verfügung gestellt wird. Nachteil dieser
Systemarchitektur liegt in der Abhängigkeit vom Netzwerk.
Es war ein Anliegen eines Kunden aus der Verkehrstelematischen Branche, bereits installierte
und bekannte Infrastrukturen zu benutzen. Laufende Systeme müssen dadurch nicht komplett
umgestellt werden, Benutzer nicht neu geschult werden und eine gewisse Erfahrung mit der
Sicherheit der Infrastruktur liegt bereits vor. Diese Voraussetzungen werden von einer RichInternet-Applikation erfüllt. Rich-Internet-Aplications sind dynamische Desktoanwendungen,
die im Browser laufen. Folglich werden alle Vorteile des Thin-Clients ausgenutzt und darüber
hinaus auf bekannte Infrastruktur, dem HTTP-Protokoll, zugegriffen.
Um eine Rich Internet Applikation im Browser Umfeld zu entwickeln, kommt zwangsläufig
entweder eine Plug-in basierte oder auf HTML/JavaScript basierte Technologie zum Einsatz.
Die Projektleitung hat sich für die Technologie mittels HTML/JavaScript entschieden. Der
clientseitige Code soll in JavaScript implementiert werden, um bestimmte Benutzeraktionen
schon auf dem Client durchführen zu können. Leider wird JavaScript in jedem Browser anders
interpretiert und für native Java-Entwickler ist ein gewisser Aufwand nötig um sich mit der
neuen Skriptsprache vertraut zu machen.
Das Google Web Toolkit bietet nun nativen Java-Entwicklern die Möglichkeit, sowohl Serveralso auch Client-Seite in Java zu programmieren. Dabei kann vorhandenes Java-Wissen, bekannte Entwicklungsumgebungen und Tools wie gewohnt weiter benutzt werden.
In dieser Seminararbeit werde ich nur die grundsätzlichen Arbeitsweisen und Funktionen
vom Google Web Toolkit vorstellen. Dabei ist es nicht mein Ziel, alle Features ausführlich
darzustellen, sondern Ihnen einen Überblick zu verschaffen. Spezielle Techniken, die für das
5
1.2. ALLGEMEINES
Verkehrstelematische Projekt benötigt werden, werden natürlich vertieft behandelt. Ich werde
mich auf die momentan aktuelle Version 2.4 von GWT beziehen, die am 8. September 2011
veröffentlicht wurde.
1.2 Allgemeines
Heutzutage gibt es immer weniger statische Internetseiten, welche meist nur sporadisch und
von einer Person aktualisiert werden. In den letzten vergangenen Jahren ging die Entwicklung
von Webseiten immer weiter in Richtung Web 2.0. Folgende Definition verfasste Eric Knorr
2003 in einem Fachmagazin für IT-Manager:
”An increase of outsourcing with web services is nothing less than the start of what
Scott Dietzen, CTO of BEA Systems, calls the Web 2.0, where the Web becomes
a universal, standards-based integration platform. Web 1.0 (HTTP, TCP/IP and
HTML) is the core of enterprise infrastructure.” – Eric Knorr [Eri]
Statische Webseiten mit reinem HTML und Hyperlinks wurden durch den User-GeneratedContent ersetzt. Es wurde versucht individuelle Seiten für Besucher bereitzustellen. Um diesen
Aufwand bewältigen zu können, mussten neue Technologien wie Ajax, JavaScript und neue
Infrastruktur auf Seiten des Servers eingesetzt werden.
In meiner Seminararbeit werde ich jedoch nur auf die Client-Seite eingehen, wie es heutzutage
mit dem Toolkit von Google (GWT) möglich ist, Rich-Internet-Apllication zu erstellen.
1.2.1 Ajax
Ajax steht für ”Asynchronous JavaScript and XML”, die das Konzept der asynchronen Datenübertragung zwischen Browser und Server beinhaltet. Dabei handelt es sich um eine Technologie, die im Grunde nur auf dem Client ausgeführt wird. Bei statischen Webseiten wird
für jede Benutzeraktion eine neue HTTP-Anfrage gestartet, da das Hypertext Transfer Protocol(HTTP), ein verbindungsloses Protokoll, keine dauerhafte Verbindung zwischen Sender
und Empfänger ermöglicht. Der Response der HTTP-Anfrage wird auch bei nur kleinen Veränderung des Seiteninhalts den kompletten Seitenaufbau wieder enthalten.
Um diesen unnötigen Traffic und Performance Verlust entgegenzuwirken kommt nun Ajax ins
Spiel. Mit Ajax ist es möglich, nur bestimmte Teile einer Webseite vom Server anzufordern,
die neue Daten enthalten. Meist wird dies durch eine asynchrone Anfrage realisiert, die in
Form, wie der ausgeschriebene Name Ajax vermuten lässt, eines XML-Dokuments erfolgen
kann. Ein anderes beliebtes Format ist das sogenannte JSON-Format(JavaScript Object Notation), welches nicht nur von JavaScript ausgelesen werden kann, sondern auch von vielen
anderen Programmiersprachen1 .
Die Verarbeitung der Benutzeraktionen, für die keine Verbindung zum Server notwendig ist,
"wie beispielsweise das Validieren von Daten, das Verändern von Daten, welche sich im Speicher befinden, und sogar das Navigieren zwischen einzelnen Elementen der Webseite"[Jes],
werden vom Client(Ajax-Engine) übernommen.
Ajax verwendet nur Techniken aus dem Umfeld von DHTML (dynamic HTML). Darunter
fällt auf der Client-Seite neben HTML auch die Skriptsprache JavaScript, mit der man mittels dem XMLHttpRequest-Objekt bei einer Ajax-Applikation, Daten asynchron vom Server
anfordern kann. Die Server-Plattform ist aus der Sicht von Ajax eine Art Blackbox, deren
Hauptaufgabe die Bereitstellung der benötigten Komponenten ist.
1
http://www.json.org/ - Stand: 08.12.2011
6
1.2. ALLGEMEINES
1.2.2 Was ist GWT?
Das Google Web Toolkit (GWT) wurde im Mai 2006 von Google veröffentlicht und unterliegt
der Opensource-Lizenz2 . Es handelt sich dabei um ein Framework, mit dem es möglich ist,
komplexe und interaktive Desktop-ähnliche Ajax-Applikationen zu erstellen. Die gesamte Entwicklung von Client und Server kann in der Programmiersprache Java durchgeführt werden.
Der mitgelieferte GWT-Compiler übersetzt den clientseitigen Java-Quelltext in JavaScipt,
HTML und CSS. Die hieraus entstandenen Dateien können in allen gängigen Browsern dargestellt werden ohne dass der Entwickler selbst auf die unterschiedlichen Interpretationen der
Browser achten muss.
Unterstützt wird das GWT von einigen Entwicklungsumgebungen, wie NetBeans, IntelliJ
IDEA oder Eclipse[UF06]. Der Java-Programmierer kann in seinem bekanntem Java-Umfeld
Swing-ähnliche Oberflächen entwickeln ohne sich speziell mit JavaScript auskennen zu müssen. Das Debuggen des Codes ist auch in Java möglich, so wie das Testen mit dem bekannten
Java-Test-Framework JUnit.
GWT bietet auch Zugriff auf beliebte JavaScript-Bibliotheken oder alten JavaScript-Code,
sodass die Integrität von GWT so flexibel wie möglich ist.
Es stehen externe, umfangreiche Bibliotheken zur Verfügung, die die Entwicklung der graphischen Oberfläche erleichtern. Unter anderem gibt es Textfelder, Dropdownmenüs, Formularfelder, Baumstrukturelemente, Dialogfenster, Menüleisten, etc.
Die Kommunikation mit dem Server kann zum einen, wie bei AJAX-Applikationen üblich, über
das XMLHttpRequest-Objekt erfolgen oder über einen integrierten Remote Prozedure CallMechanismus. Die letztere Möglichkeit setzt jedoch voraus, dass die Server-Implementierung
in Java erfolgt, wogegen dies bei dem XMLHttpRequest-Objek beliebig sein kann.
2
Einige Teile des GWT standen längere Zeit nur als ”closed source” zur Verfügung. Mittlerweile ist jedoch
das ganze GWT Open-Source[HT07]
7
2 Grundlagen
2.1 Projektstruktur
GWT wird mit dem Shell-Tool WebAppCreator ausgeliefert, dass eine typische GWT-Verzeichnisstruktur
anlegt und sie mit Beispielcode füllt. Folgende Zeile bewirkt in der Kommandozeile, das ein
neues Projekt mit der GWT-Struktur erstellt wird. Dies kann auch in einer beliebigen Entwicklungsumgebung mit Hilfe eines Assistenten durchgeführt werden.
webAppCreator -out helloWorld de.sample.helloWorld
Es werden drei Packages erstellt: client, server und shared. Alle Java-Klassen die sich später
im Package cleint befinden, werden vom GWT-Compiler zu JavaScript übersetzt. Das Package
server sollte alle Klassen umfassen, die nur für die Server-Implementation wichtig sind. Für die
Kommunikation zwischen den beiden, stellt GWT das dritte Package shared zur Verfügung.
Später stehen diese Klasse sowohl in JavaScript für den Client als auch in Java für den Server
zur Verfügung[HT07].
2.1.1 Die HTML-Datei
Ich werde im folgendem auf ein älteres HelloWorld-Beispiel von GWT eingehen, da der neue
Sample-Code bereits ein RPC-Mechanismus (s. Kapitel 3.2) beinhaltet.
Das alte GWT-Standard Beispiel,
ist ein einfache Ajax-Anwendung.
Wie in Abbildung 2.1 zu sehen ist,
befinden sich im unterm Bereich
der Webseite zwei Slots, in die später mittels GWT ein Button und
ein Label eingefügt wird. Durch das
Klicken auf den Button wird ein
Text im Label erscheinen. Also eine
einfache AJAX-Anwendung, an der
man aber gut die Struktur und Aufbau der Komponenten vom Google
Web Toolkit erfassen kann.
Folgende HTML-Datei befindet sich
neben einer CSS-Datei im Projekt- Abbildung 2.1: Darstellung der Datei HelloWorld.html
im Browser mit DOM-Elementen
unterordner ”war ”:
1
2
3
4
5
6
7
8
9
10
<html>
<head>
<meta http−e q u i v=" c o n t e n t −type " content=" t e x t / html ;
c h a r s e t=UTF−8">
<l i n k type=" t e x t / c s s " r e l=" s t y l e s h e e t " href=" B s p P r o j e k t . c s s ">
<t i t l e>Web A p p l i c a t i o n S t a r t e r P r o j e c t</ t i t l e>
<s c r i p t type=" t e x t / j a v a s c r i p t " l a n g u a g e=" j a v a s c r i p t "
src=" h e l l o W o r l d / h e l l o W o r l d . nocache . j s "></ s c r i p t>
</head>
<body>
8
2.1. PROJEKTSTRUKTUR
11
<iframe src=" j a v a s c r i p t : ’ ’ " id=" __gwt_historyFrame "
12
s t y l e=" width : 0 ; h e i g h t : 0 ; b o r d e r : 0 "></ iframe>
13
<h1>HelloWorld</h1>
14
<p>
15
This i s an example o f a h o s t page f o r t h e HelloWorld
16
a p p l i c a t i o n . You can a t t a c h a Web T o o l k i t module t o
17
[...]
18
</p>
19
<table align=center>
20
<tr>
21
<td id=" s l o t 1 "></td><td id=" s l o t 2 "></td>
22
</ tr>
23
</ table>
24
</body>
25 </html>
Listing 2.1: Inhalt der HelloWorld.html ohne Kommentare
Die wichtigsten Zeilen der HTML-Datei befinden sich in Zeilen 7/8. Hier wird die JavaScriptDatei helloWorld.nocache.js geladen, die dafür sorgt, dass die richtige GWT JavaScript Datei
für den verwendetet Browser geladen wird. Die Zeilen 11/12 beinhalten ein unsichtbares Frame, dass optional für den Browserverlauf genutzt werden kann (s. Kapitel3.5). Die TabellenElemente mit der ID slot1 und slot2 sind in der HTML-Datei nur optional anzugeben um
später hier ein Button und ein Label platzieren zu können. Alternativ kann die Gestaltung der
Oberfläche auch über sogenannte Pannels (siehe Kapitel 3.1) erfolgen, ohne dass die HTMLSeite direkt bearbeitet wird.
2.1.2 Die Java-Datei
Die wichtigste Java-Datei liegt unter dem Package client. Sie ist um das Interface EntryPoint
erweitert worden, was zwangsläufig zur Implementierung der Methode onModuleLoad() führt.
Dies stellt den Einstiegspunkt der Anwendung dar.
1 public c l a s s HelloWorld implements EntryPoint {
2
public void onModuleLoad ( ) {
3
f i n a l Button button = new Button ( " C l i c k me" ) ;
4
f i n a l L ab el l a b e l = new L ab el ( ) ;
5
6
button . a d d C l i c k H a n d l e r (new C l i c k H a n d l e r ( ) {
7
@Override
8
public void o n C l i c k ( C l i c k E v e n t e v e n t ) {
9
i f ( l a b e l . getText ( ) . e q u a l s ( "" ) ) {
10
l a b e l . s e t T e x t ( " H e l l o World ! " ) ;
11
} else {
12
label . setText ( "" ) ;
13
}
14
}
15
});
16
RootPanel . g e t ( " s l o t 1 " ) . add ( button ) ;
17
RootPanel . g e t ( " s l o t 2 " ) . add ( l a b e l ) ;
18
}
19 }
Listing 2.2: gekürzter Java-Code der alten Sampler-Codes
9
2.2. DIE GWT-KONFIGURATION ÜBER MODULE
In Zeile 3 und 4 werden sogenannte GWT-Widgets erstellt. In diesem Beispiel handelt es sich
zum einen um einen Button und zum anderen um ein Label. Im Java-Code werden sie als
normale Objekte behandelt, während sie im Web- oder Host-Modus (siehe Kapitel 2.3) später
als direkte Schaltfläche oder Label dargestellt werden. Diese Objekte werden in Zeile 16/17 in
der HTML-Seite platziert. Dabei repräsentiert das RootPanel das DOM des body-Elementes
der HTML-Datei. Die beiden Tabellen-Elemente slot1 und slot2 wurden zuvor in der HTMLDatei definiert und jetzt benutzt um die Widgets in die HTML-Seite einzufügen.
Ab Zeile 6 wird dem Button ein ClickHandler übergeben, der entsprechende Aktionen im
Falle eines Klicks ausführt.
2.2 Die GWT-Konfiguration über Module
Ein GWT-Projekt wird über eine XML-Datei konfiguriert und verwaltet. Eine Vielzahl von
Ressourcen sind auf unterschiedliche Ordnerstrukturen verteilt und müssen von der GWTShell bzw. dem GWT-Compiler zur Verfügung gestellt werden, damit der Client-Code zu
JavaScript übersetzt werden kann. Später im Web-Modus wird diese Konfigurationsdatei nicht
mehr benötigt.
Ein GWT-Projekt muss über ein oder mehrere Module verfügen. Ein Modul besteht aus
Client-Code, optional auch Server-Code, mindestens einer HTML-Datei, die den Client-Code
einbindet und anderen statischen Ressourcen, wie etwa CSS-Dateien oder Bilder.
1 <?xml version=" 1 . 0 " e n c o d i n g="UTF−8" ?>
2 <module rename−t o= ’ h e l l o w o r l d ’>
3
< !−− I n h e r i t t h e c o r e Web T o o l k i t s t u f f . −−>
4
< i n h e r i t s name= ’ com . g o o g l e . gwt . u s e r . User ’ />
5
6
< !−− I n h e r i t t h e default GWT s t y l e s h e e t . −−>
7
< i n h e r i t s name= ’ com . g o o g l e . gwt . u s e r . theme . c l e a n . Clean ’ />
8
9
< !−− Other module i n h e r i t s −−>
10
11
< !−− S p e c i f y t h e app e n t r y p o i n t c l a s s . −−>
12
<entry −p o i n t c l a s s= ’ de . sample . c l i e n t . HelloWorld ’ />
13
14
< !−− S p e c i f y t h e p a t h s f o r t r a n s l a t a b l e code −−>
15
<s o u r c e path= ’ c l i e n t ’ />
16
<s o u r c e path= ’ s h a r e d ’ />
17 </ module>
Listing 2.3: XML-Konfiurationsdatei des HelloWorld-Beispiels
Jedes Modul muss einen Einstiegspunkt definieren, der beim Starten der Applikation vom
Compiler als erstes geladen werden soll. In der XML-Datei wird, wie in Zeile 12, der gesamte
Klassenpfad angegeben, der die Schnittstelle EntryPoint aus der GWT-API implementieren
muss.
Die Pfade zum Quellcode werden über die XML-Element ”source path” (s. Zeile 15/16) hinzugefügt.
Alle Pfadangaben zu öffentlich zugänglichen Ressourcen, wie etwa Bilder oder CSS-Dateien,
werden über die XML-Element ”public path” hinzugefügt. Es werden sämtliche Ressourcen,
die unter diesem öffentlichen Pfad zu finden sind, in das Ausgabeverzeichnis des Moduls ko-
10
2.3. HOSTED- UND WEB-MODUS
piert. Der Entwickler kann nun über die Modul-URL1 auf die Ressourcen zugreifen ohne den
kompletten Pfad kennen zu müssen[HT07].
Mit dem Element ”inherits” kann ein Modul von anderen Modulen erben. Dabei werden
alle Einstellungen und Daten des angegebenen Moduls kopiert. In Zeile 4 des Listings 2.3
wird das Modul des Projektes um das GWT-Modul User erweitert, welches einen Großteil
der GWT-Funktionalität abdeckt[UF06]. Greift man auf das JUnit-Testen zurück, so muss
hier das Module JUnit hinzugefügt werden.
Die GWT-Klassenbibliothek besteht selbst aus folgenden Modulen: User, HTTP, JSON, JUnit
und XML [Goo11f].
2.3 Hosted- und Web-Modus
Unter GWT existieren zwei Modi, in der die GWT-Anwendung gestartet werden kann. Der
Hosted-Modus wird für das Entwickeln und Testen benutzt, wogegen der Web-Modus das
Endprodukt bereitstellt.
2.3.1 Hosted-Modus
Mit dem Starten der GWT-Shell wird der sogenannte Hosted-Modus, ab Version 2.0 auch
als Development Mode bezeichnet, gestartet. Dabei wird der clientseitige Java-Code nicht in
JavaScript kompiliert, sondern in der Java Virtual Machine als Java-Bytecode interpretiert.
Alle notwendigen Dateien, die zum Starten der Anwendung benötigt werden, ermittelt die
GWT-Shell durch die zuvor konfigurierte XML-Datei der Moudl-Definition.
Das Modul kann über einen beliebigen Browser, in dem das GWTPlugIn installiert wurde, über eine
von GWT generierte URL gestartet
und dargestellt werden. Die Kommunikation zwischen dem GWTModul und dem Browser erfolgt
über TCP. Die GWT-Shell sorgt im
Hosted-Modus für die Synchronisation zwischen den beiden KompoAbbildung 2.2: Kommunikation zwischen GWT-Shell nenten.
und Browser im Hosted-Modus[Goo11c] Alle Fehler und Warnungen werden
von einer GWT-Hosed-Modus-GUI
oder direkt der Entwicklungsumgebung in einem Steuerfenster dargestellt. Des Weiteren ist
ein logging auf unterschiedlichen Ebenen möglich[Goo11h].
Für die Serverseite wird von GWT eine eingebettete Version der Tomcat-Servlet-Engine mitgeliefert, die standardmäßig auf Port 8080 läuft. Konfigurationen bzgl. Tomcat können im
entsprechendem Tomcat-Verzeichnis vorgenommen werden[CC08][HT07].
Zwar sind Anwendung im Hosted-Modus langsamer, aber der größte Vorteil liegt im Debuggen
des client- oder serverseitigen Java-Quellcodes.
1
GWT.getModuleBaseURL()
11
2.4. ENTWICKLUNGSZYKLUS
2.3.2 Web-Modus
Der Web-Modus, auch als Production Mode bekannt, wird durch den GWT-Compiler erreicht.
Alle clientseitigen Java-Dateien werden durch den Java-to-JavaScript-Compiler zu reinem JavaScript übersetzt. Die resultierenden Web-Ressourcen werden im Unterordner ”www” abgelegt,
kann aber anders konfiguriert werden.
Beim Ausführen des Web-Modus wird im Client kein Browser-PlugIns oder die JVM benötigt. Der Webserver hat auch keine expliziten Voraussetzungen, sondern hängt von der eigenen
Implementierung ab. Wird das von GWT angebotene GWT-RPC benutzt, so muss auch die
Server-Implementierung in Java erfolgen.
Die Anwendung wird im Web-Modus so dargestellt, wie sie später im produktiven Einsatz
aussehen wird. Die Anwendung verhält sich deutlich schneller als im Hosted-Modus, da der
Aufwand für die Emulation entfällt.
2.4 Entwicklungszyklus
Hat man sich entschlossen in GWT ein Projekt zu entwickeln, so muss man immer wieder
einen gewissen Entwicklungszyklus durchlaufen.
Abbildung 2.3: Generischer Lebenszyklus der GWT-Anwendungsentwicklung[HT07]
Zuerst sollte immer die klassische-GWT-Projektstruktur angelegt werden. Darüber hinaus
sollten weitere benötigte Dateien, wie weitere HTML-, CSS- oder Java-Dateien, bzw. Fremdbibliotheken dem Projekt hinzugefügt werden.
In Phase 2 folgt die Entwicklungsperiode, die meist mehrere Zyklen umfasst. Sie schließt auch
das Testen der Anwendung im Hosted-Modus mithilfe des eines Browser ein. Da der clientseitige Code im Hosted-Modus in Java-Bytecode vorliegt, ist es möglich sowohl den serverseitigen
12
2.4. ENTWICKLUNGSZYKLUS
also auch den clientseitigen Code zu debuggen und Fehler schneller zu beheben.
Ist die Phase des Entwickelns und Testens abgeschlossen, so wird der Client-Code mit dem
GWT-Compiler in JavaScript konvertiert, um ihn im Webmodus ausführen zu können.
Die finalen Phasen befassen sich mit der Bereitstellung der Anwendung auf einem Webserver. Auch hier sollte das Projekt noch mal auf die Funktionalität, u.a. auch in verschiedenen
Browser, geprüft werden[HT07].
13
3 GWT-Features
3.1 Gestaltung von Benutzeroberflächen
Das Google Web Toolkit stellt nur eine kleine Sammlung an Oberflächenelementen zur Verfügung. Häufig werden in diesem Zusammenhang die Fachwörter Widget und Panel benutzt.
Widgets sind Komponenten mit den der Anwender interagiert. Darunter fallen zum Beispiel
Buttons, TextBoxes, etc.1 Panels unterstützen die Strukturierung des User-Interfaces. Mit
ihnen können die Widgets beliebig platziert werden.
Um eine größere Auswahl an Widgets zu bekommen, besteht die Möglichkeit externe Bibliotheken einzufügen. In diesem Zusammenhang sind besonders die Bibliotheken EXT-GWT 2
und SmartGWT 3 zu erwähnen, da sie zahlreiche Rich-Client-Komponenten mit sich bringen.
3.2 Remote Procedure Calls
Die meisten Web-Anwendungen benötigen eine Möglichkeit, Informationen zwischen dem Client und dem Server auszutauschen. Bei einer GWT-Applikation besteht die Möglichkeit, dass
ein Client Methoden, Funktionen oder Prozeduren aufrufen kann, die dann direkt auf dem
Server ausgeführt werden. Dieses Verfahren heißt Remote Procedure Calls (RPC ).
Da die Kommunikation nur auf der vorhandenen Infrastruktur erfolgen kann, wird hier das
HTTP-Protokoll verwendet. Das hat zur Folge, dass nur reine Zeichenketten übertragen werden können und keine dauerhafte Verbindung zwischen Client und Server vorhanden ist.
Moderne Browser enthalten ein spezielles JavaScript-Objekt namens XMLHttpRequest, welches eine asynchrone Kommunikation zwischen Client und Server ermöglicht. Dieses Objekt
ist die Basis für alle Remote Procedure Calls.
Das Google Web Toolkit bietet einen Ansatz für RPC, der dem Programmierer die Möglichkeit
bietet, Java-Objekte zu übertragen. Natürlich wird weiterhin nur über das HTTP-Protokoll
kommuniziert. Jedoch ist die Schnittstelle für den Anwender so gekapselt, dass dieser sich mit
der Emulation der Java-Klassen nicht auseinander setzen muss[Ste07].
Im Folgendem werde ich zum einem das klassische RPC mittels der Klasse RequestBuilder
vorstellen und zum anderen das gekapselte GWT-RPC.
3.2.1 RPC mittels RequestBuilder
Die Klasse RequestBuilder bietet die Möglichkeit, Anforderungen an den Server zu erstellen,
abzuschicken und auf die vom Server zurückgeschickten Daten Zugriff zu erhalten. Die Daten
können sowohl via GET als auch via POST gesendet werden. Hier liegt die Einschränkung,
dass die Daten in reiner Textform vorliegen müssen. Hier kann man jedoch das Datenformat selbst bestimmten. GWT bietet Klassen zum Parsen von XML-Dokumenten und JSONAusdrücken an.
1
http://code.google.com/intl/de-DE/webtoolkit/doc/latest/DevGuideUiWidgets.html
08.11.2011
2
http://www.sencha.com/products/extgwt - Stand 08.12.2011
3
http://code.google.com/p/smartgwt/ - Stand 08.12.2011
14
-
Stand:
3.2. REMOTE PROCEDURE CALLS
Da der Einsatz vom RequestBuilder unabhängig von der Server-Implementierung ist, betrachten wir nur die Client-Seite.
Der Konstruktor des ReuestBuilder nimmt zwei Parameter entgegen. Zum einen eine der
beiden Methoden, die als statische Konstanten repräsentiert werden: ReuestBuilder.GET oder
RequestBuilder.POST. Zum anderen muss die URL dem Konstruktor übergeben werden.
1 R e u e s t B u i l d e r b u i l d e r = new R e u e s t B u i l d e r ( R e u e s t B u i l d e r . POST,
2
"/ rpc / testingRpc " ) ;
Listing 3.1: Initialisierung des RequestBuilder
Über den RequestBuilder lassen sich auch Eigenschaften der Anforderung festlegen, wie
Header-Informationen, Anmeldeinformationen oder Timeout-Intervall. Um nun eine Anfrage
an den Server zu schicken wird die Methode sendRequest() des RequestBuilder-Objekts
aufgerufen. Hierbei werden alle Daten, die der Anfrage hinzugefügt werden sollen und ein
Handler, der die Serverantwort behandelt, angefügt. Die RequestException tritt im Falle
eines fehlerhaften Sendens auf.
1 Request r e q = null ;
2 try {
3
r e q = b u i l d e r . sendRequest ( "POSTData=myData&a c t i o n=save2Db " ,
4
new R e q u e s t C a l l b a c k ( ) {
5
public void onError ( Request r , Throwable e } ) { }
6
public void onResponeReceived ( Request r ,
7
Response r e s p o n s e } ) { . . . }
8
});
9 } catch ( R e q u e s t E x c e p t i o n e ) { }
Listing 3.2: Erstellen einer RequestBuilder -Anforderung
Erfolgt eine Ergebnisrückgabe durch den Server, so wird die Methode onResponseRecived()
aufgerufen. Den Stautscode der Server-Antwort kann über die Methode getStatusCode()
überprüft werden.
Die Methode des RPC mittels dem RequestBuilder eignet sich besonders, falls man auf alte
Server-Implementationen zurückgreifen möchte, die nicht in Java geschrieben sind.
3.2.2 GWT-RPC
Mittels des GWT-RPC-Mechanismus ist es möglich Java-Objekte ohne größeren Mehraufwand zwischen Client und Server zu verschicken. Die Verbindung wird vom Client eingeleitet
und über ein von GWT bereitgestelltes Proxy-Objekt übergeben. Dieses Objekt serialisiert
die Java-Klassen als Textdatenstrom und schickt sie an den Server weiter. Auf der Server-Seite
wird die Anforderung des Clients durch ein von GWT bereitgestellten Java-Servlet empfangen und wieder deserialisiert. Die hieraus gewonnen Daten werden an einen Dienst auf dem
Server weitergereicht. Wird eine Antwort an das GWT-Servlet übermittelt, so serialisiert das
Servlet diese Antwort und schickt sie wieder zum Client. Dort wird die Antwort wieder vom
GWT-Proxy empfangen, deserialisiert und als Objekt zur Verfügung gestellt[Ste07].
Das Datenformat von GWT-RPC ist weder JSON noch XML. GWT verwendet ein eigenes
Format[UF06].
In Java wird diese Konzept folgendermaßen umgesetzt:
Zuerst wird eine Service-Schnittstelle definiert, über die Client und Server kommunizieren
15
3.2. REMOTE PROCEDURE CALLS
Abbildung 3.1: Übersicht der GWT-RPC Klassen[Goo11g]
können. Das Interface muss um die Klasse RemoteService erweitert werden, was nur zur
Markierung der Schnittstelle als RPC-Interface dient.
1 public i n t e r f a c e MyRemoteService extends RemoteService {
2
public S t r i n g doSomething ( S t r i n g u s e r T e x t ) ;
3 }
Listing 3.3: Erweiterung der Schnittstelle RemoteService
Nun wird sowohl auf dem Client als auch auf dem Server diese Schnittstelle implementiert. Wie
in der Abbildung 3.1 zu sehen ist, muss das Servlet noch um die Klasse RemoteServiceServlet
erweitert werden. Das RemoteServiceServlet ist eine Subklasse eines gewöhnlichen HTTPServlet und kümmert sich später automatisch um das Serialisieren und Deserialisieren der
Parameter und Rückgabewerte. Zu beachten ist, dass sowohl die Methodenparameter als auch
der Rückgabewert serialisierbar sein muss.
1 public c l a s s MyServiceImpl extends R e m o t e S e r v i c e S e r v l e t
2 implements MyRemoteService {
3
public S t r i n g doSomething ( S t r i n g u s e r T e x t ) {
4
// Ausfuehrung d e s Codes a u f dem S e r v e r
5
return s t r ;
6
}
7 }
Listing 3.4: Erweiterung der Schnittstelle RemoteServiceServlet auf dem Server
Um nun eine asynchrone Kommunikation gewährleisten zu können, muss noch eine weitere
Schnittstelle definiert werden. Der Bezeichner dieser Schnittstelle ist im GWT-Konzept explizit an den Namen der Serverschnittstelle gekoppelt. Es wird nur der Token Async angehangen.
Es werden die gleichen Methoden implementiert, die in der Serviceschnittstelle definiert wurden. Jede Methode wird zusätzlich noch um den Parameter vom Typ AsyncCallback ergänzt,
16
3.3. JUNIT
an dem später erkannt werden kann, ob der asynchrone Aufruf erfolgreich war oder nicht. Dies
hat zur Folge das alle Methoden in der asynchronen Schnittstelle keine Rückgabewerte besitzen.
1 i n t e r f a c e MyRemoteServiceAsync {
2
public void doSomething ( S t r i n g userText , AsyncCallback cb ) ;
3 }
Listing 3.5: Asynchrone Schnittstelle
Um Daten zwischen Client und Server austauschen zu können, muss nur noch der Dienst aus
dem Clientbrowser aufgerufen werden. Zuvor muss noch ein Proxy-Objekt initialisiert werden,
das durch die GWT-Methode create automatisch erzeugt wird.
1
2
3
4
5
6
7
8
9
MyRemoteServiceAsync proxy =
( MyRemoteServiceAsync ) GWT. c r e a t e ( MyRemoteService . c l a s s ) ;
proxy . doSomething ( " F i r s t T e x t " , new AsyncCallback ( ) ( ) {
public void o n S u c c e s s ( Object r e s u l t ) {
// e r f o l g r e i c h e S e r v e r a n t w o r t
// do s t h .
}
public void o n F a i l u r e ( Throwable ex ) { }
});
Listing 3.6: Service Aufruf
Der in der Methode mitgelieferte AsyncCallback-Handler behandelt das vom Server zurückkommende Ergebnis.
Abschließend ist diese Variante des Remote Process Calls sicherlich einfacher für den Programmierer, da er sich um den Transport der Java-Objekte selbst nicht kümmern muss. Doch
zu beachten ist, dass diese Methode voraussetzt, dass der serverseitige Dienst auch in Java
geschrieben sein muss.
3.3 JUnit
JUnit ist ein Framework zum Testen von Java-Programmen bzw. deren Bestandteilen (Units).
Mittlerweile gibt es ähnliche Test-Frameworks für viele andere Programmiersprachen unter
dem Namen xUnit. Ziel der Test-Frameworks ist das automatisierte Testen einzelner Klassen
oder Methoden in einem umfangreichen Projekt.
Das Google Web Toolkit bietet eine Möglichkeit die JUnit-Umgebung mit der GWT-Umgebung
zu verbinden. Dies geschieht über die Klasse GWTTestCase, welche von der JUnit-Klasse
TestCase abgeleitet ist.
In der Grundeinstellung laufen Tests im Hosted-Modus als normaler Java-Bytecode in einer
JVM. Um die Test im Web-Modus laufen zu lassen, muss die Systemeigenschaft gwt.args definiert werden um Argumente an GWT weitergeben zu können. Dies ist notwendig, da die
Tests in der JUnit-Shell ausgeführt werden und nicht in der GWT-Shell[Goo11e].
Alle Testklassen müssen von der Klasse GWTTestCase abgeleitet werden, die wiederum voraussetzt, dass die Methode getModuleName implementiert wird. Diese muss den vollständigen
Namen des Moduls zurückliefern, welcher vom GWT für die Initialisierung des Toolkits benötigt.
17
3.4. XML-PARSER
Zum Erstellen eines Testfalles bietet GWT ein Tool mit dem Namen junitCreator4 . Das
Tool generiert ein Anfangstestszenario, in dem bereits Grundgerüste zum Testen vorhanden
sind, die sowohl im Host-Modus als auch im Web-Modus getestet werden können.
1 /∗ ∗
2 ∗ GWT JUnit t e s t s must extend GWTTestCase .
3 ∗/
4 public c l a s s StockWatcherTest extends GWTTestCase {
5
6
/∗ ∗
7
∗ Must r e f e r t o a v a l i d module t h a t s o u r c e s t h i s c l a s s .
8
∗/
9
public S t r i n g getModuleName ( ) {
10
return "com . g o o g l e . gwt . sample . s t o c k w a t c h e r . StockWatcher " ;
11
}
12
13
/∗ ∗
14
∗ Add a s many t e s t s a s you l i k e .
15
∗/
16
public void t e s t S i m p l e ( ) {
17
a s s e r t T r u e ( true ) ;
18
}
19 }
Listing 3.7: GWT-JUnit Testklasse
Darüber hinaus ist es mit der Klasse GWTTestCase möglich, asynchrone Abläufe, wie etwa beim
RPC, zu testen. Um den Test in den asynchronen Modus zu versetzen, bietet GWTTestCase die
Methode delayTestFinish(), welche die Verzögerung des Tests festlegt. Um einen erfolgreichen asynchronen Testfall zu bekommen, muss die Methode finishTest() explizit aufgerufen
werden. Dies soll sicherstellen, dass zum Beispiel ein RPC-Aufruf überhaupt zurückgekommen
ist.
Die JUnit-Erweiterung GWTTestCase bietet Java-Entwicklern das Testen von clientseitigen als
auch von serverseitigen Code. Vorteilhaft ist auch hier wieder, dass Entwickler sich nicht in
neue Test-Frameworks einarbeiten müssen und ihr vorhandenes Wissen nutzen können.
3.4 XML-Parser
Die Extensible Markup Language (XML) ist eine Auszeichnungssprache zur Darstellung hierarchisch strukturierter Daten in Form von Textdaten und wird oft zum Datenaustausch zwischen Client und Server benutzt.
GWT bietet einen auf DOM (Document Object Model) basierten XML-Parser, der die XMLDatei als Objekt-Baum aufbereitet. Dabei nutzt GWT die Tatsache, dass moderne Browser in
der Lage sind, XML zu analysieren und einen DOM-Baum zu erstellen. Auf die unterschiedlichen Browserverhalten muss nicht mehr geachtet werden, da GWT das clientseitge Parsen
über die Klasse XMLParser steuert.
1 Document doc = XMLParser . p a r s e ( r e s p o n s e T e x t ) ;
2 Element r o o t = doch . getDocumentElement ( ) ;
3
4
Genaue Syntax des junitCreator-Tool ist unter http://code.google.com/intl/de-DE/webtoolkit/doc/
latest/tutorial/JUnit.html zu finden.
18
3.5. BROWSER HISTORY
4 NodeList c h i l d r e n = r o o t . g e t C h i l d N o d e s ( ) ;
5 f o r ( int i =0; i < c h i l d r e n . g e t Le n gt h ( ) ; i ++){
6
doSthWithNode ( c h i l d r e n . item ( i ) ) ;
7 }
Listing 3.8: Parsen einer XML-Datei
Mithilfe der DOM-API kann der Baum durchlaufen werden.
3.5 Browser History
Ein klassisches Problem von Ajax-Anwendungen ist die Aufhebung des Mechanismus der
ZURÜCK-Schaltfläche des Browsers. Der Browser dokumentiert in seiner History nur das
Laden einer neuen Seite. Das asynchrone Nachladen von Daten erkennt der Browser nicht
als Aufruf einer neuen Seite an. Der Benutzter hingegen erkennt meistens, dass sich Inhalte
auf der Seite ändern, und erwartet durch das Anklicken der ZURÜCK-Schaltfläche zu den
vorherigen Inhalten zu gelangen.
GWT hat diese Problem mit Hilfe eines versteckten Frames gelöst. Dazu ist folgende Zeile in
der HTML-Datei notwendig:
<iframe src="javascript:’’" id="__gwt_historyFrame" style="width:0;
height:0;border:0"></iframe>
Um diesen Service nutzen zu können, muss ein Event-Handler geschrieben werden, der die
Schnittstelle ValueChangeHandler implementiert, und diese beim Hisotry-Objekt registriert.
1 H i s t o r y . addValueChangeHandler (new ValueChangeHandler<S t r i n g >() {
2
public void onValueChange ( ValueChangeEvent<S t r i n g > e v e n t ) {
3
i f ( e v e n t . g e t V a l u e ( ) . e q u a l s ( " token1 " ) ) {
4
// S t e l l e Zustand wie an Token1 w i e d e r h e r
5
}
6
// . . .
7
});
Listing 3.9: Registrierung der benutzerdefinierten HistoryListener beim Objekt History
Sobald der Listener registiert wurde, kann ein Seitenwechsel emuliert werden. Der Programmierer selbst muss festlegen, wann ein Stand einer neuen Seite erreicht worden ist. Dies
geschieht durch die Erstellung eines neuen Verlaufs-Token. Wird im Quelltext der Befehl
History.newItem(String) ausgeführt, so wird der URL im Browser das gesetzte Token mittels ’#’ angehängt. Dem Benutzer ist es nun möglich, durch die ZURÜCK-Schaltfläche zwischen den gesetzten Token hin und her zu springen.
Ist ein Token gesetzt, so wird im Browser im verborgenen Frame eine neue Seite geladen, was
der Browser als neu geladene Seitenansicht anerkennt und sie dem Verlauf hinzufügt. Des Weiteren wird die Methode onValueChange() der Schnittstelle ValueChangeHandler aufgerufen
um eine Inhaltsveränderung anzuzeigen, die wiederum vom Programmierer erstellt werden
muss.
19
3.6. JAVASCRIPT NATIVE INTERFACE
3.6 JavaScript Native Interface
In manchen Fällen kann es sinnvoll sein, auf bestehenden JavaScript-Code oder externe
JavaScript-Bibliotheken aus Java heraus zugreifen zu können. GWT stellt hierzu das JavaScript Native Interface (JSNI ) zur Verfügung. Darüber können JavaScript-Aufrufe direkt
als native Aufrufe in den Java-Quellcode implementiert werden, Java-Felder können aus JavaScript auslesen werden oder Java-Methoden können in JavaScript einbauen werden.
3.6.1 JSNI-Syntax
In Java werden JavaScript-Methoden als native Methoden deklariert. Der JavaScript-Code
wird hinter der Methodendeklaration als Kommentar /*-{JavaScript}-*/ implementiert,
der mit einem Semikolon abgeschlossen wird. Der Umgang der Methoden erfolgt wie mit gewöhnlichen Java-Methoden.
Um aus JavaScript auf das Browserfenster oder deren Inhalte zugreifen zu können, stellt GWT
die Variable $wnd und $doc zu Verfügung. Diese Variablen entsprechen den Variablen window
und document im JavaScript Umfeld.
3.6.2 Java aus JavaScript aufrufen
Es ist auch wieder möglich, aus der JavaScript-Umgebung Ereignisse der Java-Welt zu übermitteln oder Methoden oder auf Felder zu zugreifen. Für Felder wird folgende Syntax benutzt:
[Instanz.]@Klassenname::Feldname
und diese für Methodenaufrufe:
[Instanz.]@Klassenname::MethodenName(Signatur)(Parameter)
Die Instanz ist optional anzugeben, je nach dem ob es eine Methode einer Instanz oder eine
statische Methode ist. Der Klassenname ist immer als vollqualifizierter Namen einer Klasse
anzugeben, dh. mit der gesamten Paketstruktur.
Die Signatur der Methode setzt sich aus den Typen der Parameter zusammen. Primitive Datentypen werden dabei einem Buchstaben zugeordnet. Klassen beginnen mit einem L, gefolgt
von dem vollqualifizierten Namen.
Tabelle 3.1: Kodierung der Methodensignatur für Java-Aufrufe aus JavaScript-Methoden
Datentyp
Kodierung
boolean
Z
byte
B
char
C
short
S
int
I
long
J
float
f
double
D
vollqualifierzter Klassenname L vollqualifierzter Klassenname;
Das Austauschen von primitiven Datentypen und eines Strings kann ohne Probleme vollzogen werden. Jedoch ist die Übergabe von Objekten nur begrenzt sinnvoll. Alle Objekte aus
20
3.6. JAVASCRIPT NATIVE INTERFACE
JavaScript werden in Java als JavaScriptObjekt gespeichert. Ein Zugriff aus Java ist nicht
möglich. Einzig die Rückgabe an JavaScript, stellt das Originalobjekt wieder her.
21
4 Der Compiler von GWT
4.1 GWT-Compiler
Der GWT-Compiler stellt das Herzstück des Google Web Toolkits dar. Er compiliert den
Java-Quellcode zu JavaScript. Dabei werden zur Zeit folgende Browser unterstützt: Firefox, Internet Explorer, Safari, Google Chrome und Opera[Goo11b]. Für jeden unterstützten
Browser wird eine eigene JavaScript-Datei angelegt. Wird zusätzlich noch eine Internationalisierung für verschiedene Sprachen benutzt, so führt GWT, wie in Abbildung 6.1 dargestellt,
eine Permutation der Browser-Dateien durch.
Das sogenannte Bootstrap-Skript,
das sich in der .nocache.js Datei versteckt, entscheidet beim Seitenaufruf welche spezielle JavaScript-Datei, abhängig vom Ort
und Browser, angefordert werden
soll. Die verschiedenen JavaScriptDateien liegen als <md5>.cache.html
vor.
Der Compiler bezieht die Informationen, die für das Compilieren notwendig sind, aus der XMLModulkonfigurationsdatei. Beginnend in der Eintrittspunktklasse sucht und folgt der Compiler allen Abhängigkeiten, die für
Abbildung 4.1: Erstellung verschiedener JavaScript- das Compilieren der Java-Klassen
Dateien
je
nach
Browser
und notwendig sind. Marker-Interfaces,
Sprache[SRM08]
wie zum Beispiel IsSerializable,
kennzeichnen dem Compiler serialisierbare Klassen. Des Weiten werden auch Annotaions im
Java-Code interpretiert.
GWT nimmt auch eine Codeoptimierung vor. Im Gegensatz zum Java-Standard-Compiler
verwirft der GWT-Compiler alle Klassen, Methoden und Attribute, die nicht von der Applikation benutzt werden. Ein weiterer Aspekt, um die JavaScript-Datei so klein wie möglich
zu halten, ist die Umbenennung der Variablen und Methoden in einzelne Buchstaben. Somit
wird alles in JavaScript komprimiert und kann für den Benutzer so gut wie nicht gelesen
werden. GWT bietet aber drei verschiedene Stilmodi an, die bestimmen, wie der resultierende
JavaScript-Code aussehen soll. Der Standardmodus ist obfuscate, der den Code bestmöglich
komprimiert[HT07].
function b{return this.c + ’@’ + this.d();}
Der zweite Stil heißt pretty und stellt den gleichen Quellcode wie oben dar:
function toString{
return this._typeName + ’@’ + this._hashCode();
}
22
4.2. JRE-EMULATIONSBIBLIOTHEK
Der letzte Stil heißt detailed und enthält gegenüber dem vorherigem Stil noch den vollständigen Klassennamen im Methodennamen. Somit ist es für den Betrachter einfacher auf den
Java-Quellcode zu schließen:
function java_lang_Object_toString{
return this.java_lang_Object_typeName + ’@’ + this.hashCode()__;
}
Außerdem erfordert der GWT-Compiler ab Version 1.5, dass der Quelltext mit der Java 1.5Syntax kompatibel sein muss[Goo11a].
4.2 JRE-Emulationsbibliothek
Abhängig davon, welche GWT-Version verwendet wird, gibt es unterschiedliche Einschränkungen auf die unterstützten Klassen aus der Java-Standartklassenbibliothek. In der GWTVersion 1.4 wird die JSE-Version 1.4 unterstützt und ab der GWT-Version 1.5 die JSE-Version
5.0. Somit ist es ab der GWT-Version 1.5 unter anderem möglich, Generics, Enums, Annotations und erweiterte Schleifen zu nutzen. Aus JSE-Version 5.0 werden die meisten Klassen aus
den folgenden Packages unterstütz: java.lang, java.lang.annotation, java.math, java.io,
java.sql, java.util, java.util.logging[Goo11d].
Alle primitiven Datentypen aus Java, sowie java.lang.Object, java.lang.String und Arrays werden ohne Einschränkungen unterstützt. Das Package java.util enthält alle wichtigen
Datenstrukturen wie Maps, Lists und Arrays.
Es gibt keinen ganzzahligen 64-bit-Typ long in JavaScript. Ab GWT 1.5 wird der long-Wert
durch ein Paar von 32-bit Integer-Zahlen simuliert.
Eigene Exceptions, sowie die Schlüsselwörter try, catch, finally werden unterstützt. Die
Ausgabe des Stack Traces mit der Methode Throwable.getStackTrace() ist im Web-Modus
nicht zugelassen[Ste07].
JavaScript wird im Browser in einer sogenannten Sandbox ausgeführt. Das hat zur Folge, dass
JavaScript im Allgemeinen kein Zugriff auf das Dateisystem hat und somit weder Daten lesen
noch schreiben kann. GWT bietet mit dem Package java.io logging in eine externe Datei an.
Eine genauere Übersicht der Emulationsbibliothek ist unter http://code.google.com/intl/
de-DE/webtoolkit/doc/latest/RefJreEmulation.html (Stand: 03.12.2011) zu finden.
23
5 Vor- und Nachteile von GWT
5.1 Vorteile
Neben den ganzen Features, die das Google Web Toolkit anbietet, möchte ich noch einige
weitere Vorteile von GWT auflisten.
Das Google Web Toolkit bietet die Möglichkeit, clientseitigen Code in Java zu schreiben und
später ihn in JavaScript übersetzten zu lassen. Mit der Benutzung der Programmiersprache
Java gegenüber der Skriptsprache JavaScript entfällt die Fehlerquelle der fehlenden Typensicherheit. Entwickler, die bereits mit Java vertraut sind, können bekannte Entwicklungsumgebungen, Entwurfsmuster und bekannte Tools weiter effektiv einsetzen. Fehler die bei
Skriptsprachen erst zur Laufzeit auftreten, können mit Java-Entwicklungsumgebungen schon
vor dem Compilieren vermieden werden. Die Dokumentation und Wartung des Quellcodes
kann auch über den Java-Code erfolgen.
Ein effektiver Vorteil bei der Entwicklung einer Rich-Internet-Application mit GWT ist das
Debuggen des cleintseitigen und serverseitigen Codes auf Java-Ebene. Mit JUnit kann die
ganzen Anwendung, auch asynchrone RPC, automatisiert getestet werden.
Mit der Hilfe von externen Bibliotheken steht ein großer Umfang an Bedienelementen für
die Entwicklung von Desktop-ähnlichen Anwendungen zur Verfügung. Die Entwicklung des
User-Interfaces entspricht dabei grundlegend der Entwicklung durch AWT oder Swing. Hinzu
kommt, dass GWT die Gui-Logik auf den Client auslagert und somit den Server entlastet.
Der mitgelieferte GWT-Compiler übersetzt den cleintseitigen Java-Code in JavaScript. Dabei
werden für alle unterstützten Browser-Typen eine eigene JavaScript-Datei von GWT erstellt.
Optional werden die JavaScript-Dateien noch weiter optimiert. Zur Laufzeit sind keine Anforderungen an den Browser gerichtet. Der Entwickler muss sich Dank GWT nicht mehr um die
unterschiedlichen Interpretationen von JavaScript in den verschiedenen Browsern kümmern.
Sowohl Server als auch Client können in einer Programmiersprache entwickelt werden. Es
besteht trotzdem noch die Möglichkeit kein Java auf dem Server anzuwenden. Wird jedoch
beides in Java entwickelt, bietet es den Vorteil, dass die Anwendung leichter gewartet werden
kann.
Das Google Web Toolkit steht unter OpenSource und wird somit stetig weiterentwickelt. Gute
Dokumentationen sind ebenfalls vorhanden.
5.2 Nachteile
Trotz alldem gibt es auch Nachteile, die das Google Web Toolkit mit sich bringt.
Das Framework steht nur für Java-Entwickler zur Verfügung. Warum hat sich Google also für
Java entschieden? Nach der Statistik von TIOBE 1 (Stand Dezember 2011) ist Java auf Position eins der beliebtesten Programmiersprachen. Besonders im kommerziellen Bereich wird
Java häufig für die Server-Implementierung benutzt [See08].
1
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Stand: 11.12.2011
24
5.2. NACHTEILE
Die Integration von GWT in bestehende Infrastrukturen, als auch die Integration von eigenen
Komponenten, erweist sich als ziemlich aufwendig[Mic07].
Zwar sind die GWT-Klassen momentan Open-Source, aber Google behält sich vor, die Lizenzbedingung in Zukunft jederzeit zu ändern[Goo11j]. Somit sind spätere Kosten durch eine
Lizenzänderung nicht ausgeschlossen.
Anders als die GWT-Klassen ist der GWT-JavaScript-Compiler nicht Open-Source und darf
nur mit der Genehmigung durch Google weitergegeben werden. Treten Bugs im JavaScriptCompiler auf, so ist man auf die Fehlerbehebung von Google abhängig[UF06].
25
6 GWT im Einsatz am Beispiel eines
Projektes aus der Verkehrstelematik
6.1 Projektbeschreibung
Baustellen auf Autobahnen erfordern einen hohen organisatorischen Aufwand. Damit es zu
keinen unnötigen Verkehrsbehinderungen führt, muss so ein Vorhaben schon im Voraus geplant
werden. So müssen Fahrspurverengungen deutlich gekennzeichnet werden und Geschwindigkeitsangaben angepasst werden um einen möglichst flüssigen Verkehrsfluss zu erreichen. Hinzu
kommen noch viele weitere Anforderungen, auch auf rechtlicher Seite, die beachtet werden
müssen.1
Die Planung des zu regelnden Verkehrsflusses wird mit Hilfe einer schematische Karte realisiert. Die schematische Karte stellt eine geografische Umgebung auf Fahrbahnniveau dar.
Dabei ist die detaillierte Darstellung wichtiger als die genaue geographische Lage der Fahrbahnen.
6.1.1 Anforderungen
Folgende Anforderungen wurden an die Karte gestellt [SPI]. Die schematische Karte, die eine
maximale Fläche von 24km x 24km abdecken sollte, soll die in diesem Abschnitt vorhanden
Straßen auf Fahrbahnniveau darstellen. Wird der Bereich zu komplex, wie etwa bei Autobahnkreuzungen, soll der Benutzer die Möglichkeit haben, durch Zoomen eine genauere Darstellung
der Lage zu bekommen. Dabei ist die detaillierte Darstellung der einzelnen Spuren wichtiger,
als die genaue geografische Lage.
Abbildung 6.1: Schematische Karte mit Namen-Labels
Beschilderungen und Signaleinrichtungen müssen jeweils auf den Spuren dargestellt werden und editierbar sein um Sperrungen einer Spur
einzuleiten oder Geschwindigkeitsangaben der Situation anpassen
zu können. Des Weiteren müssen
Raststätten, Serice-Bereiche, Versorungsstraßen, Ab- und Ausfahrten auf der Karte ersichtlich sein.
Jede Straße muss zudem mit ihrem
Namen und ihrer Kilometrierung versehen werden.
Dabei sollen die einzelnen Informationen zu den Straßen ein- und ausschaltbar sein.
6.1.2 Randbedingungen
Wie schon in der Motivation (siehe 1.1) beschrieben, war es ein Wunsch des Kunden, bereits
vorhandene Infrastrukturen zu nutzen. Es wurde sich auf ein Thin-Client unter der Verwendung eines Browsers geeinigt, der über das HTTP-Protokoll zum Server kommunizieren kann.
Die sogenannte Rich- Internet-Applikation sollte zudem mit HTML/JavaScript Technologien
1
http://www.arbeitsschutz.nrw.de/Themenfelder/baustellen/pflichten_des_bauherren/index.php Stand: 08.12.2011
26
6.2. EINSATZ VON GWT IM PROJEKT
entwickelt werden.
6.2 Einsatz von GWT im Projekt
Bereits ähnliche Projekte existierten nicht, was den Weg zu einer neuen Technologien, hier
das Google Web Toolkit, ermöglicht hat. Entscheidender Vorteil von GWT war die Programmierung in Java für den Quellcode auf der Client- und Server-Seite. Die Entwickler konnten
dadurch wie gewohnt im Java-Umfeld programmieren, debuggen und testen. Darüber hinaus
waren die oben genannten Vorteile von GWT (siehe 5.1) auch ausschlaggebend.
Eine weitere Anforderung des Kunden ist die Wartbarkeit des Quellcodes. Die Qualität des
Quellcodes und somit die Wartbarkeit wird in Java unter einer gewissen Metrik analysiert
und bewertet2 . In JavaScript ist diese Möglichkeit der Codebewertung nicht standardisiert
und anerkannt.
Die Darstellung der Karte wird mittels einer JavaScript-Bibliothek namens OpenLayers3 gezeichnet. Hier kommt die JSNI-Funktion von GWT zum Einsatz.
Von der gekapselten GWT-RPC-Schnittstelle wird auch Gebrauch gemacht. Hiermit werden
Daten zur Darstellung der Karte vom Server übermittelt. Es hat sich im Laufe des Projektes
ergeben, dass es zu Performance Verlust führt, wenn ganze Java-Klassen über die GWT-RPCSchnittstelle verschickt werden. Die Übertragung wird deshalb in Zukunft soweit abgeändert,
dass über die klassische RPC-Schnittstelle Strings in JSON-Format übermittelt werden können.
Damit nicht zu oft eine Verbindung zum Server aufgebaut werden muss, wird versucht den
größten Teil der Arbeit auf den Client auszulagern. Dazu werden zum Beispiel schon geladene
Daten einer Zoom-Stufe gecacht um ggf. später diese nicht mehr anfordern zu müssen.
2
3
http://www.sonarsource.org/ - Stand: 9.12.2011
http://openlayers.org/ - Stand: 09.12.2011
27
7 Fazit
Das Google Web Toolkit löst die Probleme der Ajax-Entwicklung auf elegante Weise. Besonders Java-Entwickler können ihre Produktivität mit GWT steigern, da GWT die Möglichkeit
bietet, mit bekannten Tools und objektorientierten Techniken zu arbeiten. Die Entwicklung
einer Rich-Internet-Application wird damit fast so einfach wie die Gestaltung herkömmlicher
Desktop-Anwendungen mit AWT oder Swing.
Sicherlich lassen sich ähnliche gute Ergebnisse mit anderen Technologien erreichen, doch GWT
bietet besonderes für Java-Entwickler einen hohen Grad an Komfort und Produktivität. Deshalb ist der Einsatz von GWT bei neuen Projekten ohne Codebasis oder bei der Portierung
von bestehenden Java-Anwendungen zu Webanwendung als sinnvoll anzusehen.
Bei großen bestehenden Projekten ist der Einsatz von GWT abzuwägen, da ein hoher Migrationsaufwand hinzukommt.
Das Google Web Toolkit wird sicherlich einen Einfluss auf die Web-Entwicklung nehmen, da es
besonders mehr professionelle Java-Entwickler als JavaScript-Experten gibt. Interessant wird
auch die Entwicklung der Lizenzbedingungen auf kommerzielle Produkte in Zukunft sein.
28
Abbildungsverzeichnis
2.1
2.2
2.3
Darstellung der Datei HelloWorld.html im Browser mit DOM-Elementen . . .
Kommunikation zwischen GWT-Shell und Browser im Hosted-Modus[Goo11c]
Generischer Lebenszyklus der GWT-Anwendungsentwicklung[HT07] . . . . .
8
11
12
3.1
Übersicht der GWT-RPC Klassen . . . . . . . . . . . . . . . . . . . . . . . . .
16
4.1
Erstellung verschiedener JavaScript-Dateien je nach Browser und Sprache[SRM08] 22
6.1
Schematische Karte mit Namen-Labels . . . . . . . . . . . . . . . . . . . . . .
29
26
Literaturverzeichnis
[CC08]
Cooper, Robert ; Collins, Charles: GWT in practice. Greenwich, Conn : Manning, 2008. – ISBN 9781933988290
[Eri]
Eric Knorr: Definition Web 2.0. In: CIO: Fast Forward 2010 – The Fate of IT,
2004 – The Year of Web Services 15. Dezember 2003
[Goo11a] Google Inc.: Google Web Toolkit - Compatibility with the Java Language
and Libraries. http://code.google.com/intl/de-DE/webtoolkit/doc/latest/
DevGuideCodingBasicsCompatibility.html. Version: 2011, Abruf: 03.12.2011
[Goo11b] Google Inc.:
Google Web Toolkit - FAQ, Browsers and Servers.
http://code.google.com/intl/de-DE/webtoolkit/doc/latest/FAQ_
GettingStarted.html#What_browsers_does_GWT_support?
Version: 2011,
Abruf: 03.12.2011
[Goo11c] Google Inc.: Google Web Toolkit - Hosted Modus with OOPHM. http:
//code.google.com/p/google-web-toolkit/wiki/DesignOOPHM. Version: 2011,
Abruf: 03.12.2011
[Goo11d] Google Inc.: Google Web Toolkit - JRE Emulation Reference. http://code.
google.com/intl/de-DE/webtoolkit/doc/latest/RefJreEmulation.html.
Version: 2011, Abruf: 03.12.2011
[Goo11e] Google Inc.: Google Web Toolkit - JUnit Testing. http://code.google.com/
intl/de-DE/webtoolkit/doc/latest/DevGuideTesting.html.
Version: 2011,
Abruf: 03.12.2011
[Goo11f] Google Inc.: Google Web Toolkit - Organize Projects. http://code.google.
com/intl/de-DE/webtoolkit/doc/latest/DevGuideOrganizingProjects.html.
Version: 2011, Abruf: 03.12.2011
[Goo11g] Google Inc.: Google Web Toolkit - Server Communication. http://code.google.
com/intl/de-DE/webtoolkit/doc/latest/DevGuideServerCommunication.
html. Version: 2011, Abruf: 14.12.2011
[Goo11h] Google Inc.:
Google Web Toolkit Modules.
http://code.google.com/
intl/de-DE/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html.
Version: 2011, Abruf: 03.12.2011
[Goo11i] Google Inc.: Google Web Toolkit Overview. http://code.google.com/intl/
de-DE/webtoolkit/overview.html. Version: 2011, Abruf: 03.12.2011
[Goo11j] Google Inc.: Google Web Toolkit Terms and Conditions. http://code.google.
com/intl/de-DE/webtoolkit/terms.html. Version: 2011, Abruf: 09.12.2011
[HT07]
Hanson, Robert ; Tacy, Adam: GWT im Einsatz: AJAX-Anwendungen entwickeln
mit dem Google Web Toolkit. In: GWT im Einsatz (2007)
[Jes]
Jesse James Garret:
Ajax: A New Approach to Web Applications.
http://www.adaptivepath.com/ideas/ajax-new-approach-web-applications,
Abruf: 10.12.2011
30
Literaturverzeichnis
[Mic07]
Michael Schmut, Papick Taboada: Google Web Toolkit Presentation. http:
//pgt.de/wp-content/uploads/2008/01/gwt-short.pdf. Version: 2007, Abruf:
09.12.2011
[See08]
Seemann, Michael: Das Google Web Toolkit: GWT; [sauberes Ajax für JavaBusinessanwendungen]. Dt. Originalausg., 1. Beijing [u.a.] : O’Reilly, 2008. – ISBN
9783897217195
[SPI]
DVS.SPIN.SSS: SPIN – Systeem voor Planning en Informatie Nederland System/Subsystem Specification (SSS) DVS SPIN SSS v1.6.doc, Version 1.6, 08.07.2011
[SRM08] Sowa, Hans ; Radinger, Wolfgang ; Marinschek, Martin: Google Web Toolkit:
Ajax-Anwendungen einfach und schnell entwicklen. 1. Heidelberg : Dpunkt-Verl.,
2008. – ISBN 978–3–89864–471–6
[Ste07]
Steyer, Ralph: Google Web Toolkit: Ajax-Applikationen mit Java. [Frankfurt, M.]
: Entwickler.press, 2007. – ISBN 9783939084211
[UF06]
Uwe Friedrichsen, Dirk H.: OPEN-SOURCE. In: OBJEKTspektrum (2006),
Nr. Ausgabe 06/2006, S. 52–56
31