home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Der Servlet Life Cycle

Die Instanz eines Servlets wird vom Container für viele (parallele) Anfragen genutzt. Damit unterscheidet sich die Servlet-Technologie von CGI-Programmen, welche für jede Anfrage einen eigenen Prozess starten und damit weniger ressourcenschonend als Servlets.

init()-Methode

Die init-Methode wird vom Container einmal (pro Servlet-Instanz) aufgerufen. In der Konfigurationsdatei (web.xml) kann entschieden werden, ob dies bei Starten des Containers oder erst bei der ersten Anfrage geschehen soll. Dort kann man auch weitere Initialisierungsparameter setzen, die vom Servlet ausgelesen werden können, wie den Namen einer Datenbank.

Die init-Methode nutzt man, um "Arbeiten" durchzuführen, die nur einmalig getan werden müssen, beispielsweise eine Datenbankverbindung anzulegen. Allerdings kann der Container bei hoher Last mehrere Servletinstanzen erzeugen. Damit würden dann mehrere Datenbankverbindungen geöffnet, was möglicherweise nicht gewünscht ist.

Weiterhin sei empfohlen entweder die init-Methode ohne Übergabeparameter zu nutzen oder beim Überschreiben der init(ServletConfig config) auch super(config) aufzurufen.

service()-Methode und Thread-Sicherheit

Im Gegensatz zur init-Methode wird die service-Methode (bzw. die doXXX()-Methoden) bei jeder Anfrage aufgerufen. Sobald sie abgearbeitet ist, kehrt das Servlet wieder in den Bereitschaftszustand zurück.

Es empfiehlt sich bei HTTP-Anfragen nicht service(), sondern die spezifischeren Methoden doGet() oder doPost() zu implementieren. Damit erreicht man eine höhere Sicherheit, weil nicht unerwartete PUT oder DELETE Anfragen bearbeitet werden.

Da ein Servlet mehreren Request dient, muss es zustandslos implementiert werden. Das folgende Beispiel würde diese Forderung nicht erfüllen und könnte zu unerwünschten Effekten führen:

 

public class MyServlet extends HttpServlet {
 private String name = null;
 
 public void doGet(HttpServletRequest req, HttpServletResponse res) {
  name = req.getParameter("name");
  doSomething(req); //slow method
  PrintWriter writer = res.getWriter();
  res.write("<html><body>The name is  " + name + "</body></html>");
 }
}

 

In einem HttpServletRequest enthält einen Parameter "name" der am Ende wieder zurückgegeben werden soll. Während ein erster Request in der Methode doSomething() bearbeitet wird, erreicht das Servlet ein zweiter Request mit einem anderen Namen. Dieser andere Name ändert die Instanzvariable. Kehrt nun der erste Request von der Methode doSomething() zurück, würde er den zweiten und nicht den erwarteten ersten Namen auf den Response schreiben.

destroy()-Methode

Am Ende des Lebenszyklus eines Servlets ruft der Container die destroy()-Methode auf - einmal pro Servlet-Instanz. Hier können die notwendigen "Aufräumarbeiten" erledigt werden. Typischerweise würde dies erfolgen, wenn der Servlet-Container heruntergefahren wird. Bei einem Absturz des Containers ist natürlich nicht sichergestellt, dass diese Methode noch aufgerufen wird.