Inhalt 2. Java Servlets 4. Headers

3.   Grundlagen

3.1   Requests

Das Hypertext Transfer Protocol unterscheidet verschiedene Arten von Methoden:

3.2   Struktur eines Servlets

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.

3.3   Formulardaten

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.

3.4   Lebenszyklus

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.

Lebenszyklus eines Servlets

Abbildung 2: Lebenszyklus eines Servlets

3.5   Servlet Runner

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.

4. Headers