Servlets
Servlets sind Plug-Ins für Server. Sie sind das Gegenstück zu
den Applets auf der Client-Seite. Sie sind protokollunabhängig und
- da in Java geschrieben - plattformunabhängig.
Einsatzmöglichkeiten sind:
-
In ihrem ursprünglichen Gebrauch ersetzen Servlets CGI-Skripts.
-
Sie können mehrere Request verarbeiten und dadurch z.B. Online-Konferenzen
unterstützen.
-
Sie können einander aufrufen und Daten miteinander austauschen.
-
Sie können Verbindungen zu anderen Servern aufbauen und dadurch Arbeit
auf mehrere Rechner verteilen.
Vorteile der Servlets gegenüber CGI-Skripts sind:
-
Die Vorteile von Java.
-
Da ein Servlet für viele Requests nur einmal gestartet wird, ist der
Overhead wesentlich geringer. Dies führt zu einem beeindruckenden
Geschwindigkeitsvorteil.
-
Servlets können gemeinsame Daten benutzen.
Die Java Servlet API ist inzwischen eine Standard Java Extension API.
Das heißt, daß sie zwar zum Standard-Java gehört, aber
nicht Teil jedes Produkts mit Java-Label sein muß. Sie unterteilt
sich in javax.servlet.*
und javax.servlet.http.*.
Arten des Servlets-Aufrufs
-
Mapping
Wenn eine bestimmte URI nachgefragt wird, ruft der Server ein bestimmtes
Servlet auf.
-
Aufruf der Klasse
Die URI des Servlets wird nachgefragt. Die .class-Endung zur Identifikation
zu benutzen ist nicht empfehleswert, da dann keine anderen Klassen-Dateien
wie z.B. Applets heruntergeladen werden können.
-
Server-Side Includes
In der gefragten SHTML-Datei befindet sich ein <servlet>-Tag.
-
Servlet-Verzeichnis
Ein Alias zeigt auf ein Verzeichnis, in dem alle aufgerufenen Dateien
Servlets sind. Dies ist die Methode, die von dem JSDK (Java Servlet Development
Kit) von Sun benutzt und auch von dem folgenden Beispiel implementiert
wird.
Beispiel eines Aufrufs:
http://www.test.de/servlet/SnoopServlet/projekt?text=abcd
Aufgerufen wird das Servlet mit der Klasse "SnoopServlet.class" mit der
PATH_INFO "projekt" und dem Query-String "text=abcd".
Das Servlet-Interface
Grundlage aller Servlets ist das Interface javax.servlet.Servlet
mit fünf Methoden:
public abstract void init(ServletConfig config) throws ServletException
public abstract void service(ServletRequest req, ServletResponse
res)
throws ServletException,
IOException
public abstract void destroy()
public abstract String getServletInfo()
public abstract ServletConfig getServletConfig()
Die Methoden init und destroy werden jeweils nur einmal
beim Laden bzw. Entladen des Servlets aufgerufen. Für jede Anfrage
wird service aufgerufen. Das Servlet zeigt dem Server an, daß
es mit der Beantwortung eines Requests fertig ist, indem es den OutputStream
schließt.
Das Weltbild des Servlets
-
javax.servlet.ServletConfig
Dieses Interface ermöglicht den Zugriff auf Initialisierungs-Parameter
und den ServletContext.
public abstract Enumeration getInitParameterNames()
public abstract String getInitParameter(String name)
public abstract ServletContext getServletContext()
-
javax.servlet.ServletContext
Dieses Interface stellt dem Servlet Informationen und Funktionen
des Servers zur Verfügung.
public abstract void log(String msg)
public abstract String getRealPath(String path)
public abstract String getMimeType(String file)
public abstract String getServerInfo()
public abstract Object getAttribute(String name)
public abstract Servlet getServlet(String name) throws ServletException
public abstract Enumeration getServlets()
-
javax.servlet.ServletRequest
Hier gibt es Methoden deren Rückgabe-Werte den meisten CGI-Umgebungs-Variablen
entsprechen.
Der InputStream wird zurückgegeben von:
public abstract ServletInputStream getInputStream() throws IOException
Dieses Interface ist (noch) nicht protokollspezifisch.
-
javax.servlet.ServletResponse
Von diesem Interface wird die Antwort aufgenommen:
public abstract void setContentLength(int len)
public abstract void setContentType(String type)
public abstract ServletOutputStream getOutputStream() throws IOException
Dieses Interface ist (auch noch) nicht protokollspezifisch. Die Methode
getOutputStream() löst gegebenenfalls das Senden eines Headers
aus.
javax.servlet-Klassen
Das javax.servlet.http
In diesem Packet befinden sich protokollspezifische Interfaces und Klassen:
-
javax.servlet.http.HttpServletRequest
-
javax.servlet.http.HttpServletResponse
-
javax.servlet.http.HttpServlet
In diesem Servlet werden die Anfragen nach Methoden verteilt:
protected void doGet(HttpServletRequest req,
HttpServletResponse resp) throws ServletException,
IOException
protected void doPost(HttpServletRequest req,
HttpServletResponse resp) throws ServletException,
IOException
protected long getLastModified(HttpServletRequest req)
Es wird der Status-Code auf BAD_REQUEST gesetzt oder -1 zurückgegeben.
Die service-Methode wird nur überschrieben wenn andere
HTTP-Methoden implementiert werden sollen.
-
javax.servlet.http.HttpUtils
Diese Klasse besitzt drei hilfreiche statische Methoden:
public static Hashtable parseQueryString(String s)
public static Hashtable parsePostData(int len, ServletInputStream
in)
public static StringBuffer getRequestURL(HttpServletRequest req)
Beispiel: ServletHttp
Quellen:
-
Dateien von java.sun.com:
-
Kris Jamsa / Suleiman Lalani / Steve Weakley: WEB Programmierung