Ajax

42
Westf¨ alische Wilhelms-Universit¨ at M¨ unster Ausarbeitung Ajax im Rahmen des Seminars Multimedia Jannik Niemer Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Christian Arndt Institut f¨ ur Wirtschaftsinformatik Praktische Informatik in der Wirtschaft

Transcript of Ajax

Westfalische Wilhelms-Universitat Munster

Ausarbeitung

Ajax

im Rahmen des Seminars Multimedia

Jannik Niemer

Themensteller: Prof. Dr. Herbert Kuchen

Betreuer: Christian Arndt

Institut fur Wirtschaftsinformatik

Praktische Informatik in der Wirtschaft

Inhaltsverzeichnis

1 Einleitung 1

2 Ajax-Grundlagen 2

2.1 Ajax-Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2 Eigenschaften von Ajax-Anwendungen . . . . . . . . . . . . . . . . . 5

3 Ajax-Elemente 8

3.1 (X)HTML und CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.2 XML und XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.3 Document Object Model (DOM) . . . . . . . . . . . . . . . . . . . . 13

3.4 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.5 Das XMLHttpRequest Objekt . . . . . . . . . . . . . . . . . . . . . . 16

4 Ajax in der kritischen Betrachtung 19

4.1 Vorteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

4.2 Nachteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5 Ajax-Frameworks 23

5.1 Sajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5.2 Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

5.3 Google Web Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

6 Die Zukunft von Ajax 25

A Quellcode der Beispielanwendung 26

A.1 Calendar.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

A.2 style.css . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

A.3 ajax.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

A.4 neuerTermin.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

A.5 termine.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

B Beispielanwendung mit Sajax 36

Literaturverzeichnis 39

i

Kapitel 1: Einleitung

1 Einleitung

Die Popularitat von web-basierten Applikationen ist nach wie vor ungebrochen und

zur Zeit existiert ein regelrechter Hype um Webanwendungen im Rahmen des”Web

2.0“. Aktuelle Prognosen zeigen, dass der Markt fur Webanwendungen auch weiter-

hin wachsen wird [IB07].

Das Web 2.0 markiert den Beginn eines neuen Internet-Zeitalters, getrieben

durch eine Veranderung der Webanwendungen in den letzten Jahren. Webanwen-

dungen verandern sich von einer statischen hin zu einer dynamischen Benutzero-

berflache und werden Desktopanwendungen immer ahnlicher. Diese Dynamisierung

von Webanwendungen wird vor allem durch”Ajax“, eines der Schlagworte und

Schlusseltechnologien des Web 2.0, ermoglicht.

Das Ziel dieser Arbeit ist es, die Funktionsweise von Ajax darzustellen und zu

beschreiben, wie mit Ajax die Lucke zwischen Webanwendungen und Desktopanwen-

dungen geschlossen wird. Zur Veranschaulichung wurde im Rahmen dieser Arbeit

eine einfache Ajax-unterstutzte Kalender-Anwendung entwickelt, welche es erlaubt,

Termine anzulegen und zu betrachten.

Zunachst werden in Kapitel 2 die Grundlagen von Ajax beschrieben. Dazu wird

zunachst die Bedeutung von”Ajax“ erlautert und anschließend auf die Architektur

hinter Ajax sowie typische Eigenschaften von Ajax-Anwendungen eingegangen.

In Kapitel 3 werden die einzelnen Technologien , aus denen sich Ajax zusammen-

setzt, sowie deren Bedeutung und Zusammenspiel im Rahmen von Ajax erklart.

Anschließend werden in Kapitel 4 in einer kritischen Bewertung von Ajax die Vor-

und Nachteile gegenuber Desktopanwendungen und klassischen Webanwendungen

herausgestellt.

In Kapitel 5 werden Ajax-Frameworks vorgestellt, die die Entwicklung von Ajax-

Anwendungen vereinfachen und Losungen fur einige der Nachteile bieten. Die Kalender-

Anwendung wurde zur Veranschaulichung noch einmal unter Nutzung eines vorge-

stellten Frameworks implementiert.

Zum Abschluss der Arbeit wird in Kapitel 6 ein Ausblick auf die Zukunft von

Ajax gegeben.

1

Kapitel 2: Ajax-Grundlagen

2 Ajax-Grundlagen

Der Begriff Ajax steht fur”Asynchronous Javascript and XML“ und wurde im Jahr

2005 von Jesse James Garett in seinem Essay”Ajax - A New Approach to Web

Applications“ gepragt [Ga05]. Das Ziel von Ajax besteht darin, Webanwendungen

benutzerfreundlicher zu gestalten, indem mit ihnen wie mit Desktopanwendungen

interagiert werden kann.

Unter [Ma06] wird eine Ajax-Anwendung folgendermaßen definiert:”

An Ajax

Application builds on standard web technologies to deliver a rich, responsive user

experience“. Ajax-Anwendungen basieren also wie klassische Webanwendungen ein-

zig und allein auf einem Webbrowser, es wird keine Installation auf dem Rechner

benotigt. Dabei heben sich Ajax-Anwendungen durch eine verbesserte Benutzerin-

teraktion von klassichen Webanwendungen ab. Eine reichhaltige Benutzeroberflache

wird durch Einsatz von Animationen und Oberflachenkomponenten erreicht. Da-

bei ergibt sich eine hohe Reaktionsfreudigkeit der Anwendung durch viele kleine

Anderungen in der Benutzeroberflache. Die Anderungen aktualisieren jeweils nur

einzelne Teile der Benutzeroberflache, ohne den Benutzer in seiner Arbeit zu un-

terbrechen. Diese und weitere Charakteristika von Ajax-Anwendungen werden in

Kapitel 2.2 erklart.

Hinter dem relativ neuen Begriff verbirgt sich keine eigenstandige Technologie,

sondern eine Architektur, die einige bereits bekannte und standardisierte Techno-

logien in einer zuvor nicht bekannten Art miteinander kombiniert. Neben den in

der Abkurzung Ajax enthaltenen Technologien JavaScript und XML kommen da-

bei weitere Technologien zum Einsatz. Die im Zuge von Ajax angewendeten und

kombinierten Technologien sind [Ga05]:

• (X)HTML in Kombination mit CSS fur Layout und Struktur der Webabwen-

dung.

• Document Object Model (DOM) zur dynamischen Manipulation von Daten.

• XML (in Kombination mit XSLT) fur den Datenaustausch mit dem Server.

• XMLHttpRequest-Objekt zum (asynchronen) Nachladen von Daten.

• JavaScript zur Verbindung der anderen Teile.

Diese Technologien werden im Kapitel 3 eingehender behandelt.

Gute Beispiele fur Ajax-Anwendungen sind Google Suggest und Google Maps.

Google Suggest (http://www.google.com/webhp?complete=1) ist eine Erweiterung

2

Kapitel 2: Ajax-Grundlagen

der Google-Suchmaschine und schlagt dem Benutzer schon wahrend der Eingabe des

gewunschten Suchbegriffs passende Begriffe vor (Abbildung 1). Wahrend die Seite an

sich identisch mit der normalen Google-Suchmaschinenseite ist, wird bei der Eingabe

von Text ins Suchfeld schon nach passenden Begriffen gesucht und diese dem Benut-

zer prasentiert. Durch Ajax wird also ein zusatzliches Feature zu einer bereits be-

stehenden Anwendung hinzugefugt. Google Maps (http://maps.google.com) hin-

gegen ist ein gutes Beispiel fur eine Anwendung, die Ajax in großem Stil einsetzt.

Bei der Interaktion mit dem angezeigten Kartenausschnitt (z.B. zoomen) werden

die neuen Kartendaten nachgeladen, wahrend der Benutzer bereits mit der unvoll-

standigen Karte weiterarbeiten kann. In diesem Fall basiert also die Kernfunktiona-

litat der Anwendung auf Ajax.

Abbildung 1: Google Suggest

3

Kapitel 2: Ajax-Grundlagen

2.1 Ajax-Architektur

Alle Webanwendungen basieren auf einer Client-Server-Architektur, in denen der

Webbrowser vom Webserver ubertragene Daten fur den Benutzer darstellt. Fur

die Kommunikation zwischen Webserver und Browser wird das Hypertext Transfer

Protocol (HTTP) verwendet. Dieses Protokoll basiert auf einem Anfrage-Antwort-

Schema, bei dem vom Client benotigte Daten in einer Anfrage (HTTP-Request) vom

Webserver angefordert und in Form einer HTTP-Response als HTML-codierte Web-

seite (formatiert mit CSS) vom Webserver an den Browser zuruckgeliefert. Dabei

wird keine permanente Verbindung zwischen Webserver und Browser aufrechterhal-

ten, das Protokoll ist also zustandslos [St07, S. 56ff.].

Eine klassische Webanwendung besteht aus mehreren HTML-Dokumenten mit

Hyperlinks, die auf andere HTML-Dokumente verweisen. Klickt der Benutzer auf

einen Hyperlink, so wird ein HTTP-Request an den zugehorigen Webserver gesen-

det. Der Webserver verarbeitet diesen Request, fordert notige Daten von Daten-

banksystemen oder anderen Webservern an und sendet eine aus diesen Daten ge-

nerierte HTML-Seite zuruck an den Browser (Abbildung 2), der diese dann dar-

stellt. Wahrend der Weberver den Request bearbeitet und der Browser auf eine

Antwort wartet, wird der Benutzer in seiner Arbeit unterbrochen. Der Datenaus-

tausch zwischen Client und Server erfolgt also synchron und nur als Reaktion auf

Benutzeraktionen [St07, S. 61]. Zudem wird fur jede Benutzerinteraktion eine kom-

plette Webseite neu geladen und dargestellt. Dies erhoht zum einen die ubertragene

Datenmenge unnotig, zum anderen verlangsamt es die Interaktion mit der Weban-

wendung.

In einer Ajax-Anwendung hingegen kann unabhangig von Benutzerinteraktionen

weitere Kommunikation zwischen Server und Client erfolgen. Dazu verwenden Ajax-

Anwendungen eine in JavaScript programmierte Ajax-Engine, welche beim ersten

Aufruf der Anwendung geladen wird [Ga05]. Die Ajax-Engine ist fur das asynchrone

Nachladen von benotigten Daten und den Einbau dieser Daten in die bestehende

Webseite zustandig und erlaubt es dem Benutzer weiterzuarbeiten, wahrend gleich-

zeitig Benutzerinteraktionen bearbeitet und Daten nachgeladen werden. Die Benut-

zerinteraktionen werden hier nicht direkt als HTTP-Requests an einen Webserver

weitergeleitet, sondern zunachst der Ajax-Engine ubergeben (Abbildung 3). Einfa-

che Operationen wie etwa eine Validierung eingegebener Daten (z.B. Formatprufung

einer Email-Adresse) konnen direkt beim Client durch die Ajax-Engine bearbeitet

werden. Werden zusatzliche Daten benotigt, so werden diese durch die Ajax-Engine

in Form eines HTTP-Request angefordert. Dabei wird nicht jedesmal eine komplette

4

Kapitel 2: Ajax-Grundlagen

Abbildung 2: Web-Applikationsmodell klassisch (nach [Ga05])

HTML-Seite ubertragen, sondern nur die wirklich von der Anwendung benotigten

Daten in einem beliebigen textbasierten Datenformat, in der Regel XML oder JSON

(siehe Kapitel 3.2). So wird vermieden, dass mehr Daten als notig zwischen Ser-

ver und Client ubertragen werden. Der Benutzer kann weiterarbeiten, wahrend die

Ajax-Engine auf die Daten vom Webserver wartet und diese nach Empfang mittels

DOM (siehe Kapitel 3.3) in die bestehende Benutzeroberflache einbaut. Es ist al-

so fur Ajax-Anwendungen nicht zwingend notwendig, bei jeder Benutzeraktion die

gesamte Seite neu zu laden.

In der Kalenderanwendung wird beispielsweise beim Anlegen eines neuen Ter-

mins nicht die gesamte Seite neu geladen, sondern lediglich der neue Termin im

Kalender hinzugefugt. Wahrend der neue Termin eingetragen wird, kann der Benut-

zer bereits mit der Anwendung weiterarbeiten und sich beispielsweise einen anderen

Tag anschauen oder weitere Termine anlegen.

2.2 Eigenschaften von Ajax-Anwendungen

Ajax-Anwendungen verbinden Eigenschaften von Desktopanwendungen und Weban-

wendungen. Die wichtigsten Merkmale, die Ajax-Anwendungen ausmachen und von

klassischen Webanwendungen differenzieren, werden im Folgenden erlautert.

5

Kapitel 2: Ajax-Grundlagen

Abbildung 3: Web-Applikationsmodell Ajax (nach [Ga05])

Anwendungen statt Webseiten

Ajax-Anwendungen bieten einen großeren Funktionsumfang als klassische Weban-

wendungen und sind daher als vollwertige Anwendungen zu betrachten, mit denen

auch komplexere alltagliche Aufgaben bearbeitet werden konnen. Beispielsweise gibt

es komplette Ajax-unterstutzte Textverarbeitungen wie AjaxWrite (http://ajaxwrite.de/).

Kontinuierliche Interaktion

Der Benutzer einer Ajax-Anwendung wird nicht wie bei einer klassischen Webanwen-

dung standig in seiner Arbeit unterbrochen, sondern kann weiter arbeiten, wahrend

Daten vom Server nachgeladen werden. Es gibt kein klassisches Laden von neuen

Seiten mehr, sondern nur noch ein Aktualisieren der Benutzeroberflache in Reaktion

auf Benutzeraktionen.

6

Kapitel 2: Ajax-Grundlagen

Aktualitat

Da eine Ajax-Anwendung auch eine Webanwendung ist, sind die verwendeten und

dargestellten Daten immer aktuell. So ist es z.B. fur einen Ajax-Newsreader moglich,

den Server in bestimmten Zeitabstanden nach aktuellen Daten zu uberprufen, diese

im Hintergrund in die Benutzeroberflache einzubauen und dem Benutzer somit im-

mer die aktuellsten Daten zu prasentieren. Bei einer klassischen Webanwendung ist

dies nicht moglich, ohne die komplette Seite neu zu laden.

Neuere Benutzeroberflache

Ajax-Anwendungen verwenden erweiterte oder neue Oberflachenkomponenten (z.B.

Tree-Views oder Kalenderfelder) fur die Gestaltung einer Benutzeroberflache, die

der von Desktopanwendungen ahnelt.

Visuelle Effekte

Ajax-Anwendungen setzen in der Regel Animationen und andere visuelle Effekte

starker als klassischen Webanwendungen ein, um Anderungen in der Benutzerober-

flache an den Benutzer zu kommunizieren. Die Effekte dienen in Ajax-Anwendungen

nicht nur dem Design, sondern unterstutzen den Benutzer bei seiner Arbeit und in-

formieren ihn uber die momentan ablaufenden Prozesse.

Neue Interaktionswege

In Ajax-Anwendungen werden bisher nur aus Desktopanwendungen bekannte In-

teraktionsstile verwendet, wie z.B. Drag-And-Drop oder eine Contentbearbeitung

direkt in der Webseite.

Standardisiert und Plattformunabhangig

Ajax-Anwendungen basieren auf bereits etablierten und standardisierten Techno-

logien (Kapitel 3) und sind somit in jedem neueren Webbrowser (d.h. aus dem

vergangenen Jahr) unabhangig von Hardware oder Betriebssystem lauffahig.

7

Kapitel 3: Ajax-Elemente

3 Ajax-Elemente

In diesem Kapitel werden die einzelnen Technologien, aus denen sich Ajax zusam-

mensetzt, sowie die Zusammenarbeit dieser Technologien in Ajax-Anwendungen er-

klart. Die Technologien kommen dabei nur auf der Clientseite zum Einsatz. Die

Ajax-Engine lauft also komplett im Browser des Benutzers. Zur Erstellung von dy-

namischen Webanwendungen, bei denen z.B. Daten aus Datenbanken geladen wer-

den, bietet sich der Einsatz einer serverseitigen Programmiersprache wie z.B. PHP

an. Dabei ist es fur den Einsatz von Ajax irrelevant, welche serverseitigen Tech-

nologien konkret verwendet werden, solange diese in der Lage sind, Daten mit der

Ajax-Engine auszutauschen (also z.B. XML oder JSON unterstutzen) [St07, S. 61].

3.1 (X)HTML und CSS

HTML

Die Hypertext Markup Language (HTML) ist eine Auszeichnungssprache (engl.: Mar-

kup Language) fur Webseiten, welche neben den eigentlichen Daten (dem Seitenin-

halt) auch die logische Struktur der Seiten beschreibt. Die logische Struktur einer

Seite beinhaltet Elemente wie Uberschriften, Absatze, Bilder und Tabellen. Diese

Elemente werden in HTML durch Steuerelemente, sogenannte Tags, reprasentiert,

welche durch spitze Klammern markiert werden und den Inhalt des jeweiligen Ele-

ments umschließen (z.B. <h1>Dies ist eine Uberschrift</h1>) [St07, S. 94 - 100].

Einzelnen Elementen konnen Klassen und IDs zugeordnet werden, um sie leich-

ter identifizieren zu konnen. Quelltext 7 zeigt ein Element aus der HTML-Datei der

Beispielanwendung, welches den Kalender als Tabelle in einem Containerelement

enthalt. Containerelemente werden durch einen”<div>“-Tag definiert und dienen

der logischen Strukturierung, haben aber keinen Einfluss auf das Aussehen der Seite.

Mit ihrer Hilfe kann auf Teilbereiche einer HTML-Seite gezielt zugegriffen werden.

Sowohl das Containerelement als auch die Tabelle werden mit IDs versehen, um

spater in der Anwendung auf diese Elemente zugreifen zu konnen.

<div id="kalender"><table id="kalendertab">

<tr><th colspan="7">Januar 2008</th></tr>(...)

</table ></div>

Quelltext 1: Kalenderdefinition in der Beispielanwendung

Web-Browser verhalten sich bezuglich HTML sehr tolerant und versuchen auch

fehlerhafte Seiten moglichst korrekt und ohne Fehlermeldungen darzustellen. Dieses

8

Kapitel 3: Ajax-Elemente

Prinzip der Fehlertoleranz vereinfacht die Entwicklung von Webseiten und erhoht die

Kompatibilitat zwischen Browsern [St07, S. 101]. Gleichzeitig erschwert es aber die

Maschinenlesbarkeit von HTML-Dokumenten, da diese nicht zwangslaufig fehlerfrei

sein mussen, um im Webbrowser korrekt dargestellt zu werden.

XHTML

Die Extensible Hypertext Markup Language (XHTML) ist eine auf XML basierende

Neuauflage von HTML [WWWC02]. Wahrend die Elemente der Sprache XHTML

weitgehend denen von HTML entsprechen, ist die Syntax bedeutend strenger. So gilt

hier nicht das generelle Prinzip der Fehlertoleranz und es wird vorausgesetzt, dass

XHTML-Dokumente nach den Syntaxregeln von XML syntaktisch korrekt forma-

tiert sind. Die strengeren Syntaxregeln gewahrleisten eine bessere Maschinenlesbar-

keit von XHTML-Dokumenten im Vergleich zu HTML-Dokumenten. Zudem wird

mit XHTML die Layout-Gestaltung komplett zu CSS ausgelagert, da in HTML ent-

haltene Layout-Elemente hier nicht definiert sind (zumindest in der strikten Variante

der Sprache) [St07, S. 106].

CSS

Wahrend der grundlegende Aufbau und Inhalt von Webseiten in (X)HTML be-

schrieben werden, wird das Layout einer Webseite mit Hilfe von Cascading Style

Sheets (CSS) festgelegt [WWWC99]. Diese werden als separate Dateien gespeichert

und durch spezielle <style>-Tags in (X)HTML-Dokumente eingebunden. So wird

eine Trennung von Struktur und Layout einer Webanwendung erreicht. Durch CSS

konnen die Eigenschaften aller HTML-Elemente wie Farbe, Form und Position fest-

gelegt werden. Diese Eigenschaften konnen nach bestimmten Regeln z.B. auf alle

Elemente einer Art, alle Elemente einer Klasse oder fur einzelne Elemente anhand

ihrer ID’s angewendet werden. Auch einfache Beziehungen konnen abgebildet wer-

den (z.B. alle Hyperlinks innerhalb einer Tabelle der Klasse”tabelle1“) [WWWC99,

Kap. 1.6]. In der Beispielanwendung wird das o.a. Containerelement per CSS mit

einem Rahmen versehen, erhalt eine festgelegte Große und wird auf dem Bildschirm

positioniert (Quelltext 13).

9

Kapitel 3: Ajax-Elemente

/* Formatierung fur Element mit ID "Kalender"*/#kalender {

/* Durchgehenden Rahmen anzeigen */border-style: solid;/* Rahmenbreite mittel */border-width: medium;/* Breite und Hohe des Kalenders auf 700 Pixel setzen */width: 700px;height: 700px;/* Kalender soll auf der rechten Seite schweben */float: right;

}

Quelltext 2: Kalenderformatierung

Ajax-Relevanz

Die Benutzeroberflache einer Ajax-Anwendung besteht wie eine klassische Weban-

wendung aus (X)HTML in Kombination mit CSS. Da sich XHTML-Dokumente we-

gen der strikteren Syntax leichter maschinell auswerten lassen als HTML-Dokumente,

ist XHTML fur Ajax-Anwendungen die bessere Wahl [St07, S. 108ff]. Besondere Be-

deutung haben fur Ajax-Anwendungen die HTML-Elemente”div“ und

”span“, da

sie sich nicht wie etwa Tabellen auf die Struktur der Seite auswirken, sich aber mit

Hilfe von CSS formatieren und durch DOM ansprechen lassen. So lassen sich gezielt

Teilbereiche einer Seite markieren und aktualisieren. Die Trennung von Struktur

und Layout in HTML und CSS ermoglicht in ein dynamisches Einfugen von neuen

Daten in bestehende Seiten. Diese dynamische Veranderung der HTML-Seite zur

Laufzeit der Anwendung wird als Dynamic HTML oder DHTML bezeichnet und

stellt einen der Grundpfeiler der Ajax-Technologie dar [St07, S. 73].

3.2 XML und XSLT

XML

Die Extensible Markup Language (XML) ist eine Sprache, die zum plattformneu-

tralen Austausch von beliebigen menschen- und maschinenlesbaren Daten dient. Da

XML genau wie HTML eine Auszeichnungssprache ist, beschreibt sie neben den

eigentlichen Daten auch die Struktur dieser Daten [St07, S. 264ff.]. Elemente wer-

den wie in HTML durch Tags beschrieben, welche ebenfalls in spitzen Klammern

eingeschlossen werden. Da die XML-Spezifikation im Gegensatz zu HTML keine

vorgeschriebenen Tag-Namen enthalt, konnen XML-Daten frei strukturiert werden

[NS06, S. 23]. Allerdings gelten strikte syntaktische Regeln fur den Aufbau einer

XML-Datei. Diese Regeln mussen eingehalten werden, damit ein XML-Dokument

10

Kapitel 3: Ajax-Elemente

als wohlgeformt gilt. In einem gultigen XML-Dokument muss zusatzlich auf eine

DTD (Document Type Definition) verwiesen werden, in der die Struktur des XML-

Dokumentes definiert wird [WWWC06]. Unter [NS06, Kap. 1] findet sich eine Be-

schreibung von DTD und weiteren XML-Aspekten.

Durch Nutzung eines XML-Parsers konnen Anwendungen maschniell Informa-

tionen aus XML-Dokumenten extrahieren. Ein XML-Dokument wird dazu vom

XML-Parser durchlaufen, eingelesen und auf Gultigkeit uberpruft. Auf ein Prin-

zip der Fehlertoleranz wird dabei verzichtet, um in Kombination mit den strikten

syntaktischen Vorgaben eine gute und einheitliche Maschinenlesbarkeit von XML-

Daten zu garantieren [St07, S. 264ff.].

In Quelltext 12 findet sich ein XML-Dokument, welches vom Server an den Brow-

ser der Kalenderapplikation versendet wird. In diesem Dokument werden alle beste-

henden Termine fur einen Tag ubertragen. Das <termine>-Element ist das Wurzelele-

ment dieser XML-Datei. Die einzelnen Termine finden sich innerhalb dieses Elements

und sind jeweils durch einen Kurztitel und eine Beschreibung definiert.

<?xml version = "1.0" encoding="ISO -8859 -1" ?><termine datum="08.01.2008">

<termin ><titel >Test8 </titel ><beschreibung >Testtermin fur den 8. Januar </beschreibung >

</termin ><termin >

<titel >Test8_2 </titel><beschreibung >Testtermin fur den 8. Januar (2)</beschreibung >

</termin ></termine >

Quelltext 3: Beispiel XML-Dokument

XSLT

XSLT ist eine Sprache, die definiert, wie eine XML-Datei in eine andere beliebige

XML-Datei umgeformt werden kann [We06]. Die Struktur der erzeugten XML-Datei

kann sich dabei sehr von der Originalstruktur unterscheiden. Dazu wird ein XSLT-

Prozessor (wird in jedem modernen Browser unterstutzt) mit einem XSL-Stylesheet

initialisiert, in dem die Regeln der Transformation definiert sind. Anschließend kann

der Prozessor nach den definierten Regeln XML-Dateien transformieren.

Eine XML-Datei kann mittels XLST auch in ein HTML-Format transformiert

werden. Dies ermoglicht die Erstellung von XSL-Templates, mit denen XML-Daten

direkt in eine Webseite eingefugt werden konnen.

11

Kapitel 3: Ajax-Elemente

Ajax-Relevanz

In Ajax-Anwendungen wird XML fur den Datenaustausch zwischen Server und Cli-

ent verwendet. Dabei werden die per Ajax nachgeladenen Daten auf dem Server

per XML formatiert und in der Ajax-Engine wieder dekodiert oder direkt im Brow-

ser angezeigt. Die Nutzung von XML fur den Datenaustausch bietet den Vorteil,

dass sie als plattformunabhangige Sprache von jedem Browser und jedem System

verstanden wird. In allen modernen Browsern sind bereits XML-Parser eingebaut

und konnen XML-Dokumente automatisch in DOM-Objekte (siehe Kap. 3.3) um-

wandeln [Re06, S. 229]. Auch XML-Elemente konnen mit CSS zu formatieren, was

Ajax-Anwendungen die Moglichkeit bietet, nachgeladene XML-Daten direkt pas-

send formatiert im Browser anzuzeigen, und somit den Datenaustausch vereinfacht.

Ein Nachteil von XML stellt der relativ große Overhead durch Tags, DTD und

XML-Definition dar.

Da in Ajax Anwendungen oft XML-Daten in ein HTML-Format konvertiert wer-

den mussen, bietet sich eine Nutzung von XSLT an. XSLT kann in Verbindung mit

Ajax benutzt werden, um nachgeladene XML-Daten automatisch zu transformieren

und dabei eventuell neu zu strukturieren.

Obwohl XML in der Bezeichnung”Ajax“ vorkommt und die Nutzung von XML

fur den Datenaustausch von Ajax-Anwendungen sinnvoll ist, so ist sie jedoch kei-

neswegs zwingend. Im Prinzip konnen Ajax-Anwendungen Daten in jeder beliebigen

durch Text reprasentierten Form austauschen. Es ist beispielsweise auch denkbar,

reinen Text oder HTML-formatierte Daten per Ajax nachzuladen. Neben XML wird

oft die Javascript Object Notation (JSON) fur den Datenaustausch verwendet.

JSON bezeichnet eine Methode, JAVA-Script-Objekte in Text umzuwandeln (Se-

rialisierung), damit diese einfach versendet werden konnen [Re06, S. 232]. Die Text-

Reprasentation kann dann beim Empfanger wieder in ein Objekt zuruckverwandelt

werden (Deserialisierung). Mittlerweile ist JSON nicht mehr nur auf JavaScript be-

schrankt, sondern wird auch von anderen Sprachen und Plattformen unterstutzt

[We06, S. 63].

Der Vorteil der Nutzung von JSON besteht darin, dass JSON-Daten nicht manu-

ell durchlaufen werden mussen, wie es bei XML der Fall ist, um an einzelne Elemente

zu gelangen. Stattdessen kann direkt auf die Eigenschaften des zuruckgelieferten Ob-

jektes zugegriffen werden. Dies vereinfacht die Nutzung von JSON im Verleich zu

XML. Allerdings beinhaltet JSON ein gewisses Sicherheitsrisiko, da der per Text

ubertragene Code wahrend der Deserialisierung im Webbrowser ausgefuhrt wird

[We06, S. 68].

12

Kapitel 3: Ajax-Elemente

3.3 Document Object Model (DOM)

Das Document Object Model (DOM) ist ein Standard, der 1998 vom W3 Kon-

sortium beschlossen wurde [WWWC98]. Es beschreibt ein plattformunabhangiges

Programmier-Interface, mit dem baumartig aufgebaute Dokumente (z.B. HTML-

und XML-Dokumente) nicht nur als statischer Text, sondern als dynamische Struk-

tur reprasentiert werden. Mit Hilfe eines DOM-Parsers wird dazu aus einem Do-

kument ein Baum aufgebaut, der alle in diesem Dokument enthaltenen Elemente

mit ihren Eigenschaften enthalt. Uber das DOM-Interface kann dann auf einzel-

ne Elemente im Baum zugegriffen werden. Diese Elemente lassen sich nachtraglich

verandern oder loschen und es lassen sich neue Elemente in den Baum einfugen

[WWWC98]. So konstruiert ein Webbrowser beispielsweise beim Besuch einer We-

beite aus dem HTML-Code (Quelltext 16) einen Baum aus HTML-Elementen (Ab-

bildung 4), welcher sich nachtraglich durch den Einsatz von Javascript und DOM

verandern lasst [St07, S. 189].

<html><head>

<title >Seminar Multimedia - Ajax Beispiel </title></head><body>

<div id="kalender"><table id="kalendertab">

<tr><th colspan="7">Januar 2008</th></tr><tr><th>Mo</th><th>Di</th><th>Mi</th><th>Do</th><th>Fr</th>

<th>Sa</th><th>So</th></tr></table >

</div><div id="termincontainer"></div>

</body></html>

Quelltext 4: HTML-Struktur der Kalenderanwendung

Die Webseite wird dabei in JavaScript durch das Wurzelobjekt document re-

prasentiert. Um auf ein Element der Seite zuzugreifen, kann ausgehend von diesem

Objekt uber die untergeordneten Elemente bis hin zum gewunschten Element durch

den DOM-Baum navigiert werden. Alle Elemente eines Typs (z.B. Bilder oder For-

mulare) sind zudem in Arrays organisiert, um das Auffinden dieser Elemente zu

vereinfachen. Der Zugriff auf das erste Bild in einer Webseite ist beispielsweise fol-

gendermaßen moglich:

document.images [0]

Neben der Navigation durch den DOM-Baum lassen sich auch Elemente nach Tags,

Namen oder ID auswahlen. Dazu stellt das DOM die Methoden getElementsByTagName(),

getElementsByName() und getElementByID bereit. Durch den Aufruf

13

Kapitel 3: Ajax-Elemente

Abbildung 4: DOM-Baum

document.getElementsByTagName("a")

lassen sich beispielsweise alle Hyperlinks einer Webseite auswahlen. Uber den Aufruf

document.getElementByID("Kalender")

lasst sich hingegen das Element mit der eindeutigen ID”Kalender“ auswahlen, sofern

dieses existiert.

Nach Auswahlen eines Objektes lassen sich dessen Eigenschaften andern (z.B.

der Inhalt uber innerHTML) oder Methoden auf dem Objekt ausfuhren. Zum Bei-

spiel ist es moglich, mit appendChild() neue Elemente an ein bestehendes Element

anzuhangen. Eine ausfuhrliche Liste der Eigenschaften und Methoden von DOM-

Knotenelementen findet sich unter [St07, S. 198ff.].

14

Kapitel 3: Ajax-Elemente

Ajax-Relevanz

Das DOM dient in Ajax-Anwendungen der dynamischen Manipulation von HTML-

und XML-Daten. Ajax-Anwendungen konnen durch das DOM auf einzelne Elemente

einer bereits bestehenden und im Webbrowser geladenen HTML-Seite zugreifen und

neue Elemente in diese Seite einfugen. Das DOM ermoglicht also erst den Einsatz

von DHTML und bildet somit die Basis der dynamischen Benutzeroberflache von

Ajax-Anwendungen.

Des weiteren wird das DOM in Ajax-Anwendungen dazu verwendet, einen ein-

fachen Zugriff auf nachgeladene Daten im XML-Format bereitzustellen, damit diese

Daten durchsucht werden konnen und einzelne Elemente bzw. Datensatze aus kom-

plexen XML-Daten extrahiert werden konnen.

3.4 JavaScript

JavaScript ist eine plattformunabhangige, objektorientierte Skriptsprache mit Java-

ahnlicher Syntax. Die Sprache wird vor allem clientseitig verwendet und ist in allen

modernen Browsern implementiert. JavaScript-Code wird uber spezielle <script>-

Tags oder als externe Datei in HTML-Dokumente eingebunden und beim Laden des

Dokumentes direkt im Browser interpretiert [GGA06, S. 60].

JavaScript bietet nur relativ geringe Moglichkeiten im Vegleich mit anderen

Skriptsprachen wie z.B. VB-Script. So ist es etwa mit JavaScript nicht moglich,

auf die Festplatte des Host-Rechners zuzugreifen oder Bibliotheken des Betriebssys-

tems aufzurufen. Unter Sicherheitsaspekten sind die eingeschrankten Moglichkeiten

jedoch ein großer Vorteil fur JavaScript [St07, S. 166]. Dennoch wird bei Verwendung

von JavaScript in Webseiten immer (potentiell schadlicher) Code direkt im Browser

ausgefuhrt, weshalb JavaScript von einigen sicherheitsbewussten Internetnutzern im

Browser deaktiviert wird.

Ajax-Relevanz

Da die Ajax-Engine in JavaScript implementiert wird und somit alle anderen Tech-

nologien durch JavaScript verbunden werden, ist dies die zentrale Technologie, um

Ajax-Anwendungen moglich zu machen, was auch an der Integration des Begriffs im

Acronym”Ajax“ erkennbar ist. JavaScript erlaubt zum Einen den Zugriff auf das

XMLHttpRequest Objekt (siehe Kapitel 3.5), um mit diesem asynchron Daten vom

Server nachzuladen. Zum Anderen kann durch JavaScript auf das DOM zugegriffen

und einzelne DOM-Elemente zur Laufzeit der Anwendung ermittelt und verandert

15

Kapitel 3: Ajax-Elemente

werden. Dies erlaubt die dynamische Veranderung von Inhalt, Struktur und Layout

der Webseite zur Laufzeit.

3.5 Das XMLHttpRequest Objekt

Beim XMLHttpRequest-Objekt handelt es sich um ein JavaScript-Objekt, welches in

allen modernen Browsern direkt implementiert ist. Das XMLHttpRequest-Objekt

ermoglicht das synchrone und asynchrone Senden von HTTP-Requests und eine

Reaktion auf den Empfang einer Antwort mittels einer Callback-Funktion. Somit

stellt XMLHttpRequest die grundlegende Ajax-Funktionalitat zur Verfugung und

ist das wichtigste Objekt fur AJAX Anwendungen [Ma06, Kap. 6.2]. Weiterhin un-

terstutzt das Objekt die Ubertragung von XML-Daten durch automatisches Parsen

und Bereitstellung dieser Daten als DOM-Objekt.

Der Ablauf einer asynchronen Datenabfrage per XMLHttpRequest soll hier an-

hand eines Code-Auszugs aus der Beispielanwendung erklart werden (Quelltext 10):

1. Zunachst wird ein XMLHttpRequest-Objekt durch den JavaScript-Code resObjekt

= new XMLHttpRequest() erstellt. Dies ist ein vereinfachter Aufruf, der in der

Anwendung um eine Browserunterscheidung erweitert wurde, da der Internet

Explorer bis zur Version 6 das XMLHttpRequest-Objekt nicht direkt, sondern

als ActiveX-Objekt implementiert.

2. Damit bei einer asynchronen Anfrage auf eine Serverantwort reagiert werden

kann, wird ein eine Funktion als Event-Handler fur die Eigenschaft onreadystatechange

registriert. Diese Funktion wird jedes Mal aufgerufen, wenn sich der Status

des XMLHttpRequest-Objektes andert. Das XMLHttpRequest Objekt kennt

5 Zustande:

Zustandscode Beschreibung

0 nicht initialisiert

1 Ladt gerade (Request wird an Server abgesetzt)

2 Fertig geladen (Request gesendet)

3 Wartet auf Ruckgabe (Antwort wird vom Server empfangen)

4 Vollstandig (Antwort vollstandig empfangen)

Tabelle 1: Zustandscodes XMLHttpRequest

Interessant ist dabei in der Regel lediglich der Zustand 4, welcher anzeigt,

dass das Ergebnis des HTTP-Requests vollstandig vorliegt. Der Status lasst

16

Kapitel 3: Ajax-Elemente

sich uber die Eigenschaft resObjekt.readyState!auslesen.

3. Ein HTTP-Request wird mit der Methode resObjekt.open() vorbereitet, aber

noch nicht abgeschickt. Im ersten Parameter wird die HTTP-Methode angege-

ben, mit der der Request ubertragen werden soll, also z.B. GET oder POST. Der

zweite Parameter gibt den URL an, an den der Request gesendet wird. Als

dritter Parameter wird spezifiziert, ob der Request synchron oder asynchron

behandelt werden soll. Im Falle einer synchronen Behandlung wird das Skript

an dieser Stelle so lange blockiert, bis eine Antwort vom Server eingetroffen

ist.

4. Die Abfrage wird schließlich mit der Methode resObjekt.send() versendet.

In der Beispielanwendung wird die POST-Methode zum Versenden der Re-

quests benutzt, weshalb die Abfrageparameter an dieser Stelle ubergeben wer-

den. Das XMLHttpRequest-Objekt wartet nun auf die Antwort des Servers.

Wahrend der Wartephase konnen andere Java-Script-Funktionen ausgefuhrt

werden, was dem Benutzer eine ununterbrochene Interaktion mit der Anwen-

dung ermoglicht.

5. Wenn die Antwort des Servers vollstandig geladen wurde, wird die Callback-

Funktion mit readyState 4 aufgerufen. Die ubermittelten Daten konnen nun

durch die Eigenschaft resObjekt.responseText abgerufen werden. Sind die Da-

ten XML-formatiert, so werden diese automatisch geparst und stehen zusatzlich

durch die Eigenschaft resObjekt.responseXML als DOM-Objekt zur Verfugung,

was direkten Zugriff auf einzelne XML-Elemente moglich macht.

resObjekt = new XMLHttpRequest ();resObjekt.onreadystatechange = function () {

if (resObjekt.readyState == 4) {// ...

}}resObjekt.open(’post’, ’getTermine.php’, true);// ...resObjekt.send(’year=’ + year + ’&month=’ + month + ’&day=’ + day

);

Quelltext 5: XMLHttpRequest in der Beispielanwendung (vereinfacht)

17

Kapitel 3: Ajax-Elemente

Ajax-Relevanz

Der asynchrone Austausch von Daten zwischen Client und Server ist ein elementarer

Bestandteil von Ajax-Anwendungen und wird uber das XMLHttpRequest-Objekt

ermoglicht. Ohne dieses Objekt wurde eine Ajax-Anwendung nicht funktionieren,

da keine Daten asynchron nachgeladen werden konnten und somit auch keine Ajax-

Funktionalitat gegeben ware.

18

Kapitel 4: Ajax in der kritischen Betrachtung

4 Ajax in der kritischen Betrachtung

Die Nutzung von Ajax-Anwendungen bietet viele Vorteile gegenuber klassischen

Webanwendungen und Desktopanwendungen. Die wichtigsten werden im Kapitel 4.1

vorgestellt. Allerdings sind mit den Vorteilen auch einige Nachteile verbunden, die

in Kapitel 4.2 betrachtet werden. Fur einige dieser Nachteile bestehen jedoch bereits

Losungsansatze, die zum Teil in Ajax-Frameworks (siehe Kapitel 5) umgesetzt sind.

4.1 Vorteile

Kombination aus Desktop- und Webanwendungen

Ajax-Anwendungen kombinieren die Vorteile von Desktopanwendungen mit denen

von klassischen Webanwendungen. Wahrend Ajax die Benutzerfreundlichkeit, Inter-

aktivitat und Reaktionsfreudigkeit von Desktopanwendungen bietet, wird dies mit

der Plattformneutralitat und einfacher Anbindung an Datenbanken und Webservices

kombiniert, die sonst nur klassische Webanwendungen bieten. Auch wird fur Ajax-

Anwendungen keine Installation benotigt, da die Anwendungen einfach im Web-

browser laufen.

Plattformunabhangigkeit

Ajax-Anwendungen sind - zumindest bei korrekter Implementierung - unabhangig

vom eingesetzten Browser und Betriebssystem nutzbar. Eine mobile Nutzung von

Ajax-Anwendungen ist ebenfalls einfacher moglich als dies bei Desktopanwendungen

der Fall ist. Es sind keine zusatzlichen Plugins notig, um Ajax-Anwendungen aus-

zufuhren, da samtliche eingesetzten Technologien direkt vom Browser unterstutzt

werden.

Geringere Auslastung

Da bei Ajax-Anwendungen immer nur die jeweils benotigten Daten nachgeladen

werden, statt bei jeder Anfrage an den Server die ganze Seite neu zu ubertragen,

verringert sich die Auslastung der Kommunikationswege und des Servers. Analysen

zeigen, dass durch Einsatz von Ajax die ubertragene Datenmenge einer Webseite

um bis zu 60% reduziert werden kann [Me06].

19

Kapitel 4: Ajax in der kritischen Betrachtung

Einfachere Wartbarkeit

Fur Ajax-Anwendungen ist keine lokale Installation auf dem Clientrechner erfor-

derlich, sondern es existiert nur eine Installation der Anwendung auf dem Server.

Dies ermoglicht ein einfacheres Einspielen von Updates und stellt sicher, dass alle

Benutzer der Anwendung immer auf dem gleichen, aktuellen Stand sind.

Hohere Reaktionsfreudigkeit

In Ajax-Anwendungen kann deutlich schneller auf Benutzeraktionen reagiert wer-

den als in klassischen Webanwendungen, da Benutzeraktionen teilweise vollstandig

in der Ajax-Engine behandelt werden und bei Bedarf nur die notigen Daten vom

Server nachgeladen werden. Auch ist es in Ajax-Anwendungen nicht notig, bei jeder

Benutzeraktion die komplette Webseite neu zu laden.

Hohere Interaktivitat

Nutzer von Ajax-Anwendungen konnen weiterarbeiten, wahrend Daten vom Server

nachgeladen werden. Dies ist benutzerfreundlicher als der Zyklus von Arbeits- und

Wartezeit bei klassischen Webanwendungen.

Universelle Anwendbarkeit

Ajax schreibt nur Technologien fur die Clientseite der Anwendung vor und kann auf

der Serverseite mit beliebigen Programmiersprachen kombiniert werden. Da Daten

zwischen Server und Client in einem universellen Format (i.d.R. XML oder JSON)

ubertragen werden, kann die serverseitige Programmiersprache einfach gewechselt

werden.

4.2 Nachteile

Fehlende Unterstutzung fur Zuruck-Button und History

In einer Ajax-Anwendung werden neue Seiteninhalte nachgeladen, ohne dass sich

dabei die URL der Seite in der Adressleiste andert. Die einzelnen Zustande einer

Ajax-Anwendung sind also fur den Browser nicht transparent und werden nicht in

der Browser-History gespeichert. Dadurch wird auch die Funktionalitat des Zuruck-

Buttons im Browser ausgehebelt, der das vorherige Element aus der History aufruft.

Druckt der Benutzer wahrend der Nutzung einer Ajax-Anwendung den Zuruck-

Button, so wird in der Regel die vor Start der Ajax-Anwendung aktive Seite auf-

gerufen. Dies ist fur Internetnutzer, die an die Navigation mittels Zuruck-Button

20

Kapitel 4: Ajax in der kritischen Betrachtung

und History gewohnt sind, sehr ungewohnt und erschwert die Nutzung von Ajax-

Anwendungen. Fur dieses Problem gibt es allerdings bereits Losungsansatze, unter

anderem bieten manche Frameworks eine Unterstutzung an (siehe Kapitel 5).

Fehlende Unterstutzung fur Deep-Links

Lesezeichen (Bookmarks) konnen in einer Ajax-Anwendung nicht verwendet wer-

den, um den Status der Anwendung zu speichern. Dies wird wie die fehlende Un-

terstutzung der History dadurch verursacht, dass die einzelnen Zustande einer Ajax-

Anwendung fur den Browser nicht transparent sind und nicht durch eindeutige URLs

identifizierbar sind (Deep Links). Daraus resultiert weiterhin, dass Suchmaschinen

nicht auf die Daten von Ajax-Anwendungen zugreifen konnen und sie daher nicht

korrekt indizieren konnen. Auch die Unterstutzung fur Deep Links lasst sich mit

einem gewissen Programmieraufwand oder durch den Einsatz mancher Frameworks

aktivieren.

Fehlende Unterstutzung fur Refresh-Button

Im Zusammenhang mit der Fehlenden Unterstutzung fur Deep-Links und die History

ergibt sich ein weiteres Problem bei der Nutzung von Ajax-Anwendungen. Da die

Zustande nicht durch eindeutige URLs gekennzeichnet sind, fuhrt ein Klick auf den

Refresh-Button des Browsers dazu, dass der die urspruungliche URL neu geladen

und somit der Ursprungszustand der Ajax-Anwendung wieder hergestellt wird. Dies

entspricht nicht der von Internetnutzern erwarteten Funktionalitat (eigentlich sollte

der aktuelle Zustand neu geladen werden) und ist somit fur Nutzer ungewohnt.

Dieses Problem lasst sich in Kombination mit den oben genannten Problemen durch

Programmieraufwand oder den Einsatz von Frameworks losen.

Erreichbarkeit

Um die korrekte Ausfuhrung von Ajax-Anwendungen zu garantieren, muss im Brow-

ser JavaScript aktiviert sein. Im Internet Explorer muss bis zur Version 7 zusatzlich

ActiveX aktiviert sein, da hier das XMLHttpRequest Objekt nicht nativ, sondern als

ActiveX-Objekt implementiert ist. JavaScript und besonders ActiveX gelten jedoch

als sicherheitskritisch und werden von vielen Internetnutzern deaktiviert.

Internet-Abhangigkeit

Auch wenn Ajax-Anwendungen die Funktionalitat von Dekstop-Anwendungen bie-

ten konnen, so sind sie doch Webanwendungen. Fur die Ausfuhrung einer Ajax-

21

Kapitel 4: Ajax in der kritischen Betrachtung

Anwendung ist es also zwingend notwendig, dass der Nutzer wahrend der gesamten

Zeit mit dem Internet verbunden ist. Dies stellt insbesondere bei der mobilen Nut-

zung von Ajax-Anwendungen ein Problem dar.

Browserunterschiede

Der Zugriff auf das XMLHttpRequest-Objekt sowie auf DOM unterscheidet sich

fur verschiedene Browser, da die Schnittstellen unterschiedlich implementiert sind.

Um maximale Kompatibilitat zu gewahrleisten, mussen Entwickler daher Code-

Verzweigungen fur die verschiedenen Browser einbauen. Dieses Problem kann durch

Frameworks umgangen werden, in denen diese Unterscheidung bereits enthalten ist.

Unterschiedliche Programmiersprachen

Bei der Entwicklung einer Ajax-Anwendung mussen auf Client- und Serverseite zwei

verschiedene Programmiersprachen verwendet werden. Wahrend im Client JavaS-

cript eingesetzt wird, kommt im Server PHP, Java o.a. zum Einsatz, mit evtl. sehr

unterschiedlicher Syntax. Dies stellt einen Mehraufwand fur den Entwickler dar.

Frameworks wie das Google Web Toolkit (Kapitel 5.3) bieten eine Losung fur dieses

Problem, indem sie den notigen JavaScript-Code automatisch erzeugen.

Performanceprobleme

Da eine Ajax-Anwendung unter Umstanden sehr viel haufiger mit dem Server kom-

muniziert als klassische Webanwendungen, kann sich die Serverlast im Vergleich

zu klassischen Anwendungen auch vergroßern, statt geringer zu werden. Gerade

weil HTTP ein zustandsloses Protokoll ist und es nicht moglich ist, eine dauerhaf-

te Verbindung zwischen Ajax-Engine und Server aufrechtzuerhalten und die Ajax-

Engine bei Anderungen auf dem Server per Event zu informieren, mussen Ajax-

Anwendungen evtl. den Server regelmaßig auf eine Anderung der Daten uberprufen.

Dies kann die Verbindung sowie den Server belasten.

22

Kapitel 5: Ajax-Frameworks

5 Ajax-Frameworks

Fur die Entwicklung von Ajax-Anwendungen werden viele Kenntnisse uber einge-

setzte Browservarianten und deren Eigenheiten vorausgesetzt. Auch bestehen Ajax-

Anwendungen aus vielen verschiedenen Komponenten (HTML und CSS, DOM,

JavaScript, serverseitige Programmiersprache wie PHP, Java etc.), was die Ent-

wicklung erschwert und eine Fehlersuche wahrend der Entwicklung sehr kompliziert

macht. Gerade bei komplexeren Ajax-Anwendungen werden bestimmte Funktionen

immer wieder verwendet, wie z.B. das asynchrone Nachladen von Daten sowie die

Integration dieser Daten in die Benutzeroberflache mittels DOM.

Ajax-Frameworks bieten hier Funktionsbibliotheken, die bereits getestete Funk-

tionen fur viele Einsatzmoglichkeiten zur Verfugung stellen und einem Entwick-

ler den Aufwand fur Entwicklung und Test dieser Funktionen sparen. Alle Frame-

works abstrahieren dabei von Browserunterschieden und erleichtern dem Entwickler

die Client-Server-Kommunikation, indem dieser das XMLHttpRequest-Objekt nicht

mehr selbst erstellen und ansprechen muss. Einige Frameworks erleichtern zudem

den Zugriff auf DOM, stellen visuelle Effekte und Komponenten zur Gestaltung

einer Benutzeroberflache bereit und bieten eine einfache Behandlung von Events.

Zur Zeit existieren mehr als 200 Ajax-Frameworks mit verschiedenen Ansatzen.

Zum Einen gibt es clientseitige Frameworks, die aus JavaScript-Funktionsbibliotheken

bestehen. Auf der anderen Seite gibt es serverseitige Frameworks, welche direkt in

der auf Serverweite verwendeten Sprache implementiert sind und die Nutzung von

JavaScript vereinfachen bzw. komplett eliminieren, indem der notige JavaScript Co-

de automatisch erstellt wird. In diesem Kapitel sollen exemplarisch drei Frameworks

vorgestellt werden, die unterschiedliche Ansatze verkorpern.

5.1 Sajax

Bei Sajax handelt es sich um ein serverseitiges Framework, das unter anderem fur die

Sprachen ASP, PHP, Perl und Ruby angeboten wird. Fur jede unterstutzte Sprache

gibt es eine eigene Bibliothek, welche serverseitig in den Quellcode eingebunden wird.

Serverseitig implementierte Funktionen konnen exportiert werden. Sajax generiert

automatisch den clientseitigen JavaScript-Code fur diese Funktionen und bindet ihn

in die HTML-Seite ein. Werden diese Wrapper-Funktionen im Client aufgerufen,

so werden automatisch per XMLHttpRequest die erforderlichen Daten abgerufen

und eine angegebene Callback-Funktion aufgerufen. Dadurch wird der Entwickler

zwar nicht komplett von JavaScript befreit, muss sich aber nicht explizit um die

Datenubertragung per XMLHttpRequest kummern. Daten lassen sich bei Sajax un-

23

Kapitel 5: Ajax-Frameworks

ter anderem als String oder Integer, aber auch als Array oder Objekt ubertragen.

Dabei ubernimmt Sajax die Serialisierung der Objekte im Server und die Deseria-

lisierung im Client. Komponenten fur die Benutzeroberflache, visuelle Effekte oder

ein vereinfachter Zugriff auf DOM werden von Sajax nicht unterstutzt.

Zur Veranschaulichung der Unterschiede zwischen manueller Implementierung

und Nutzung eines serverseitigen Frameworks wurde die Kalender-Anwendung unter

Verwendung von Sajax neu implementiert. Eine Beschreibung findet sich im Anhang

B.

5.2 Prototype

Eines der zur Zeit am haufigsten eingesetzten Ajax-Frameworks ist Prototype. Pro-

totype wurde eigentlich als Client-seitiger Teil von Ruby-On-Rails entwickelt, kann

aber auch ohne dieses eingesetzt werden [GGA06, S. 210]. Das Framework basiert

auf JavaScript und vereinfacht den asynchronen Datentransfer via XMLHttpRe-

quest sowie den Zugriff auf das DOM durch Bereitstellung von objektorienrierten

Schnittstellen. Die Entwicklung von Ajax-Anwendungen wird zudem durch die Un-

terstutzung von globalen und abfragespezifischen Eventhandlern unterstutzt. Au-

ßerdem erweitert Prototype viele JavaScript-Objekte um neue Funktionen, welche

die Arbeit mit diesen Objekten vereinfachen [Prot07]. Das zusatzlich installierbare

Framework script.aculo.us bietet eine Reihe vorgefertigter Effekte und Animationen

und die Moglichkeit zum einfachen Erstellen von eigenen Effekten, welche dann in

die Ajax-Anwendung eingebaut werden konnen.

5.3 Google Web Toolkit

Das Google Web Toolkit (GWT) reprasentiert einen anderen Ansatz. Mit dem GWT

kann die gesamte Ajax-Anwendung mit einer beliebigen Entwicklungsumgebung in

Java entwickelt und getestet werden. Anschließend wird diese Anwendung mit Hilfe

des GWT-Compilers automatisch in eine aus HTML, CSS und JavaScript bestehen-

de Ajax-Anwendung ubersetzt [GWT07]. Entwickler konnen also mit reinen Java-

Kenntnissen eine voll funktionsfahige Ajax-Anwendung erstellen und diese mit den

vollen Debugging-Funktionen ihrer Java-Entwicklungsumgebung testen. Zusatzlich

bietet das GWT einen Satz wiederverwendbarer Komponenten fur die Gestaltung

einer Benutzeroberflache an und unterstutzt auch die Browser-History sowie Book-

marks. Die erstellten Anwendungen sind mit allen großen Browsern (Internet Ex-

porer, Firefox, Mozilla etc.) kompatibel. Auch der Zugriff auf DOM ist mit Hilfe

generalisierter Klassen browserubergreifend realisiert [GWT07].

24

Kapitel 6: Die Zukunft von Ajax

6 Die Zukunft von Ajax

Ajax ermoglicht die Entwicklung von Webanwendungen der nachsten Generation

und wird damit das WWW revolutionieren. Ajax-Anwendungen ermoglichen Be-

nutzern eine interaktivere und naturlichere Arbeit, da ihnen Anwendungen geboten

werden, die die Vorteile von Desktopanwendungen und Webanwendungen kombinie-

ren und damit die Grenzen zwischen diesen Anwendungstypen verwischen.

Auch wenn Ajax nicht in allen Webapplikationen Verwendung finden wird und es

sicherlich Webanwendungen gibt, fur die sich Ajax nicht eignet, so eroffnen sich durch

Ajax Moglichkeiten fur neue Arten von Webanwendungen, wie z.B. web-basierte

Office-Suiten. Außerdem konnen viele bestehende Anwendungen aller Großen durch

Ajax um nutzliche Funktionen erweitert werden, wie Google Suggest zeigt. Un-

terstutzt von Ajax bietet sich also die Moglichkeit, viele Desktop-basierte Anwen-

dungen in Webanwendungen zu transformieren.

Die im Rahmen von Ajax eingesetzten Technologien sind bereits erprobt und

ausgereift, bieten jedoch Moglichkeiten zur Weiterentwicklung. So wurde das Po-

tential von JavaScript erst im Rahmen von Ajax wirklich klar und lasst auf eine

baldige Weiterentwicklung der Sprache schließen. Die Ansatze einiger Frameworks

zur Vereinfachung des DOM-Zugriffs zeigen, dass auch hier noch viel moglich ist.

2006 wurde die OpenAjax Alliance gegrundet, der viele große Firmen wie IBM,

Oracle und Google angehoren [OA07]. Ziel ist die Entwicklung eines OpenSource

Ajax-Frameworks, das als standardisiertes Werkzeug eingesetzt werden soll. Initia-

tiven wie diese zeigen, dass Ajax auch in Zukunft eine große Rolle spielen wird.

Der breite Einsatz eines standardisierten Frameworks wird dazu fuhren, dass Ajax-

Anwendungen fehlerfrei und mit geringerem Aufwand entwickelt werden konnen.

Auch bietet sich hier die Moglichkeit, dass die angesprochenen Nachteile von Ajax-

Anwendungen auf breiter Basis behoben werden und Ajax-Anwendungen benutzer-

freundlicher werden.

Weitere Standardisierungsinitiativen betreffen die Benutzeroberflache. Das World

Wide Web Consortiom (W3C) hat dafur den XForms-Standard entwickelt, wel-

cher ein Bestandteil von XHTML werden soll [WWWC07]. XForms entwickelt die

HTML-Formulare und Oberflachenkomponenten weiter und bietet unter anderem

Moglichkeiten zur clientseitigen Datenuberprufung, zur Reaktion von Komponenten

auf Anderungen anderer Komponenten. Des weiteren werden durch XForms neue Be-

nutzeroberflachenkomponenten (z.B. Kalenderfelder) definiert. Diese Moglichkeiten

und Komponenten werden bei Umsetzung des Standards von allen Browsern un-

terstutzt werden mussen.

25

Kapitel A: Quellcode der Beispielanwendung

A Quellcode der Beispielanwendung

Im Rahmen dieser Arbeit wurde eine einfache Kalenderanwendung erstellt, die es

erlaubt, Termine in einen Kalender einzutragen und sich die Termine verschiedener

Tage anzusehen. Dazu wird eine Ajax-Webseite mit einer PHP-Mysql-Anwendung

auf dem Server kombiniert, um die Termine permanent zu speichern.

A.1 Calendar.html

Diese Seite bietet das Grundgerust der Kalenderanwendung.

1 <!DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.01// EN" "http :// www.w3.org/TR/html4/strict.dtd">

2 <html>3 <!-- Einbindung der CSS -Formatierungen in die Seite -->4 <link href="style.css" type="text/css" rel="stylesheet" />5 <!-- Einbindung der Ajax -Engine (JavaScript -Code) in die Seite --

>6 <script language="JavaScript" src="ajax.js"></script >7 <head>8 <meta http -equiv="Content -Type" content="text/html; charset=iso

-8859 -1" />9 <title >Seminar Multimedia - AJAX Beispiel </title>

10 </head>11 <!-- Beim ersten Laden der Seite werden alle Termine geladen ,

indem die Funktion getAlleTermine () aufgerufen wird -->12 <body onload="getAlleTermine ();">13 <!-- Containerelement , das den Kalender enthalt -->14 <div id="kalender">15 <!-- Kalendertabelle , die Tage werden in den einzelnen Zellen

dargestellt -->16 <table id="kalendertab">17 <tr><th colspan="7">Januar 2008</th></tr>18 <tr><th>Mo</th><th>Di</th><th>Mi</th><th>Do</th><th>Fr</th>

<th>Sa</th><th>So</th></tr>19 <tr>20 <td>&nbsp;</td>21 <!-- Eine Zelle reprasentiert einen Tag. Beim Klick auf

eine Zelle werden die Termine des jeweiligen Tages indie Terminubersicht geladen. Dies geschieht , indem dieFunktion getTermineUebersicht () fur das gewahlte

Datum aufgerufen wird. Innerhalb der Zelle befindetsich ein Containerelement mit der ID der jeweiligenTages , in welches die Termine eingefugt werden. -->

22 <td class="cal" onclick="getTermineUebersicht (2008, 1, 1)">01<div id="1"></div></td>

23 <td class="cal" onclick="getTermineUebersicht (2008, 1, 2)">02<div id="2"></div></td>

24 <td class="cal" onclick="getTermineUebersicht (2008, 1, 3)">03<div id="3"></div></td>

25 <td class="cal" onclick="getTermineUebersicht (2008, 1, 4)">04<div id="4"></div></td>

26 <td class="cal" onclick="getTermineUebersicht (2008, 1, 5)">05<div id="5"></div></td>

26

Kapitel A: Quellcode der Beispielanwendung

27 <td class="cal" onclick="getTermineUebersicht (2008, 1, 6)">06<div id="6"></div></td>

28 </tr>29 <tr>30 <td class="cal" onclick="getTermineUebersicht

(2008 , 1, 7)">07<div id="7"></div></td>31 <td class="cal" onclick="getTermineUebersicht (2008, 1, 8)

">08<div id="8"></div></td>32 <td class="cal" onclick="getTermineUebersicht (2008, 1, 9)

">09<div id="9"></div></td>33 <td class="cal" onclick="getTermineUebersicht (2008, 1,

10)">10<div id="10"></div></td>34 <td class="cal" onclick="getTermineUebersicht (2008, 1,

11)">11<div id="11"></div></td>35 <td class="cal" onclick="getTermineUebersicht (2008, 1,

12)">12<div id="12"></div></td>36 <td class="cal" onclick="getTermineUebersicht (2008, 1,

13)">13<div id="13"></div></td>37 </tr>38 <tr>39 <td class="cal" onclick="getTermineUebersicht (2008, 1,

14)">14<div id="14"></div></td>40 <td class="cal" onclick="getTermineUebersicht (2008, 1,

15)">15<div id="15"></div></td>41 <td class="cal" onclick="getTermineUebersicht (2008, 1,

16)">16<div id="16"></div></td>42 <td class="cal" onclick="getTermineUebersicht (2008, 1,

17)">17<div id="17"></div></td>43 <td class="cal" onclick="getTermineUebersicht (2008, 1,

18)">18<div id="18"></div></td>44 <td class="cal" onclick="getTermineUebersicht (2008, 1,

19)">19<div id="19"></div></td>45 <td class="cal" onclick="getTermineUebersicht (2008, 1,

20)">20<div id="20"></div></td>46 </tr>47 <tr>48 <td class="cal" onclick="getTermineUebersicht (2008, 1,

21)">21<div id="21"></div></td>49 <td class="cal" onclick="getTermineUebersicht (2008, 1,

22)">22<div id="22"></div></td>50 <td class="cal" onclick="getTermineUebersicht (2008, 1,

23)">23<div id="23"></div></td>51 <td class="cal" onclick="getTermineUebersicht (2008, 1,

24)">24<div id="24"></div></td>52 <td class="cal" onclick="getTermineUebersicht (2008, 1,

25)">25<div id="25"></div></td>53 <td class="cal" onclick="getTermineUebersicht (2008, 1,

26)">26<div id="26"></div></td>54 <td class="cal" onclick="getTermineUebersicht (2008, 1,

27)">27<div id="27"></div></td>55 </tr>56 <tr>57 <td class="cal" onclick="getTermineUebersicht (2008, 1,

28)">28<div id="28"></div></td>58 <td class="cal" onclick="getTermineUebersicht (2008, 1,

29)">29<div id="29"></div></td>

27

Kapitel A: Quellcode der Beispielanwendung

59 <td class="cal" onclick="getTermineUebersicht (2008, 1,30)">30<div id="30"></div></td>

60 <td class="cal" onclick="getTermineUebersicht (2008, 1,31)">31<div id="31"></div></td>

61 <td>&nbsp;</td>62 <td>&nbsp;</td>63 <td>&nbsp;</td>64 </tr>65 </table >66 </div>67 <!-- Containerelement der Klasse "termincontainer" (fur die

Formatierung mittels CSS) -->68 <div class="termincontainer">69 <!-- Tabelle der Klasse "termintab" (fur die Formatierung

mittels CSS), die die Komponenten fur das Anlegen einesneuen Termines enthalt -->

70 <table class="termintab">71 <tr><th colspan="2">Neuen Termin Anlegen </th></tr>72 <tr><td>Datum:</td><td><input name="datum" id="datum"

unselectable="true" disabled="true"><input type="hidden"id="tag" name="tag"></td></tr>

73 <tr><td>Titel:</td><td><input name="titel" id="titel" value=""></td></tr>

74 <tr><td>Beschreibung:</td><td><input name="beschreibung" id="beschreibung" value=""></td></tr>

75 <tr><td colspan="2"><input type="button" value="speichern"onclick="neuerTermin ()"></td></tr>

76 </table >77 <!-- Tabelle der Klasse "termintab" (fur die Formatierung

mittels CSS), Terminubersicht enthalt -->78 <table class="termintab">79 <tr><th>Termine an diesem Tag</th></tr>80 <!-- Tabellenzelle fur die Terminubersicht mit ID "

termindetails" zum Ansprechen uber DOM -->81 <tr><td><div id="termindetails"></div></td></tr>82 </table >83 </div>84 </body>85 </html>

A.2 style.css

Diese Datei enthalt die CSS-Formatierungen fur die o.a. HTML-Seite.

1 /* Formatierung fur Element mit ID "Kalender" (Kalendercontainer)*/

2 #kalender {3 border-style: solid;4 border-width: medium;5 width: 700px;6 height: 700px;7 float: right;8 }9 /* Formatierung fur Element mit ID "Kalendertab" (Kalendertabelle)

*/10 #kalendertab {

28

Kapitel A: Quellcode der Beispielanwendung

11 width: 100%;12 height: 100%;13 text-align: center;14 border-collapse: collapse;15 }16 /* Formatierung fur Zellenelement innerhalb des Elementes mit ID "

Kalender" (Kalenderzellen) */17 #kalendertab td {18 border-color: black;19 border-width: thin;20 border-style: solid;21 vertical-align: top;22 width: 14%;23 height: 14%;24 }25 /*26 * Formatierung fur Kalenderzellen der Klasse "cal".27 * Hier wird ein Pointer-Cursor gesetzt , damit erkennbar ist , dass

in die Zellen geklickt werden kann.28 */29 #kalendertab td.cal {30 cursor: pointer;31 }32 /* Formatierung fur Uberschriftenzeilen der Kalendertabelle */33 #kalendertab th {34 background-color: blue;35 color: white;36 font-weight: bold;37 }38 /*39 * Formatierung fur Elemente mit Klasse "termin ".40 * wird fur die Termineintrage im Kalender und in der Ubersicht

verwendet41 */42 .termin {43 font-size: 7pt;44 font-family: Tahoma;45 background-color: blue;46 color: white;47 font-weight: bold;48 margin-bottom: 1px;49 margin-top: 1px;50 }51 /* Formatierung fur Element mit Klasse "termincontainer" (

Benutzeroberflache und Terminubersicht) */52 .termincontainer {53 border-style: solid;54 border-width: medium;55 border-color: black;56 width: 350px;57 }58 /* Formatierung fur Elemente mit Klasse "termintab" (Tabellen fur

benutzeroberflache und Terminubersicht) */59 .termintab {60 width: 100%;61 border-collapse: collapse;62 text-align: left;

29

Kapitel A: Quellcode der Beispielanwendung

63 }64 /* Formatierung fur Uberschriftenzeile der o.a. Tabellen */65 .termintab th {66 background-color: blue;67 color: white;68 font-weight: bold;69 }70 /* Formatierung fur die Zellen der o.a. Tabellen */71 .termintab td {72 border-style: none;73 }74 /* Formatierung fur Element mit ID "termindetails" (Terminubersicht

) */75 #termindetails {76 height: 100px;77 font-family: Tahoma;78 font-size: 10pt;79 }

A.3 ajax.js

Diese Datei enthalt die Ajax-Engine.

1 aktuelleZelle = "";2

3 /* Funktion fur die Erstellung eines XMLHttpRequest -Objekts */4 function getXMLHttpObject () {5 // Test , ob XMLHttpRequestObjekt nativ oder per ActiveX

unterstutzt wird6 if (window.XMLHttpRequest) {7 // Browser unterstutzt das XMLHttpRequest -Objekt (alle außer

Interner Explorer < 7)8 return new XMLHttpRequest ();9 } else if (window.ActiveXObject) {

10 // Browser unterstutzt ActiveX (Internet Explorer < 7)11 // Versuch , zunachst aktuellstes ActiveX -Objekt zu erstellen12 try {13 return new ActiveXObject("Msxml2.XMLHTTP");14 } catch(ex) {15 // Fehlgeschlagen , altere Version erstellen16 try {17 return new ActiveXObject("Microsoft.XMLHTTP");18 } catch(ex) {19 }20 }21

22 }23 }24

25 /* Legt einen neuen Termin an */26 function neuerTermin () {27 // neues XMLHttpRequest -Objekt erstellen28 var resObjekt = new XMLHttpRequest ();29 // Callback -Funktion definieren30 resObjekt.onreadystatechange = function () {31 // Ist Request fertig geladen?

30

Kapitel A: Quellcode der Beispielanwendung

32 if (resObjekt.readyState == 4) {33 // Termin -Elemente aus Response -XML -Dokument auslesen34 liste = resObjekt.responseXML.getElementsByTagName("termin");35 // Tag der zuruckgelieferten Elemente auslesen36 // (damit klar ist , welche Kalenderzelle aktualisiert werden

soll)37 tagElem = resObjekt.responseXML.getElementsByTagName("day")

[0];38 tag = datumElem.firstchild.data;39 anzahl = liste.length;40 // Wurden Termine zuruckgegeben?41 if (anzahl > 0) {42 termineShort = "";43 termineLong = "";44 // Fur alle zuruckgegebenen Termine ...45 for (i = 0; i < anzahl; i++) {46 // Neues Div -Element der Klasse "Termin" erstellen ,47 // einmal ohne Beschreibung (fur Kalender) und einmal mit

(fur Detailubersicht).48 termineShort = termineShort + "<div class =\" termin\"> " +

liste[i]. getElementsByTagName("titel")[0]. firstChild.data + "</div >";

49 termineLong = termineLong + "<div class =\" termin\">" +liste[i]. getElementsByTagName("titel")[0]. firstChild.data +

50 " (" +51 liste[i]. getElementsByTagName("beschreibung")[0].

firstChild.data +52 ") </div >";53 }54 // Terminelemente in Kalender eintragen55 // (Zelle mit der ID des zuruckgelieferten Tages wird

aktualisiert)56 document.getElementById(tag).innerHTML = termineShort;57 // Terminelemente in Detailubersicht eintragen58 document.getElementById("termindetails").innerHTML =

termineLong;59 }60 else {61 }62 }63 }64

65 // Datum aus Textfeld auslesen66 datum = document.getElementById("datum").value;67 // Titel des neuen Termins aus Textfeld auslesen68 titel = document.getElementById("titel").value;69 // Beschreibung des neuen Termins aus Textfeld auslesen70 beschreibung = document.getElementById("beschreibung").value;71 // Animation in aktueller Zelle und Detailubersicht erzeugen72 document.getElementById(aktuelleZelle).innerHTML = document.

getElementById(aktuelleZelle).innerHTML + ’<center ><img src="wait.gif" /></center >’;

73 document.getElementById("termindetails").innerHTML = document.getElementById("termindetails").innerHTML + ’<center ><img src="wait.gif" /></center >’;

31

Kapitel A: Quellcode der Beispielanwendung

74 // Request vorbereiten (Zugriff auf neuerTermin.php mit MethodePOST)

75 resObjekt.open(’post’, ’neuerTermin.php’, true);76 // Request -Header fur Senden von POST -Daten setzen77 resObjekt.setRequestHeader("Content -Type", "application/x-www -

form -urlencoded");78 // Request abschicken (inkl. POST -Daten)79 resObjekt.send(’datum=’ + datum + ’&titel=’ + titel + ’&

beschreibung=’ + beschreibung);80 }81

82 /*83 * Liest die Termine aller Kalendertage aus ,84 * wird beim ersten Laden der Anwendung ausgefuhrt.85 */86 function getAlleTermine () {87 for (i = 1; i <= 31; i++) {88 getTermine (2008 , 1, i)89 }90 }91

92 /* Liest die Termine eines Tages aus und aktualisiert diese imKalender */

93 function getTermine(year , month , day) {94 // neues XMLHttpRequest -Objekt erstellen95 var resObjekt = getXMLHttpObject ();96 // Callback -Funktion definieren97 resObjekt.onreadystatechange = function () {98 // Ist Request fertig geladen?99 if (resObjekt.readyState == 4) {

100 // Termin -Elemente aus Response -XML -Dokument auslesen101 liste = resObjekt.responseXML.getElementsByTagName("termin");102 anzahl = liste.length;103 s = "";104 // Wurden Termine zuruckgegeben?105 if (anzahl > 0) {106 // Fur alle Termine ...107 for (i = 0; i<anzahl; i++) {108 // Neues Div -Element der Klasse "Termin" erstellen109 s = s + "<div class =\" termin\">" + liste[i].

getElementsByTagName("titel")[0]. firstChild.data + "</div >";

110 }111 }112 // Terminelemente in Kalender eintragen113 // (Zelle mit der ID des zuruckgelieferten Tages wird

aktualisiert)114 document.getElementById(day).innerHTML = s;115 }116 }117 // Animation in zugehoriger Zelle erzeugen118 document.getElementById(day).innerHTML = ’<center ><img src="wait.

gif" /></center >’;119 // Request vorbereiten (Zugriff auf termine.php mit Methode POST)120 resObjekt.open(’post’, ’termine.php’, true);121 // Request -Header fur Senden von POST -Daten setzen

32

Kapitel A: Quellcode der Beispielanwendung

122 resObjekt.setRequestHeader("Content -Type", "application/x-www -form -urlencoded");

123 // Request abschicken (inkl. POST -Daten)124 resObjekt.send(’datum=’ + day + ’.’ + month + ’.’ + year);125 }126

127 /*128 * Liest die Termine eines Tages aus und schreibt diese in die

Detailubersicht.129 * Diese Funktion wird beim Klick auf eine Zelle aufgerufen.130 */131 function getTermineUebersicht(year , month , day) {132 // neues XMLHttpRequest -Objekt erstellen133 var resObjekt = getXMLHttpObject ();134 // Callback -Funktion definieren135 resObjekt.onreadystatechange = function () {136 // Ist Request fertig geladen?137 if (resObjekt.readyState == 4) {138 // Termin -Elemente aus Response -XML -Dokument auslesen139 liste = resObjekt.responseXML.getElementsByTagName("termin");140 anzahl = liste.length;141 // Wurden Termine zuruckgegeben?142 if (anzahl > 0) {143 s = "";144 // Fur alle Termine ...145 for (i = 0; i<anzahl; i++) {146 // Neues Div -Element der Klasse "Termin" erstellen147 s = s + "<div class =\" termin\">" + liste[i].

getElementsByTagName("titel")[0]. firstChild.data;148 s = s + " (" + liste[i]. getElementsByTagName("

beschreibung")[0]. firstChild.data;149 s = s + ") </div >";150 }151 } else {152 s = "Keine Termine an diesem Tag";153 }154 // Terminelemente in Detailubersicht eintragen155 document.getElementById("termindetails").innerHTML = s;156 }157 }158 // Datum im Textfeld aktualisieren (da auf die entsprechende

Zelle geklickt wurde159 document.getElementById("datum").value = day + ’.’ + month + ’.’

+ year;160 // aktuelle Zelle setzen161 aktuelleZelle = day;162 // Animation in Detailubersicht Zelle erzeugen163 document.getElementById("termindetails").innerHTML = ’<center ><

img src="wait.gif" /></center >’;164 // Request vorbereiten (Zugriff auf termine.php mit Methode POST)165 resObjekt.open(’post’, ’termine.php’, true);166 // Request -Header fur Senden von POST -Daten setzen167 resObjekt.setRequestHeader("Content -Type", "application/x-www -

form -urlencoded");168 // Request abschicken (inkl. POST -Daten)169 resObjekt.send(’datum=’ + day + ’.’ + month + ’.’ + year);170 }

33

Kapitel A: Quellcode der Beispielanwendung

A.4 neuerTermin.php

Diese Datei enthalt die serverseitige Applikationslogik zum Anlegen eines neuen Ter-

mins. Dazu werden dem PHP-Skript per POST-Methode die Parameter fur Datum,

Titel und Beschreibung des neuen Termins in den Variablen datum, titel, und

beschreibung ubergeben (Zeilen 10-12). Das Skript gibt dem Client alle Termi-

ne des gewahlten Datums als XML zuruck, inklusive des neu angelegten Termines,

damit der Client diese Termine aktualisieren kann.

1 <?php2 // Response -Header auf XML setzen , damit der Client die

zuruckgelieferten Daten als XML interpretiert3 @header("Content -type: text/xml");4 // Browser -seitiges zwischenspeichern (caching) von ubermittelten

Daten deaktivieren , damit nicht alte Daten aus dem Cacheverwendet werden

5 @header("Cache -Control: no -cache , must -revalidate , max -age=0");6 @header("Pragma: no -cache");7 // 1 Sekunde Verzogerung , um Ajax -Funktionalitat zu demonstrieren8 sleep (1);9 // Ubergebene Parameter (Datum , Titel , Beschreibung) aus POST -

Variablen auslesen10 $datum_str = $HTTP_POST_VARS["datum"];11 $titel = $HTTP_POST_VARS["titel"];12 $beschreibung = $HTTP_POST_VARS["beschreibung"];13 // Uberprufung , ob alle Parameter ubergeben wurden14 if (isset($datum_str) && isset($titel) && isset($beschreibung)) {15 // Typkonvertierung des Datums von String nach Date16 $datum = date_create($datum_str);17 // Verbindung zum MySQL -Server und zur Datenbank aufbauen18 $mysql_conn = mysql_connect("localhost", "root", "", false);19 mysql_select_db("AjaxBeispiel");20

21 // Neuen Termin per SQL in die Datenbank einfugen22 $query = "INSERT INTO termine (datum , titel , beschreibung)

VALUES (\"" . date_format($datum , "Y-m-d") . "\",\" $titel\",\" $beschreibung \")";

23 $result = mysql_query($query , $mysql_conn) or die("ERROR: " .mysql_error ());

24

25 // Alle Termine des ubergebenen Tages auswahlen26 $query = "SELECT titel , beschreibung FROM termine WHERE datum =

\"" . date_format($datum , "Y-m-d") . "\"";27 $result = mysql_query($query , $mysql_conn) or die("ERROR: " .

mysql_error ());28 // Ergebnis als XML -Formatierte Daten ausgeben29 echo "<?xml version = \"1.0\" ?>";30 echo "<termine ><tag >" . date_format($datum , "j") . "</tag >";31 // Alle Termine in XML -String einfugen32 while ($row = mysql_fetch_array($result , MYSQL_BOTH)) {33 echo "<termin ><titel >" . $row [0] . "</titel ><beschreibung >" .

$row [1] . " </beschreibung ></termin >";34 }35 echo "</termine >";36 } else {

34

Kapitel A: Quellcode der Beispielanwendung

37 //Falls nicht alle Parameter ubergeben wurden , leeres XMLzuruckgeben

38 echo "<?xml version = \"1.0\" ?><termine ></termine >";39 }40 ?>

A.5 termine.php

Diese Datei enthalt die serverseitige Applikationslogik zum Abfragen aller Termine

eines Datums. Dazu wird dem PHP-Skript per POST-Methode das Datum in der

Variablen datum ubergeben (Zeile 10). Das Skript gibt dem Client alle Termine des

gewahlten Datums als XML zuruck.

1 <?php2 // Response -Header auf XML setzen , damit der Client die

zuruckgelieferten Daten als XML interpretiert3 @header("Content -type: text/xml");4 // Browser -seitiges Caching deaktivieren5 @header("Cache -Control: no -cache , must -revalidate , max -age=0");6 @header("Pragma: no -cache");7 // 1 Sekunde Verzogerung , um Ajax -Funktionalitat zu

demonstrieren8 sleep (1);9 // Ubergebenen Parameter (Datum) aus POST -Variablen auslesen

10 $datumstr = $HTTP_POST_VARS["datum"];11 // Uberprufung , ob Parameter ubergeben wurde12 if (isset($datumstr)) {13 // Typkonvertierung des Datums von String nach Date14 $datum = date_create($datumstr);15 // Verbindung zum MySQL -Server und zur Datenbank aufbauen16 $mysql_conn = mysql_connect("localhost", "root", "", false);17 mysql_select_db("AjaxBeispiel");18

19 // Alle Termine des aktuellen Tages auswahlen20 $query = "SELECT titel , beschreibung FROM termine WHERE datum =

\"" . date_format($datum , "Y-m-d") . "\"";21 $result = mysql_query($query , $mysql_conn) or die("ERROR: " .

mysql_error ());22 // Ergebnis als XML -Formatierte Daten ausgeben23 echo "<?xml version = \"1.0\" ?>";24 echo "<termine ><tag >" . date_format($datum , "j") . "</tag >";25 // Alle Termine in XML -String einfugen26 while ($row = mysql_fetch_array($result , MYSQL_BOTH)) {27 echo "<termin ><titel >" . $row [0] . "</titel ><beschreibung >" .

$row [1] . " </beschreibung ></termin >";28 }29 echo "</termine >";30 } else {31 //Falls nicht alle Parameter ubergeben wurden , leeres XML

zuruckgeben32 echo "<?xml version = \"1.0\" ?><termine ></termine >";33 }34 ?>

35

Kapitel B: Beispielanwendung mit Sajax

B Beispielanwendung mit Sajax

Als Beispiel soll hier die Kalenderanwendung mittels Sajax und PHP implementiert

und Unterschiede zur normalen Implementierung (siehe Anhang A) erklart werden.

Zuvor wurden in der Kalenderanwendung fur die einzelnen Funktionen verschie-

dene PHP-Dateien per XMLHttpRequest aufgerufen. Diese Dateien werden nun als

einzelne PHP-Funktionen definiert, damit diese spater per Sajax aufgerufen werden

konnen. Quelltext 22 enthalt die Funktion neuerTermin, durch die ein neuer Termin

an einem per Funktionsparameter ubergebenen Datum erstellt wird. Die Parameter

werden der Funktion dabei durch Sajax ubergeben und mussen nicht mehr explizit

via POST Abgefragt werden. Wahrend der Ruckgabewert zuvor manuell als XML-

Datei formatiert wurde, wird bei Nutzung von Sajax einfach ein Objekt vom Typ

”Termine“ erstellt und zuruckgegeben (Zeilen 11 bis 21). Dazu werden die Termine

des angegebenen Datums in ein Array gespeichert (Zeile 8) und anschließend dem

Objekt zugewiesen (Zeile 19).

1 function neuerTermin($datumstr , $titel , $beschreibung) {2 sleep (1);3 $tag = "";4 $termine = array ();5 if (isset($datumstr) && isset($titel) && isset($beschreibung)

) {6 // (...) MySQL -Anfrage7 while ($row = mysql_fetch_array($result , MYSQLI_BOTH)) {8 array_push($termine , array($row[0], $row [1]));9 }

10 }11 class Termine {12 var $tag , $termine;13

14 function Termine($tag , $termine) {15 $this ->tag = $tag;16 $this ->termine = $termine;17 }18 }19 $o = new Termine($tag , $termine);20 return $o;21 }

Quelltext 6: Sajax: Definition der PHP-Funktion”neuerTermin“

Quelltext 22 zeigt vereinfacht den neuen Aufbau der Hauptseite. Die oben defi-

nierte Funktion wird in der Client-Anwendung mittels Sajax export("neuerTermin")

(Zeile 7) bekannt gemacht. Durch das PHP-Statement sajax show javascript() (Zeile

13) wird automatisch der notige Javascript-Code generiert, um diese Funktion client-

seitig aufzurufen. Dazu erstellt Sajax die Javascript-Wrapper-Funktion x neuerTermin,

in der intern ein XMLHttpRequest-Objekt dazu verwendet wird, die Parameter und

den Funktionsnamen an den Server zu ubermitteln und diese Funktion dort aufzu-

36

Kapitel B: Beispielanwendung mit Sajax

rufen.

1 <?php2 require("sajax.php");3 require("termine.php");4 require("neuerTermin.php");5 sajax_init ();6 sajax_export("getTermine");7 sajax_export("neuerTermin");8 sajax_handle_client_request ();9 ?>

10 <html >11 <link href="style.css" type="text/css" rel="stylesheet" />12 <head >13 <script language="JavaScript">14 <?php sajax_show_javascript () ?>15 </script >16 <script language="JavaScript" src="ajax.js"></script >17 </head >18 <body onload="getAlleTermine ()">19 (...)20 </body >21 </html >

Quelltext 7: Sajax: Vereinfachte Hauptseite der Kalenderanwendung

Die Wrapper-Funktion wird durch x neuerTermin(datum, titel, beschreibung,

do neuerTermin cb) aufgerufen, wenn der Benutzer einen neuen Termin erstellt. Die

ersten drei Parameter sind dabei die an die PHP-Funktion zu ubergebenden Para-

meter, wahrend der vierte Parameter eine Referenz auf die Callback-Funktion ist.

Das von der PHP-Funktion zuruckgelieferte Termine-Objekt steht im Client

in der Callback-Funktion als Parameter”val“ zur Verfugung. Quelltext 19 zeigt

die Callback-Funktion. Hier vereinfacht sich der notige Code im Vergleich zur ur-

sprunglichen Kalenderanwendung deutlich, da es nun nicht mehr notig ist, die XML-

Ruckgabe zu parsen. Stattdessen kann auf die Eigenschaften des ubergebenen Ob-

jektes (also tag und termine) mit den gleichen Bezeichnungen wie im serverseitigen

Skript zugegriffen werden. Auch ist die manuelle Uberprufung von Status des XML-

HttpRequest Objektes nicht mehr notig, da die Callback-Funktion von Sajax nur

aufgerufen wird, wenn die angeforderten Daten komplett empfangen wurden.

1 // Callback Funktion fur die Erstellung eines neuen Termins ,liefert alle Termine des gewahlten Tages zuruck

2 function do_neuerTermin_cb(val) {3 // Gewahlten Tag speichern4 day = val.tag;5 termineShort = "";6 termineLong = "";7 // Termine der zuruckgegebenen Objektes durchlaufen8 for (var i in val.termine) {9 // Terminbeschreibungen ausgeben

10 termineShort = termineShort + "<div class =\" termin\">" + val.termine[i][0] + "</div >";

37

Kapitel B: Beispielanwendung mit Sajax

11 termineLong = termineLong + "<div class =\" termin\">" + val.termine[i][0];

12 termineLong = termineLong + " (" + val.termine[i][1];13 termineLong = termineLong + ") </div >";14 }15 // Terminbeschreibungen in die benutzeroberflache einfugen16 document.getElementById(day).innerHTML = termineShort;17 document.getElementById("altetermine").innerHTML = termineLong;18 }

Quelltext 8: Sajax: Callback-Funktion fur”neuerTermin“

Durch die Verwendung von Sajax in der Beispielanwendung vereinfacht sich die

Entwicklung. Die gewunschten Funktionen werden nur in PHP definiert und ste-

hen in JavaScript automatisch zur Verfugung. Fur den Datenaustausch zwischen

Client und Server konnen dabei statt XML-formatierten Daten Objekte verwendet

werden, was den Zugriff auf diese Daten und somit auch die Programmlogik verein-

facht. Schließlich muss das XMLHttpRequest-Objekt inklusive aller browserspezi-

fischen Unterschiede nicht manuell erstellt und abgefragt werden. Die Entwicklung

auch kleiner Ajax-Anwendungen mit Unterstutzung von Frameworks bietet also viele

Vorteile.

38

Literaturverzeichnis

Literatur

[Ga05] Jesse James Garrett: Ajax - A New Approach to Web Applications,

Adaptive-Path Webseite.

URL: http://www.adaptivepath.com/ideas/essays/archives/000385.php,

Abrufdatum: 14. Dezember 2007.

[GGA06] Justin Gethland, Ben Galbraith, Dion Almaer: Pragmatic Ajax, The Prag-

matic Programmers, 2006.

[Gr07] Christian Gross: Ajax - Design Patterns und Best Practices, REDLINE

Gmbh, 2007.

[GWT07] Google Code: Google Web Toolkit, Google Webseite.

URL: http://code.google.com/webtoolkit/overview.html,

Abrufdatum: 14. Dezember 2007.

[IB07] IT-Business: Gartner sagt zweistelliges Wachstum fur SAAS voraus, IT-

Business Webseite, 2007.

URL: http://www.it-business.de/themenkanaele/marktforschung/trends/

allgemein/articles/90003/,

Abrufdatum: 14. Dezember 2007.

[Ma06] Michael Mahemoff: Ajax Design Patterns, O’Reilly, 2006.

[Me06] Christopher L Merrill: Using Ajax to Improve the Bandwidth Performance

of Web Applications, WebPerformance Webseite.

URL: http://www.webperformanceinc.com/library/reports/AjaxBandwidth/

index.html,

Abrufdatum: 14. Dezember 2007.

[NS06] S. Niedermeyer, M. Scholz: JAVA und XML, Galileo Computing, 2006.

[Prot07] Prototype Articles: prototype Tips and Tutorials, Prototype Webseite,

2007.

URL: http://www.prototypejs.org/learn,

Abrufdatum: 14. Dezember 2007.

[Re06] John Resig: Pro JavaScript Techniques, Apress, 2006.

[St07] Ralph Steyer: Ajax, Markt + Technik, 2007.

[We06] Christian Wenz: Ajax, entwickler.press, 2006.

39

Literaturverzeichnis

[WWWC02] W3C Recommendation: XHTML 1.0 The Extensible HyperText Mar-

kup Language (Second Edition), W3C Webseite, 2002.

URL: http://www.w3.org/TR/xhtml1/,

Abrufdatum: 14. Dezember 2007.

[WWWC06] W3C Recommendation: Extensible Markup Language (XML) 1.0

(Fourth Edition), W3C Webseite, 2006.

URL: http://www.w3.org/TR/2006/REC-xml-20060816/,

Abrufdatum: 14. Dezember 2007.

[WWWC98] W3C Working Draft: Level 1 Document Object Model Specification,

W3C Webseite, 1998.

URL: http://www.w3.org/TR/WD-DOM/,

Abrufdatum: 14. Dezember 2007.

[WWWC99] W3C Recommendation: Cascading Style Sheets, Level 1, W3C Web-

seite, 1999.

URL: http://www.w3.org/TR/CSS1,

Abrufdatum: 14. Dezember 2007.

[WWWC07] W3C Candidate Recommendation: XForms 1.1, W3c Webseite, 2007.

URL: http://www.w3.org/TR/xforms11/,

Abrufdatum: 14. Dezember 2007.

[OA07] Open Ajax Alliance, Open Ajax Alliance Webseite, 2007.

URL: http://www.openajax.org/,

Abrufdatum: 14. Dezember 2007.

40