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.