Servlet-Tutorial #
Ich habe bereits die eine oder andere Webapplikation in Java erstellt. Allerdings habe ich dabei immer wieder auf meinen alten Projekten aufgebaut, diese kopiert und angepasst. Nun wurde es Zeit, mal von vorne anzufangen und dabei richtig zu dokumentieren, wie man eine eigene Applikation erstellt. Hilfreich war übrigens auch dieser Artikel: http://www.keyboardsamurais.de/mt/archives/000050.html.
Weitere Informationen (unter anderem auch eine schnellere Methode, echte Eclipse-Webprojekte zu erstellen, gibt es in dem Artikel WebAnwendungenMitEclipse.
Schnellstart #
Dabei möchte ich mich möglichst kurz halten, um eine erste laufende "Hello World"-Applikation zu erzeugen. Auf diesem Wege möchte ich dennoch erklären, worum es eigentlich geht.
Vorab zu installieren: #
Wir benötigen JavaUnterDebian, die EclipseIDE und TomcatUnterDebian. Auf diesen Seiten sollten genug Installationshinweise stehen.
Wie funktioniert der Tomcat? #
Zuerstmal eine grundlegende Beschreibung, damit man weiss, was man da eigentlich tut. Tomcat ist ein Webserver. Dieser Webserver kann nun Java-Applikationen ausführen. Dazu bietet er diesen eine standardisierte (nach der Servlet-Spezifikation) Umgebung als ein sog. Container. Die Applikation muss auch ganz bestimmte Ansprüche erfüllen (ebenfalls nach der Servlet Spezifikation).
Also nun von Anfang an: Wenn man den Tomcat startet, liest dieser eine Datei namens server.xml. Hier sind grundlegende Objekte definiert, die den Webserver betreffen. Unter anderem ist hier ein <Host> definiert, der ein Basisverzeichnis für alle Applikationen definiert. Dies ist normalerweise webapps (soll heissen /var/lib/tomcat4/webapps). Hier kann man jetzt seine Web-Applikationen einfach hineinwerfen.
Wie sieht eine Applikation aus? #
Für den Anfang sind nur ein paar Dinge wichtig: Man erzeugt ein Verzeichnis. In diesem können nun *.html-Dateien liegen. Diese werden angezeigt - Fertig! Ich denke, man kann auch einfach Dateien mit der Endung *.jsp einfügen und damit Java Server Pages benutzen (eine Art PHP für Java). Die echten Profis wollen aber natürlich ein eigenes Servlet schreiben. Dazu erstellt man ein Verzeichnis WEB-INF. Dieses bekommt eine Datei web.xml, die eine URL (die man später im Browser eingibt) einem Servlet zuordnet und dieses einer Java-Klasse, die die eigentliche Servlet-Klasse ist. Eine web.xml für den Anfang kann so aussehen:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app>
<display-name>Test-Applikation</display-name> <description> Winzige Test-Applikation. </description>
<servlet> <servlet-name>test</servlet-name> <description> test </description>
<servlet-class>de.bayen.TomcatTest</servlet-class>
</servlet>
<servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test/*</url-pattern> </servlet-mapping>
</web-app>
Nun brauchen wir noch ein Verzeichnis WEB-INF/classes, in das wir unsere Klassen schreiben und WEB-INF/lib, in das Bibliotheken kommen. Das eigentliche Servlet ist dann eine Klasse und kann z.B. so aussehen:
package de.bayen; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // public class TomcatTest extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.println("Hello, world!"); out.close(); } }
Erstellung in Eclipse #
Wie man sieht, ist obiges keine Hexerei. Wie geht man nun in Eclipse am sinnvollsten vor? Bei der Erstellung eines neuen Projektes kann man angeben, wo die übersetzten Klassendateien hingeschrieben werden sollen. Hier steht normalerweise bin. Dies ändert man in WEB-INF/classes. Dann kopiert man die Bibliothek Servlet.jar in das Vrzeichnis "/lib". Diese muss man in Eclipse in den Classpath einfügen (in den Projekt Properties). Natürlich muss man auch ggf. andere Bibliotheken in WEB-INF/lib in Eclipse in den Classpath einbinden. Der Tomcat findet sie dort automatisch.
einbinden unserer Applikation #
Entweder wir kopieren unser Projektverzeichnis in das webapps-Verzeichnis des Tomcat oder - was noch eleganter ist - wir sagen dem Tomcat, wo er unsere Applikation findet. Dazu kommt folgender Eintrag in den bestehenden <Host>-Eintrag hinein:
<Context path="/test" docBase="/home/tbayen/workspace/tomcattest" debug="1" reloadable="true"> </Context>
Zu beachten ist, daß wir jetzt wiederum ein "test" vor die URL schieben, d.h. unser Servlet findet sich nun unter http://localhost:8180/test/test. Nun sollte der Tomcat übrigens auch von selber merken, wenn wir in Eclipse etwas geändert haben und die Klassen ggf. neu laden.
Man kann nun ausgehend vom Mini-Servlet eine größere Applikation erstellen. Voila!
Links ins Web#
schlanke Alternativen zum Tomcat sind