17.18 Das erste Servlet compilieren und ausführen   Wir kommen nun noch einmal auf unser Eingangsbeispiel für ein Servlet zurück, welches eine einfache Ausgabe erzeugt.
Listing 17.20 FirstServlet.java
import java.io.*;
import javax.servlet.*;
public class FirstServlet extends GenericServlet
{
public void service( ServletRequest request,
ServletResponse response )
throws ServletException, IOException
{
PrintWriter out = response.getWriter();
out.println ( "'Chr! Schnarch! Razong! Chr! Chr! Rapüh!'"+
" (Disneys beste Comics, Band 5, S. 218)");
}
}
Alle Servlets implementieren die Schnittstelle javax.servlet.Servlet. Die Klasse GenericServlet implementiert diese Methoden und stellt uns eine einfache Klasse bereit, von der wir erben können. Verlangt der Client vom Web-Server ein Servlet, so bildet der Servlet-Container ein Exemplar der Servlet-Klasse (in unserem Fall FirstServlet) und ruft nach der Initialisierung auf dem Objekt die Methode service() auf. Sie nimmt zwei Argumente an: ein ServletRequest- und ein ServletResponse-Objekt.
Über request lassen sich alle Anfrageparameter erfragen. In der Unterklasse HTTPServlet-Request kommen zusätzlich Formularwerte oder ein HTTP-Anfragetyp dazu.
Mit response schicken wir die Daten, die zum Web-Client zurückgehen, wie HTTP-Response (200, 404), Antwort-Header (Content-Type, Set-Cookie) zurück. Aber am Wichtigsten ist die Methode getWriter(), die uns eine Referenz auf ein Writer-Objekt liefert, damit wir die HTML-Elemente für die Seite abschicken. (Vorsicht! Ein 'System .' vor dem out ist diesmal nicht nötig - dieser Fehler schleicht sich schon mal ein.) Für Binärdaten können wir uns auch einen normalen 'OutputStream ' besorgen, damit wir zum Beispiel Bilder schicken können.
Hinweis So gut wie alle Servlets erweitern die Unterklasse HttpServlet von GenericServlet Ein HttpServlet enthält wichtige Arbeitsfunktionen für das Protokoll HTTP. Eine Erweiterung von GenericServlet ist eher unüblich, es sei denn, Nicht-HTTP-Protokolle wie FTP werden angeboten.
|
17.18.1 Servlets compilieren  
Um Servlets zu übersetzen, muss das Jar-Archiv servlet.jar im Pfad haben. Dazu können wir entweder den CLASSPATH anpassen oder das Archiv einfach in das jre/lib/ext-Verzeichnis des Java 2 SDKs kopieren.so dass Das Archiv liegt bei Tomcat im Ordner common/lib bei.1 Bei der Enterprise-Version von Java (J2EE) ist die Bibliothek schon im Pfad eingebunden.
Tipp Das Einbinden der Tomcat-Version von servlet.jar lohnt sich dennoch, da sich die Servlet-API und -Implementierung öfters ändert und bei der J2EE nicht unbedingt die neueste Version integriert sein muss.
|
Servlet neu starten
Wenn wir das Servlet ändern und neu compilieren, dann reicht es aus, den Inhalt im Browser zu aktualisieren (F5 im Internet Explorer). Ein vernünftiger Container sollte dann die Klasse automatisch neu laden. Was aber auf den ersten Blick so einfach aussieht, ist beim genaueren Hinsehen schon etwas komplizierter. Denn es ist nicht damit getan, nur Veränderungen zu überwachen. Das Problem ist, dass der Servlet-Container die geladenen Klassen wieder freigeben und neu laden muss.
Wer das automatische Neuladen vermeiden möchte, der muss bei Tomcat in der Konfigurationsdatei conf/server.xml den Eintrag reloadable="true" auf false setzen. Dadurch ergibt sich ein Geschwindigkeitsvorteil, da nicht vor jedem Starten geprüft werden muss, ob sich das Servlet geändert hat.
17.18.2 Wohin mit dem Servlet? 
Das Übersetzen eines Servlets ist das kleinste Problem. Die Veröffentlichung macht da viel mehr Kopfschmerzen; wir benötigen einen Ort, an dem das Servlet abgelegt wird. Damit wir nicht erst lange in den Konfigurationsdateien editieren müssen, legen wir unser FirstServlet.class in das Verzeichnis, in dem auch die anderen Test-Servlets von Tomcat liegen. Sie sind dort mit Quellcode abgelegt und laden direkt zum Betrachten ein. Das Verzeichnis ist:
<jakarta-tomcat-Pfad>\webapps\examples\WEB-INF\classes
Um nun den Server zur Ausführung unseres FirstServlets zu bewegen, machen wir die Pfadangabe nicht in der URL, sondern wir schreiben:
http://localhost:8080/examples/servlet/FirstServlet
Diese Übersetzung der URL-Anfrage in die entsprechende Klasse nennt sich Servlet-Mapping und wird vom Servlet-Container übernommen. Nach der Servlet-Spezifikation lautet die URL pfad/servlet/klassenname. Der Server in der Testinstallation nimmt nur die Angabe examples zur Unterscheidung hinzu. Wo nun die Klassendateien wirklich liegen, ist ganz unterschiedlich. Das definiert eine Konfigurationsdatei.
1Im Java-SDK 1.2 Beta waren die Klassen enthalten, doch sie wurden in der Finalversion wieder entfernt.
|