JavaScript, Ajax

Aufgabenblatt 6
Webtechnologien
Wirtschaftsinformatik
SS 2015
Lernziele
Es wird folgendes gelernt:
• JavaScript - dazu ist der 2. Foliensatz über JavaScript wichtig
• Ajax - dazu ist der 3. Foliensatz über JavaScript wichtig
• Kommunikation zwischen Threads
• Realisierung einer verteilten Anwendung
JavaScript, Ajax und <div>
Nun wird ein einfaches Chat-System realisiert. Der Server soll einen Chat mit
maximal drei Personen gleichzeitig behandeln. Jede Person gibt einen Text ein,
der an die anderen beiden – sofern sie angemeldet sind – gesendet und
angezeigt wird.
Das Ganze verläuft wie folgt: Auf der Startseite wird der Name Name der
Person eingegeben. Dieser wird an den Server gesandt, der mit der Chat-Seite
antwortet. Diese besteht aus drei Textfeldern mit jeweils einer Beschriftung.
Diese Beschriftung ist der Name der Person, das darunter stehende Textfeld
dessen eingegebener (und gesendeter) Text. Oben auf der Seite steht der
Block (Beschriftung und Text) der 1. Person, darunter der der 2. Person und
unten das Textfeld von einem selber. Wenn nun irgendetwas in dieses untere
Feld eingetippt wird, dann erscheint es bei den beiden anderen Kommunikationspartnern jeweils unter dem Namen des Schreibenden und in dem dazugehörenden Block (Textfeld). So, das ist die Idee.
Das Ganze wird durch 2 Seiten realisiert: die erste ist die „Login“-Seite
(Startseite) mit dem eigenen Namen (sowie ein Einlogg-Knopf) und die zweite
ist die „Chat“-Seite. Diese zweite Seite wird vollständig mit Ajax implementiert,
d.h. es gibt kein Nachladen der Seite vom Server. Bitte beachten Sie, dass Sie
hier ein Session-Management implementieren müssen; dazu vergeben Sie eine
Nummer (ID), die bei jedem Ajax-Request mitgesendet wird und für jede
Kommunikation mit einer Person gilt. Auf der Server-Seite werden diese IDs
zusammen mit den Namen der Person vermerkt. Jeder der max. 3 Teilnehmer
bekommt also eine eigene ID.
Bevor Sie anfangen, machen Sie einen Entwurf der Kommunikationsnachrichten, also des Protokolls. Es gibt folgende Anfragen seitens des Browsers:
-1-
1. Bei der „Chat“-Seite: Senden der eingegebenen Zeichen auf dem Hinweg
und Empfangen der Zeichen der anderen Partner auf dem Rückweg
Hinweg: session=<ID>&text=<EigenerText>
Rückweg:
session=<ID>&text1=<TextVonPerson1>&name1=<NameVonPerson1>
&text2=<TextVonPerson2>&name2=<NameVonPerson2>
2. Bei der Startseite: Mitteilen des eigenen Namens.
Hinweg: name=<EigenerName>
Rückweg: session=0 -> Fehler oder wie Rückweg der Chat-Seite
Dann fehlt noch das Abmelden vom Server, dass Sie analog definieren können
(letzte Teilaufgabe):
Hinweg: session=<ID> (kein Text bedeutet „Logout“).
Rückweg: Senden der Startseite.
Das Ganze ist nur ein Vorschlag; Sie können die Kommunikation auch anders
realisieren.
Und nun die einzelnen Schritte:
1. Sie entwerfen die beiden Seiten mit den Layout-Angaben über Layer und
externe CSS-Dateien – also wie im Aufgabenblatt 5.
2. Jetzt konzipieren Sie die Protokolle: wer mit welcher ID was zum Server
schickt und was als Antwort erhält. Oben ist eine Anregung beschrieben.
3. Nun implementieren Sie eine allgemeine Ajax-Routine – als Objekt oder
als Sammlung von Routinen, dann die Routinen zum Beschreiben und
Auslesen der Textfelder, wobei hier die Namen der Felder (DOM) als
Parameter übergeben werden – so wie in der Formular-Aufgabe. Für den
ersten Teil finden Sie Anregungen in den Folien der Vorlesung, für den
zweiten Teil können Sie die Routinen des Aufgabenblatts 5 benutzen.
Das gesamte JavaScript-Teil wird ein eine Datei geschrieben, die in die
Seiten eingebunden wird.
4. Jetzt entscheiden Sie wie ein Refresh der Chat-Seite gemacht wird: Am
Einfachsten wird dafür ein Knopf vorgesehen. Wenn jemand etwas getippt hat, klickt er auf diesen Knopf und sein Textfeld wird zum Server
geschickt, der mit den aktuellen Textfeldinhalten der anderen beiden
Kommunikationspartner antwortet, deren Texte dann natürlich dargestellt werden. Also nach dem Klick werden die Daten ausgetauscht und
neu angezeigt.
Die Ajax-Nachrichten dürfen nicht alle Zeichen enthalten; hier muss also
wie beim Aufgabenblatt 5 nach URLencoded umgewandelt werden, aber
auch auf der JavaScriptseite (Hinweise in den Folien). Die einzelnen
Werte senden Sie am besten mit dem Keyword-Mechanismus:
-2-
key1=“Wert1“&Key2=“Wert2“ etc.
5. Diese einfache Lösung wird durch die Folgende ersetzt: Per Timer wird
der aktuelle Inhalt alle 10s (oder kürzer) zum Server übertragen. Oder
noch komfortabler: Sie können eine JavaScript-Routine an ein TastaturEreignis hängen, so dass bei jedem Tastendruck die Kommunikation zum
Server abläuft, was echtes Chat ist, aber auch sehr aufwändig ist.
Da ja jemand einmal nichts eingeben kann, also schweigt, kann dies mit
der TimeOut-Version kombiniert werden: Wird getippt, gibt es kein
TimeOut, wird nicht getippt, kommt nach 10s (oder kürzer) ein TimeOut
und damit ein automatisches Aktualisieren. Die Sache mit dem TimeOut
wird in einem Foliensatz behandelt.
6. [Abgabe] Es fehlt jetzt nur noch ein „Logout“-Knopf auf der „Chat“-Seite,
der an den Server eine „Dann bin ich mal weg“-Nachricht schickt (siehe
Aufgabe2: Protokoll).
Bitte beachten Sie, dass nicht immer alle möglichen Personen chatten
und dass manchmal als mehr als drei Personen chatten wollen. Sie müssen dann die Abwesenheit eines Partners behandeln bzw. das Ablehnen
eines neuen Partners.
Eines der Probleme bei dieser Lösung besteht darin, dass jeder HTTP-Request
zu einem neuen Laden des PHP-Codes führt, d.h. dass alles Vorherige vergessen wird. Eine PHP-Session hilft auch nicht weiter, da diese nur Daten speichert
und bereit stellt, die zwischen zwei Partnern, einem bestimmten Browser und
dem Server, benutzt werden. Hier sind jedoch bis zu drei Paare von BrowserServer beteiligt. Das bedeutet, dass Sie den Zustand der Variablen jeder dieser
drei Sessions in eine Datei schreiben bzw. aus dieser wieder rekonstruieren
müssen. Oder anders formuliert: Sie benötigen einen Kommunikationsmechanismus zwischen verschiedenen Sessions. Am einfachsten realisieren Sie
diesen, wenn Sie eine Klasse zur Kommunikation definieren, deren Objekte
serialisiert abgespeichert bzw. rekonstruiert werden (dazu gibt es in PHP Routinen).
Was noch fehlt ist der wechselseitige Ausschluss, da ja zwei HTTP-Requests
parallel innerhalb des Servers ablaufen können. Hierzu benutzen Sie am einfachsten eine leere Datei: wenn sie existiert, ist der Zugriff gesperrt, wenn sie
nicht existiert, ist der Zugriff frei. Also, vor dem Deserialiseren prüfen Sie, ob
die Datei da ist, falls ja, warten Sie etwas und probieren neu, wenn nicht legen
Sie die Datei an, lesen das Objekt ein, bearbeiten das Senden, serialisieren
den neuen Zustand des Objekts und löschen anschließend die Synchronisierungsdatei.
Das ist jetzt schon eine richtige, auch etwas komplexe Web-Anwendung. Wer
daraus etwas Dolles machen will, muss nun noch so etwas wie Passwörter vorsehen, vergangene Chats in einer Datenbank abspeichern, um sie später wieder an der alten Stelle fortführen zu können und natürlich beliebig viele Chats
-3-
gleichzeitig zulassen etc. etc.
Abnahme und Bewertung
Das Ergebnis der Aufgabe 6 wird vorgeführt; es kann auch per EMail abgegeben werden. Dabei muss die gesamte Site als zip-Datei, so wie sie unter
htdocs liegt, abgegeben werden.
Es sind max. 3 Punkte zu erreichen; fehlt etwas oder ist es nicht in Ordnung,
so werden Punkte abgezogen bzw. die Lösung nicht anerkannt.
-4-