Inhalt
|
2. Java Servlets
|
4. Headers
|
Das Hypertext Transfer Protocol unterscheidet verschiedene Arten von Methoden:
GET fordert bestimmte Informationen an oder führt Skripts aus
PUT speichert Daten an der angegebenen Adresse
HEAD erfüllt dieselbe Funktion wie GET, der Server sendet aber nur Headers und Statuscodes
POST überträgt Beiträge an Newsgroups oder fügt Dateien in Verzeichnisse ein
DELETE löscht bestimmte Informationen, die angegebene Adresse ist nach erfolgreicher Ausführung für zukünftige Anfragen ungültig
OPTIONS erfragt Optionen der Kommunikation und Fähigkeiten des Servers
TRACE dient der Fehlersuche, es werden einfach die Request Headers zurückgeschickt
Ausgangspunkt ist ein Programm, welches das Interface
Servlet implementiert. Servlets werden hauptsächlich
für Webserver eingesetzt und erweitern zu diesem Zweck die
abstrakte Klasse HttpServlet. In der Umgebung eines
Servers beispielsweise für Mail oder Dateitransfer wird die Klasse
direkt oder indirekt von GenericServlet abgeleitet.
Wenn der Benutzer eine Adresse eingibt oder einer Verknüpfung
folgt, erzeugt der Browser eine Anfrage mittels GET, zu
deren Behandlung die Methode doGet überschrieben
werden muss. Ihr wird ein HttpServletRequest Objekt
übergeben, das genauere Daten des Clients enthält. Der zweite
Parameter vom Typ HttpServletResponse erlaubt die
Spezifikation von Statuscodes beziehungsweise Headern und stellt einen
PrintWriter zur Verfügung, um Informationen zum
Benutzer zurückzuschicken. Die Implementierung sollte wiederholbar
und frei von Seiteneffekten sein. Wenn die Anfrage nicht behandelt
werden kann, wirft die Methode eine ServletException.
Im Gegensatz dazu erlaubt die Aktion POST des Protokolls
die Übertragung von Formulardaten beliebiger Länge. Statt
doGet wird dann doPost aufgerufen, die
Behandlung des Requests erfolgt analog. Diese Methode darf aber
gespeicherte Daten verändern und muss nicht unbedingt wiederholbar
sein.
Die Beantwortung von Abfragen in Abhängigkeit von Benutzereingaben war einer der Hauptbeweggründe für dynamische Webseiten. Daten aus einem Formular werden entweder direkt im Anschluss an die Internetadresse hinter einem Fragezeichen oder separat an den Server übertragen.
Im Vergleich zu traditionellen Skriptsprachen ist der Zugriff auf
diese Informationen im Servlet relativ einfach, weil die Klasse
HttpServletRequest die Art der Datenübertragung vor
dem Programmierer verbirgt. Die Methode getParameterNames
liefert eine Enumeration der Namen aller Parameter der
Anfrage in unspezifizierter Reihenfolge. Einen bestimmten Wert als
Zeichenkette erhält man durch Aufruf von getParameter,
falls keine Übereinstimmung existiert, wird null
zurückgegeben. Mehrere Werte desselben Parameters stellt
getParameterValues in einem Array bereit.
Bevor ein Servlet zum Einsatz kommt, muss es vom lokalen System oder aus dem Netzwerk geladen und instanziiert werden. Diese Aufgabe übernimmt die sogenannte Servlet Engine, eine Erweiterung des Webservers für die Behandlung von Servlets. Sie bietet Netzwerkdienste, empfängt Anfragen und führt Servlet Container aus. Das Servlet wird in Abhängigkeit von der Konfiguration entweder bereits beim Starten des Servers oder beim ersten Request erzeugt.
Zu diesem Zeitpunkt wird einmal die Methode init
aufgerufen, aber nicht mehr bei zukünftigen Anfragen. Dadurch hat
das Servlet die Möglichkeit, sich selbst zu konfigurieren,
persistente Daten zu lesen, Datenbankverbindungen aufzubauen oder
Referenzen auf andere Ressourcen herzustellen. Dem Programmierer stehen
zwei Varianten für die Initialisierung zur Verfügung. Wenn das
Servlet keine serverspezifischen Einstellungen lesen muss, wird die
Methode ohne Parameter überschrieben. Der zweiten Version wird ein
ServletConfig Objekt übergeben, das Informationen
über Datenbankeinstellungen, Passwortdateien und Leistungsparameter
enthält.
Sobald der Server einen Request für ein Servlet empfängt,
startet er einen neuen Thread und ruft die Methode service
auf, die je nach Typ der Anfrage die Bearbeitung an doGet,
doPost, doPut, doDelete,
doOptions oder doTrace delegiert. Sind
GET und POST in gleicher Weise zu behandeln,
sollte aus Gründen der Erweiterbarkeit nicht die Methode
service überschrieben werden, sondern doPut
die Methode doGet aufrufen oder umgekehrt. OPTIONS
und TRACE werden automatisch unterstützt. Es gibt keine
doHead Methode, weil das System Statuszeile und Einstellungen
von doGet benutzt, um HEAD Requests zu
beantworten.
Der Server muss das Servlet nicht für eine bestimmte
Zeitdauer im Speicher halten, sondern kann es bei Bedarf freigeben,
beispielsweise wenn die Engine beendet wird oder Ressourcen
benötigt, das Servlet für längere Zeit nicht benutzt oder
explizit vom Systemadministrator entfernt wird. Werte von
Klassenvariablen und Attributen gehen dabei verloren. Bevor das Objekt
zerstört werden darf, muss die Bearbeitung aller Anfragen
abgeschlossen sein. Dann wird die Methode destroy
aufgerufen, die dem Servlet die Möglichkeit gibt,
Datenbankverbindungen zu schließen, Hintergrundthreads abzubrechen
oder Cookies zu schreiben. Anschließend darf die Engine keine
Requests mehr an das Servlet weiterleiten.
Wenn der Server schließlich keine Referenz mehr auf das Servlet hält, kann der Speicher vom Garbage Collector aufgeräumt werden.

Abbildung 2: Lebenszyklus eines Servlets
Weil die Installation eines Webservers viel Aufwand mit sich bringt, liegt
dem Development Kit in der Version 2.0 ein kleines Programm nur zum Testen
der geschriebenen Servlets bei. Es kann mehrere Threads gleichzeitig
ausführen und auch Servlets testen, die andere Servlets aufrufen. Startet
man das Programm mit dem Parameter -help, werden Syntax und
mögliche Optionen angezeigt.
Usage: servletrunner [options]
Options:
-p port the port number to listen on
-b backlog the listen backlog
-m max maximum number of connection handlers
-t timeout connection timeout in milliseconds
-d dir servlet directory
-r root document root directory
-s filename servlet property file name
-v verbose output
Einstellungen für Konfiguration, Erzeugung und Initialisierung der Servlets werden in einer bestimmten Textdatei eingetragen. Sobald das Tool läuft, können Servlets im Browser entweder direkt durch Eingabe der Adresse oder von einem Formular aus aufgerufen werden. Damit Änderungen am Servlet wirksam werden, muss das Programm neu gestartet werden.