Servlet
Willemers Informatik-Ecke
Ein Servlet ist ein Java-Programm, das die Klasse HttpServlet erweitert und in einem Applikationsserver läuft. Der Applikationsserver stellt die Netzwerkumgebung zur Verfügung und ruft das Servlet auf, wenn dessen Adresse von außen angetragen wird.

Ein Servlet ist in der Lage, ein HTML-Formular auszuwerten.

Für die Entwicklung wird eine spezielle Laufzeit- und Entwicklungsumgebung eingerichtet. Danach kann in Eclipse auf folgendem Weg ein Projekt erzeugt werden.

Ein HTML-Formular

Durch einen Rechtsklick auf das Projekt kann eine HTML-Datei generiert werden. Dazu wird im Menü New...|HTML File ausgewählt. In diesem HTML-Dokument wird ein einfaches Formular eingesetzt, das drei Eingabefelder und einen Submit-Button aufnimmt.
<html>
<head>
</head>
<body>
<form action=Insert method=get>
<table>
<tr><td>ID (Kürzel)</td><td> <input type=text name=id value="" size=30></td></tr>
<tr><td>Klarname</td><td> <input type=text name=klarname value="" size=30></td></tr>
<tr><td>E-Mail</td><td> <input type=text name=email value="" size=30></td></tr>
<tr><td><input type=submit value="Einfügen"></td><td> </td></tr>
</table>
</form>
</body>
</html>
Bei Anklicken des Submit-Buttons wird die Aktion Insert aufgerufen. Dahinter steckt nun ein Servlet.

Das Servlet

Sie klicken das Projekt wiederum an und erzeugen über den Menüpfad New...|Servlet einen Dialog. Der Name des Servlets soll Insert lauten.

Eclipse erzeugt einen Rahmen für ein Servlet, den wir hier erweitern. Insbesondere wird die Methode doGet() überschrieben, da diese aufgerufen wird, weil das Formular oben die Methode get verwendet.

Die Methode doGet hat zwei Parameter:

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Insert")
public class Insert extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Insert() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().println("<table>");
        // Hole alle Parameterbezeichner
        Enumeration<String> controls = request.getParameterNames();
        while (controls.hasMoreElements()) {
            String controlName = controls.nextElement();
            // Zeige den Parameterbezeichner
            response.getWriter().println("<tr><td>" + controlName);
            // Zeige den eingegeben Wert
            response.getWriter().println("</td><td>" + request.getParameter(controlName) + "</td></tr>");
        }
        response.getWriter().println("</table>");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
Die Methode doGet() liest zunächst die Namen aller Kontrollelemente des aufrufenden Formulars aus, um daraus eine Tabelle der Kontrollelemente und ihrer Inhalte zu erstellen.

Der Parameter request

Der Parameter request von der Klasse HttpServletRequest liefert verschiedene Informationen.

Die Parameter eines FORM

Die Attribute und die Weiterleitung

Daten können in Attributen des Parameters request abgelegt werden. Damit stehen sie anderen Servlets oder Java Server Pages zur Verfügung.
String strName;
// ...
request.setAttribute("name", strName);
Für die Weiterleitung an eine JSP-Seite kann durch folgenden Aufruf erfolgen:
RequestDispatcher dispatch = request.getRequestDispatcher("anzeige.jsp");
dispatch.forward(request, response);
Damit wird die Anfrage des Clients intern an die Seite anzeige.jsp umgeleitet. Diese kann nun das Attribut mit der folgenden Anweisung wieder auslesen:
String str = request.getAttribute("name");

Weitere Methoden des Request-Parameters

String str = request.getHeader("User-Agent");

Cookie[] cookies = request.getCookies();

HttpSession session = request.getSession();

InputStream in = request.getInputStream();

Der Parameter response

Der Parameter response von der Klasse HttpServletResponse erlaubt den Zugriff auf die HTTP-Antwort des Servers.

Ausgabe an den Client

Über den Aufruf von getWriter des Objekts response erhalten Sie ein Objekt der Klasse PrintWriter. Darüber können Sie mit print und println schreiben, wie Sie es von System.out gewohnt sind. Auf diese Weise kann HTML-Source an den Browser geschickt werden, der den Unterschied zu einer normalen Website nicht merken wird.

PrintWriter writer = response.getWriter();
writer.print("\n...
...
Wenn der Umfang der HTML-Ausgabe größer wird, ist es sinnvoller, auf eine Java Server Page-Seite umzuleiten.

Sollen binäre Daten an den Client versandt werden, liefert die Methode getOutputStream einen ServletOutputStream, über dessen Methode write Binärdaten an den Client gesant werden können.

ServletOutputStream os = response.getOutputStream();
os.write(bytearray);

Umleiten auf eine andere Seite

response.sendRedirect(“ausgabe.jsp“)
Der Browser (also der Client) wird auf die Seite ausgabe.jsp umgelenkt. JSP-Dateien sind eigentlich verkappte Servlets. Sie sehen auf den ersten Blick aus wie HTML-Seiten, haben aber Java-Code eingebettet.

Natürlich lässt sich auch auf HTML-Seiten umleiten. Der Parameter von sendRedirect akzeptiert alle URLs, auch die von anderen Servern.

Headerveränderungen

Mit setHeader und addHeader lassen sich Einträge im Header festlegen oder hinzufügen.

ServletConfig

Die Methode init erhält als Parameter das Objekt der Klasse ServletConfig, das vom Application Server für das Servlet angefertigt wurde. Es enthält Informationen aus der Konfigurationsdatei web.xml, die Eclipse freundlicherweise automatisch erstellt hat.

Lebenszyklus

Das Servlet wird zu verschiedenen Gelegenheiten gerufen. Wenn Sie davon etwas mitbekommen wollen, überschreiben Sie dessen Methoden. Die davon abgeleitete Klasse HttpServlet hat dann auch die Methoden doGet, doPost, doDelete, doPut oder doHead zu bieten. Dabei interessiert sich das Servlet üblicherweise nur für doGet und doPost. Statt also service von Servlet zu überschreiben, sollten Sie lieber doGet oder doPost überschreiben. Diese laufen darüber hinaus in einem separaten Thread für jeden Request.