|
|
C/S Praktikum 1999-2000
Blatt 8: Servlets, Teil II
Ziel der Aufgabe auf diesem Blatt ist es, das HttpSession Objekt kennen
zu lernen und ein Servlet zu schreiben welches mit einem (fertigen) Applet kommuniziert.
Die HttpSession
Die HttpSession ist eins der interessantesten Objekte des Servlet APIs. Mit Hilfe
dieses Objektes ist es möglich Daten einem unbekannten Benutzer eindeutig
zu zuordnen und über mehrere Schritte zu bearbeiten (Anwendungsbeispiel: Warenkorb).
Dazu wird dem Benutzer ein Cookie mit der ID seiner Session geschickt. Die Daten
der HttpSession bleiben jedoch auf dem Server. Wenn der Benutzer sich wieder meldet,
wird, über den Wert des Cookie, auf die richtige Session zugegriffen.
All das passiert automatisch und transparent. Als Programmierer muß
man sich lediglich um das holen bzw. erzeugen eines Session Objektes kümmern
und um das reinschreiben und herausholen der dort gespeicherten Werte.
Dies macht das Benutzen von Sessions sehr einfach und attraktiv. Nützliche
Methoden in diesem Zusammenhang sind die getSession(boolean) Methode
der HttpServletRequest und die verschiedenen Methoden des HttpSession
Objektes.
Infos zur Applet <-> Servlet Kommunikation
HttpServlets können nicht nur mit Webbrowsern kommunizieren, sondern
auch mit Java Applets, welche im Webbrowser laufen. Zu diesem Zweck stellt
das Applet eine Verbindung zum Servlet her. Es gibt mehrere Möglichkeiten
diese Verbindung herzustellen.
- Die einfachste Möglichkeit ist eine HTTP-Verbindung zu benutzen und
Daten als Parameter der POST/GET Requests an das Servlet zu senden. Dies ist
ziemlich einfach, weil HTTP-Verbindungen über das Objekt java.net.URLConnection
aufgebaut werden können. Falls Ihr sehen wollt wie dies konkret geht,
könnt Ihr Euch die Datei HttpMessage.java (bei den Rahmenprogrammen)
ansehen, die auch von unserem MasterMind Applet benutzt wird.
- Vorteile dieser Methode sind: die einfache Programmierung (Kommunikation
über das Http Protokoll) und sie funktioniert auch durch Firewalls hindurch.
Es ist auch möglich damit Java-Objekte zu verschicken, falls diese serializable
sind. Nachteil ist, daß die Verbindung jedesmal vom Applet hergestellt
werden muß, da sie nicht dauerhaft ist.
Deshalb ist diese Methode auch nicht gerade die effizienteste.
- Eine andere Möglichkeit ist die altbewährte Socket-Verbindung.
Nachdem das Applet mit dem Servlet verbunden ist, ist bidirektionale, dauerhafte
und effiziente Kommunikation möglich. Sowohl einfache Daten, als auch
Objekte können verschickt werden. Nachteile: Sie funktioniert nicht durch
Firewalls, ist komplizierter zu programmieren (besonders auf der Servlet-Seite)
und man muß sein eigenes Kommunikationsprotokoll entwerfen.
- Als dritte Möglichkeit kommt die Benutzung der RMI (Remote Method
Invocation) Schnittstelle in Frage. Vorteile: Elegant, weil keine Requests/Responses
sondern nur Methodenaufrufe benutzt werden und Objektorientiert. Das Servlet
kann Methoden des Applets aufrufen. Funktioniert auch durch Firewalls (aber
noch nicht so gut). Nachteile: Kompliziert zu programmieren, da spezielle
stub und skeleton Klassen notwendig sind. Außerdem ist eine RMI-naming
registry notwendig, um Referenzen auf die Objekte zu bekommen. Nicht alle
Browser unterstützen defaultmäßig RMI (Stand Ende 98). Außerdem
kann das Servlet dann nur mit Java-Klienten interagieren.
Das MasterMind Spiel
In der Aufgabe werden wir uns mit einem Applet-Servlet Paar befassen, mit
dem man MasterMind spielen kann. Falls Ihr das Spiel nicht kennt wird es
deshalb hier kurz vorgestellt:
Ziel ist es einen nichtbekannten, fünfstelligen Zahlencode zu finden
(der Spielcode). Dazu kann man beliebig oft einen Spielcode-Kandidaten
eingeben. Als Antwort erhält man die Anzahl der Ziffern, die an richtiger
Stelle sind, und die Anzahl der Ziffern die im Spielcode enthalten sind,
aber an falscher Stelle sind. Hat man 5 Zahlen an richtiger Stelle, dann
hat man gewonnen.
Die Aufgabe
Die Rahmenprogramme findet Ihr hier.
Die benötigten Einstellungen (CLASSPATH, .jar-Dateien, benutzte Verzeichnisse) sind die
gleichen wie auf Blatt 7
(Abschnitt "Bevor Ihr beginnt").
Zu tun ist folgendes: Es gibt ein Applet welches eine einfache GUI für
ein MasterMind Spiel zur Verfügung stellt. Das Generieren der Spielcodes
und das Überprüfen der Spielcode-Kandidaten übernimmt ein
Servlet. Das Applet kommuniziert mit dem Servlet über ein einfaches
Kommunikationsprotokoll, um dessen Dienste zu benutzen. Die Nachrichten
des Protokolls werden vom Applet als Parameter an die Request gehängt
mit der das Servlet aufgerufen wird.
Eure Aufgabe ist es, das Protokoll auf der Seite des Servlets zu implementieren.
Im folgenden sind die zwei Nachrichten des Protokolls beschrieben, und
was für jede zu tun ist. Ein detaillierte Auflistung der notwendigen
Einzelschritte findet Ihr als Kommentare im Rahmenprogramm mmServlet.java,
welches Ihr auch bearbeiten sollt.
Nachricht 1: Parameter "action" mit Wert "code":
- In diesem Fall soll das Servlet eine neue Session erstellen
(falls noch keine für diesen Kommunikationspartner erzeugt wurde).
Es soll einen neuen Spielcode erzeugen (mit createCode()) und
diesen in die Session schreiben. Außerdem soll es die Anzahl der
gemachten Spielzüge (Versuche) auf 0 setzen und in die Session schreiben.
Nachricht 2: Parameter "action" mit Wert "validate" und Parameter "code"
mit Wert: ein möglicher Code (Code-Kandidat).
In dem Fall soll das Servlet:
- den Spielcode aus der Session holen.
- den Code-Kandidaten aus dem Request-Parameter "code" holen.
- die Anzahl der gemachten Versuche aus der Session holen, um eins erhöhen
und wieder in die Session schreiben.
- Spielcode und Code-Kandidaten vergleichen und das Ergebnis an das Servlet
zurückschicken. Das Ergebnis hat folgendes Format: "<Anzahl_gemachte_spielzüge>,<Zahlen
an richtiger Stelle>,<Zahlen im Code, aber an falscher Stelle">. Für
den Vergleich die mitgelieferte Methode validateCode(..., ...)
benutzen.
Zusätzlich müßt Ihr:
- Das Package Eures Servlets anpassen (aufgaben.userID)
- Das Applet mmApplet.java anpassen, so daß Euer Servlet aufgerufen
wird (Datei mmApplet.java, String SERVLET_LOC)
- Möglicherweise die Seite mmind.html anpassen, so daß Euer Applet
aufgerufen wird.
- Die entsprechenden Dateien in Eure Verzeichnisse legen. Html Datei, Applet
und HttpMessage .class Dateien in das html Verzeichnis und das Servlet
ins Servlet-Verzeichnis.
Tips:
- Die einfachste Art den Wert der Parameter aus der Request zu lesen (ist
aber deprecated) ist die Methode request.getParameter(parameter_Name), welche
ein Object zurückgibt (typecast notwendig).
- Um das Servlet zu testen müßt Ihr das mitgelieferte Applet benutzen.
Vorher cookies im Browser aktivieren !!
- Zum debugen könnt Ihr nach System.err schreiben und dann im Verzeichnis
/usr/opt/IBMWebAS/logs in der Datei jvm_IRGENDWAS nachschauen (auf dem Rechner helga).
Die Strings noch mit Euer userID markieren, weil alle Servlets dort reinschreiben,
und dann am besten grep benutzen.
Hinweise
Bearbeitungszeitraum: Die Woche vom 17.1 bis 23.1
Abgabe: Die .java Datei des Servlets per Mail an
<volanaki ÄT informatik.uni-tuebingen.de> schicken.
Betreuung: Am Montag den 17.1 und am Donnerstag den 20.1 von
9-11 Uhr im Raum 023 (TI-Pool) auf dem Sand. Falls Probleme auftauchen
könnt Ihr mir natürlich auch eine Mail schicken (s.o.).
Links auf Dokumentation:
Nützliche technische Dokumentation:
Servlet und JSP API
com.sun.server.http.HttpService{Request,Response} API
Java 1.1.x API
Falls Ihr noch mehr Informationen über Servlet/JSP Programmierung benötigt
könnt Ihr im folgenden Dokument nachschauen:
WebSphere Application Server Guide, v. 1.0: Kapitel 3, Servlet Programmierung
|