Eine wichtige Eigenschaft von Webseiten ist die Integration von interaktiven Komponenten. Web-Dokumente enthalten dadurch nicht nur statische, sondern auch dynamische Informationen. Diese Dynamik bezieht sich nicht nur auf das Layout, sondern auch auf die in Dokumenten enthaltene Information. CGI-Skripte und Java-Servlets sind Möglichkeiten, Web-Dokumente um dynamische Inhalte anzureichern. Sowohl CGI-Skripte als auch Java-Servlets nehmen Anfragen von Clients entgegen, bearbeiten sie, und liefern dynamisch erzeugte HTML_Dokumente als Ergebnis zurück. Eigenschaften von Servlets Die Funktionalität von Webservern kann mit Hilfe von Servlets erweitert werden. Servlets sind in Java geschriebene Server_Komponenten, die es ermöglichen, einen Webserver dynamisch zu erweitern. Dynamisch bedeutet hierbei, dass während des Betriebs des Servers sowohl Dienste zur Funktionalität des Servers hinzugefügt als auch entfernt werden können. Servlets verfügen im Gegensatz zu Applets nicht über eine GUI-Komponente und werden daher auch als faceless bezeichnet. Ebenso wie bei Applets, für die der Browser zur Ausführung eine Java-VM (JVM) zur Verfügung stellen muss, muss der Server über eine VM verfügen und das Application Programming Interface (API) von Servlets unterstützen, um diese ausführen zu können. Servlets besitzen im Gegensatz zu Applets je nach Einsatzzweck Zugriffsmöglichkeiten auf Dateisysteme und Netzwerkressourcen. Ebenso wie das Swing-API stellt das Servlet-API eine Standarderweiterung des Java-APIs dar, das den Entwicklern Klassen und Schnittstellen zur Programmierung von Servlets zur Verfügung stellt. Ein Servlet arbeitet nach dem Black-Box-Prinzip (siehe Abb. 13-1). Hierbei existieren fest definierte Ein- und Ausgabeströme, die beim Aufruf des Servlets angesprochen werden. Abb. 13.1: Black-Box-Arbeitsweise eines Servlets Einsatz von Servlets Die Hauptnutzung von Servlets liegt im Empfang, in der Verarbeitung und in der Versendung von Daten. Servlets lassen sich grundsätzlich für Aufgaben einsetzen, die auf dem Abfrage-Antwort-Paradigma (Request Response Paradigm) beruhen. Servlets können sowohl auf Dateien und Datenbanken zugreifen, als auch mit den Java-Programmen auf der Client-Seite kommunizieren. Hierdurch wird es möglich, Netzwerkzugriffe, die durch Applets aufgrund von Sicherheitsmaßnahmen nicht durchführbar sind, mit Servlets zu realisieren. Des Weiteren können Servlets die Rückgabewerte von HTML-Formularen auswerten und dynamische HTML-Seiten generieren. Abb. 13.2: Einsatzmöglichkeiten von Servlets Die wichtigsten Verwendungsarten von Servlets sind im Folgenden dargestellt. Ein Servlet kann Daten verarbeiten, die über das Secure Hypertext Transfer Protocol (HTTP-S) übertragen werden, bspw. Kreditkarteninformation aus einem HTML-Formular. Da über Servlets mehrere Abfragen gleichzeitig bearbeitet werden können, ist es möglich, die Abfragen untereinander zu synchronisieren, bspw. zur Realisierung einer Online-Konferenz, an der mehrere Clients beteiligt sind. Servlets können miteinander kommunizieren, auch wenn sie sich auf verschiedenen Servern (und auch verschiedenen Plattformen) befinden. Zum Zweck der Aufgabenteilung kann eine Zusammenarbeit verschiedener Servlets definiert werden. Hierbei werden bei Überlastsituationen einzelner Rechner Abfragen an andere Server weitergeleitet, bspw. um die Belastung von untereinander gleichwertigen Servern auszugleichen oder um als zentraler Anlaufpunkt für verteilte Ressourcen zu dienen. Wenn einmal eine Verbindung zwischen einem Client und einem Server aufgebaut ist (bspw. durch das HTTP-Protokoll), können der Client und das Servlet über eine neue Verbindung mit einem frei wählbaren Protokoll miteinander kommunizieren. Eine Servlet-Implementierung aktiver Agenten (Active Agents oder Roaming Agents) kann realisiert werden, wenn der Server dynamische Code-Erweiterungen akzeptiert und Java-Bytecode während seiner Laufzeit laden kann. Aktive Agenten stellen ein Programmstück dar, das als Skript oder ausführbarer Code über ein Netzwerk auf einen entfernten Rechner geladen und dort ausgeführt wird. Die Anwendungsmöglichkeiten von Servlets sind vielfältig und reichen von Online-Shopping und Datenbankzugriffen bis hin zu Online-Konferenzsystemen. Einbindung von Servlets Ein Applet wird durch das Applet-Tag in ein HTML-Dokument eingebunden. Die Einbindung von Servlets kann mittels einer der folgenden Methoden erfolgen: Server Side Include (SSI) Hierbei wird das Servlet in einer HTML-Seite mit dem Servlet-Tag aufgerufen. Es sei hier angemerkt, dass das Ergebnis mit der Methode getOutputStream() und nicht mit der Methode getWriter() gelesen werden muss. <servlet name=ServletName code=ServletCode.class> <param name=param1 value=Wert1> <param name=param2 value=Wert2> Ersatztext, Falls gewünscht </servlet> Direkte Adressierung innerhalb eines Browsers über die URL in der Form: http://<JavaServer>/Servlets/<ServletKlassenName> Adressierung in einem Applet über eine HTTP-Verbindung durch die Verwendung der Klassen java.net.URLConnection und java.net.URL. Aufrufen eines Servlets innerhalb eines anderen Servlets, indem die folgenden Methodenaufrufe verwendet werden: getServletConfig().getServletContext().getServlet("Servl etName"); Servlet-Engines Ähnlich wie bei einem Applet, bei dem eine VM auf dem Client (Browser) installiert sein muss, um das Applet laufen lassen zu können, muss bei Servlets eine Server-seitige VM auf dem Server installiert werden, um dort Servlets starten zu können. Zusätzlich muss der Server das API der Java-Servlets (siehe Kapitel 13.3) unterstützen. Das API der Java-Servlets ist als ein Standarderweiterungs-API (Standard Extension API) konzipiert und beinhaltet eine Menge an Klassen und Methoden, mittels derer Daten vom Server geladen, bzw. zum Server gesendet werden können. Meist wird dieses API den Herstellern von Webservern als Zusatz zum Server angeboten. Neben dem Java-Webserver, der von der Firma Sun direkt angeboten wird, implementiert der Referenz-Server des W3-Konsortiums, Jigsaw, das Servlet-API. Des Weiteren können viele der in der Praxis eingesetzten (nicht auf Java basierenden) HTTP-Server, insbesondere Apache, Netscape Enterprise und Microsoft IIS, inzwischen ebenfalls eine Implementierung von Java-Servlets vorweisen.
Anbiete r | Implementierung | URL
Sun | Java-Webserver | http://www.sun.com/software/jwebserver /index.html
Sun | Sun-Webserver | http://www.sun.com/webserver
Apache | Apache-Webserver | http://java.apache.org
Acme | Acme-Webserver | http://www.acme.com/java/software/
IBM | VisualAge-Webrunner-Toolkit | http://www.software.ibm.com/ad/webrun ner/
W3C | W3C-Jigsaw | http://www.w3.org/Jigsaw/
Lotus | Domino-Go-Webserver | http://www.software.ibm.com/webserver s/dgw/
Zeus | Zeus-Webserver | http://www.zeustech.net

Tab. 13.1: Auswahl von Webservern, die Servlets unterstützen Übersetzung, Installation und Testen von Servlets Das Java Servlet Development Kit (JSDK) beinhaltet eine sog. Servlet-Engine, um entwickelte Servlets testen zu können. Sowohl das Package javax.servlet als auch die entsprechende Spezifikation und Dokumentation können kostenlos vom Webserver der Firma JavaSoft bezogen werden (http://java.sun.com/products/servlet/). Nach der Installation des JSDK-Packages muss die Variable CLASSPATH derart modifiziert werden, dass der Eintrag jsdk.jar eingefügt wird. Die Übersetzung eines Servlets gleicht der einer Java-Anwendung bzw. der eines Applets und erfolgt durch den Aufruf: javac ServletName.java Nachdem ein Servlet implementiert und erfolgreich übersetzt ist, kann es mit dem im JSDK-Package enthaltenen Programm servletrunner getestet werden. Das Dienstprogramm servletrunner ist ein Multithread-fähiger Prozess, der Anfragen an Servlets bearbeiten kann. Die Fähigkeit des Multithreading erlaubt es dem Programm, mehrere Servlets parallel ablaufen zu lassen, sowie den Aufruf eines Servlets innerhalb eines anderen Servlets durchzuführen. Es ist zu beachten, dass servletrunner eine neu verfügbare Version des zu testenden Servlets nicht automatisch lädt. Aus diesem Grund muss bei jeder Änderung im Programm-Code das getestete Servlet beendet und neu gestartet werden. Aufruf von Servletrunner servletrunner befindet sich im Verzeichnis <jsdk>/bin, wobei jsdk das Hauptverzeichnis des Java Servlet Development Kits (JDK) bezeichnet. Zum Starten des Programms muss die Variable PATH gesetzt werden: setenv PATH /usr/local/jsdk/bin: (für UNIX) C> set PATH=C:\jsdk\bin;%PATH% (für Win32) Um servletrunner benutzen zu können, kann man sich mit der Option -help die Möglichkeiten anzeigen lassen, die servletrunner bietet: servletrunner -help Das Resultat dieses Aufrufs ist in Abb. 13-3 dargestellt. Abb. 13.3: Ergebnis des Aufrufs von servletrunner -help Die Standardwerte dieser Parameter erhält man, wenn man servletrunner ohne Argument aufruft. Für JSDK in der Version 2.0 unter Windows sind diese Werte in Abb. 13-4 dargestellt. Abb. 13.4: Standardwerte des Programms servletrunner Servlet-Properties Das Programm servletrunner bietet eine einfache Möglichkeit, Servlets zu testen und der Allgemeinheit zur Verfügung zu stellen. Diese Möglichkeit wird durch sog. Properties (Eigenschaften) realisiert. Eigenschaften werden dazu verwendet, um ein Servlet zu initialisieren, zu konfigurieren und zu starten. Servlet-Eigenschaften werden immer in Form von Wertepaaren angegeben, die aus dem Namen einer Eigenschaft und aus deren Wert bestehen. Ein Servlet wird durch maximal zwei Eigenschaftseinträge gekennzeichnet. Diese Einträge stellen den Code eines Servlets und dessen Anfangswerte dar: servlet.name.code servlet.name.initargs Code-Eigenschaft Die Eigenschaft Code legt ein Kürzel fest, durch das ein Servlet angesprochen werden kann. Als Wert dieser Eigenschaft wird der Aufrufname des Servlets mit vollständiger Angabe des Package-Namens verwendet. So stellt bspw. der folgende Aufruf eine Servlet-Eigenschaft dar, deren Code meinServlet und deren Wert openjava.HalloServlet ist: servlet.meinServlet.code = openjava.HalloServlet Der Aufruf von meinServlet entspricht somit dem Aufruf von openjava.HalloServlet. initArgs-Eigenschaft Die Eigenschaft initArgs beinhaltet alle Parameter, die notwendig sind, um ein Servlet zu initialisieren. Die Syntax hierfür lautet wie folgt: servlet.meinServlet.initArgs =\ resultsDir = servlets/tmp Mehrere Eingaben werden durch eine Kombination aus Komma und Backslash (,\) getrennt: servlet.meinServlet.initArgs =\ resultsDir = servlets/tmp,\ password=mein_password,\ Property-Dateien Die Eigenschaften eines Servlets werden in einer Textdatei abgespeichert. Diese Datei hat den Namen servlet.properties und wird beim Start von servletrunner automatisch eingelesen. Wie in Abb. 13-3 dargestellt wird, besteht auch die Möglichkeit, servletrunner mit einer anderen Property-Datei zu starten, indem die Option -s verwendet wird. Ein Beispiel einer Property-Datei ist nachfolgend angegeben: # Hier sind die Kommentare. # Dies ist ein Beispiel. # Festlegen des Servlets servlet.meinServlet.code = openjava.HalloServlet # Festlegen der Eigenschaften dieses Servlets servlet.meinServlet.initArgs =\ resultsDir = servlets/tmp,\ password=mein_password,\