Inhalt | 6. Anwendungsbeispiel | 8. Bewertung |
Der Response eines Webservers besteht in der Regel aus einer
Statuszeile, einem oder mehreren Headern, einer Leerzeile und dem
Dokument. In der Klasse HttpServletResponse
sind eine Menge
von Konstanten für die Statuszeile definiert, die der Methode
setStatus
übergeben werden können.
Die Statuscodes werden in fünf Kategorien eingeteilt. Werte von 100 bis 199 informieren, dass der Client mit einer anderen Aktion antworten soll. Bei erfolgreicher Ausführung wird ein Code zwischen 200 und 299 zurückgegeben. Ein Wert von 300 bis 399 zeigt verschobene Dateien an. Ein Code zwischen 400 und 499 repräsentiert einen Fehler des Clients, zwischen 500 und 599 einen Fehler des Servers.
Das Common Gateway Interface speichert Informationen über die
Anfrage in bestimmten Variablen. Von einem Servlet aus erhält man
diese Daten durch den Aufruf von Funktionen des Objekts
request
, das den Servicemethoden übergeben wird. Sie
geben Auskunft über Autorisationsschema, Anzahl der gesendeten
Bytes, Typ der Daten, Hauptverzeichnis des Dokuments und
Pfadinformationen, Adresse und Domäne des Clients, Art des Requests,
sowie Name, Port, Protokoll und Software des Servers.
Bei einem Cookie handelt es sich um eine kleine Menge textueller Informationen, die ein Webserver an den Browser schickt und beim nächsten Aufruf der Seite unverändert zurückerhält. Durch diesen Mechanismus können Einstellungen des Benutzers auf seiner Festplatte gespeichert werden. Cookies werden zur Personalisierung von Webseiten, Identifikation eines Benutzers während einer Sitzung und gezielte Werbeannoncen verwendet.
Zunächst erzeugt das Servlet eine Instanz der Klasse
Cookie
. Name und Wert sind bereits dem Konstruktor als
Zeichenkette zu übergeben, können aber später durch die
Methoden setName
und setValue
geändert
werden. Zur Angabe optionaler Attribute wie Kommentar, Pfad, maximales
Alter und Versionsnummer enthält die Klasse entsprechende
Prozeduren. Im Normalfall schickt der Browser ein Cookie nur an den
Server zurück, von dem es erzeugt wurde. Eine Gruppe anderer Hosts,
die ebenfalls Zugriff darauf haben sollen, kann mit der Methode
setDomain
festgelegt werden.
Cookies werden mit der Methode addCookie
von
HttpServletResponse
in einen Anwortheader eingefügt
und an den Client geschickt. Später liefert getCookies
der Klasse HttpServletRequest
ein Array aller in der
Anfrage enthaltenen Cookies zurück, deren Namen, Werte und
Attribute durch Zugriffsmethoden abgefragt werden können.
Jedesmal, wenn der Client eine Webseite benötigt, wird eine neue Verbindung zum Server aufgebaut. Es ist aus diesem Grund schwierig, Informationen für die gesamte Dauer einer Sitzung zu halten. Beim Online Shopping müssen aber beispielsweise einzelne Bestellungen im virtuellen Einkaufswagen bis zur endgültigen Bestätigung aufbewahrt werden.
Der wohl verbreitetste Lösungsansatz speichert Daten der
aktuellen Sitzung in Cookies. Als Alternative hängt der Client
Zeichen zur Identifikation der Sitzung am Ende der Internetadresse an,
die der Server mit von ihm gespeicherten Informationen verbindet. Beim
Einsatz dynamisch generierter Seiten können in versteckten
Formularfeldern Namen und Werte untergebracht werden, die beim
Abschicken in den GET
beziehungsweise POST
Requests enthalten sind.
Den Entwicklern von Servlets steht die Session Tracking API zur
Verfügung, die von diesen Mechanismen abstrahiert. Beim Aufruf der
Methode getSession
von HttpServletRequest
extrahiert das System aus einem Cookie oder der Internetadresse einen
Schlüssel zur Identifikation des Clients und sucht damit aus einer
Tabelle das zugehörige, am Server lebende HttpSession
Objekt. Wenn der Benutzer noch nicht an einer Sitzung teilnimmt, liefert
die Methode in Abhängigkeit des booleschen Parameters entweder
null
oder ein neu erzeugtes Objekt zurück. Die Methode
setAttribute
dieses Objekts verbindet Informationen in Form
von Namen und Werten mit dieser Sitzung, frühere Ausprägungen
werden ersetzt. Mittels removeAttribute
kann das Servlet
Werte ersatzlos entfernen. Die Methode getAttributeNames
liefert die Namen aller Attribute der aktuellen Sitzung. Zum Auslesen
eines konkreten Wertes wird der Methode getAttribute
der
gewünschte Name übergeben.
Wenn die mit setMaxInactiveInterval
festgelegte Zeit in
Sekunden zwischen zwei Zugriffen des Clients verstrichen ist, wird die
Sitzung beendet. Davon werden alle Objekte informiert, die das Interface
HttpSessionBindingListener
implementieren und entsprechend
registriert waren. Durch Aufruf der Methode invalidate
kann
das Servlet die Sitzung auch explizit deaktivieren.
Die Fehlersuche erweist sich als mühsam, weil Servlets nicht direkt startbar sind. Bei der Ausführung durch einen Request ist es schwierig, Breakpoints zu setzen oder Messages und Traces zu lesen. Es gibt jedoch eine Reihe bewährter Strategien, um mögliche Probleme aufzudecken.
Fehler können entweder in den Daten der Anfrage, bei deren
Verarbeitung oder in der Antwort liegen. Diese Bereiche müssen
getrennt betrachtet werden. Über Probleme im Servlet sollte der
Benutzer durch eine einfache Seite oder unter Verwendung der Methode
sendError
von HttpServletResponse
informiert
werden. Startet man den Server von der Kommandozeile aus, erscheinen
alle Ausgaben im selben Fenster, die vielleicht eine Einengung des
Zeitpunkts und der Ursache eines Fehlers ermöglichen. Die Methode
log
der Klasse HttpServlet
schreibt
Einträge in die Logdatei des Servers, die später zum Debugging
herangezogen werden kann. Wenn Änderungen am Servlet nicht sofort
wirksam werden, muss eventuell der Webserver neu gestartet werden.
Häufig sind die Fehler aber auch im Quellcode der Webseite zu
finden, für dessen Validierung Tools erhältlich sind.