About Me About MeProjects ProjectsPhotos PhotosSitemap Sitemap
  About Me > C/S Praktikum 99: Servlets > Aufgaben, Blatt 8

 

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.

  1. 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.
  2. 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.
  3. 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 (html)hier. Die benötigten Einstellungen (CLASSPATH, .jar-Dateien, benutzte Verzeichnisse) sind die gleichen wie auf (html)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:

  1. den Spielcode aus der Session holen.
  2. den Code-Kandidaten aus dem Request-Parameter "code" holen.
  3. die Anzahl der gemachten Versuche aus der Session holen, um eins erhöhen und wieder in die Session schreiben.
  4. 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:

  1. Das Package Eures Servlets anpassen (aufgaben.userID)
  2. Das Applet mmApplet.java anpassen, so daß Euer Servlet aufgerufen wird (Datei mmApplet.java, String SERVLET_LOC)
  3. Möglicherweise die Seite mmind.html anpassen, so daß Euer Applet aufgerufen wird.
  4. 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:

  1. 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).
  2. Um das Servlet zu testen müßt Ihr das mitgelieferte Applet benutzen. Vorher cookies im Browser aktivieren !!
  3. 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:

(html)Servlet und JSP API
(html)com.sun.server.http.HttpService{Request,Response} API
(html)Java 1.1.x API

Falls Ihr noch mehr Informationen über Servlet/JSP Programmierung benötigt könnt Ihr im folgenden Dokument nachschauen:

(html)WebSphere Application Server Guide, v. 1.0: Kapitel 3, Servlet Programmierung