2010-10-28 12 views
5

Ich habe eine Klasse public class GAE_SERVLETREQUESTServlet extends HttpServlet {Sollte ein Servlet-Container eine neue javax.servlet.http.HttpServlet-Instanz für jede eingehende Anfrage erstellen?

nicht sicher, was die Spezifikation sagt über das Recycling der HttpServlet: Sollten die Servlet-Container auf jeder eingehenden Anforderung neue Instanz dieser Klasse erstellen oder können die Implementierung Wiederverwendung Klassen zwischen den Anforderungen?

Ich untersuche ein lustiges Problem, bei dem es scheint, dass eine Map, die auf der GAE_SERVLETREQUESTServlet-Instanz erstellt wurde, den Status zwischen Anforderungen beibehält.

+0

Ist die Map als Instanzvariable definiert? – JoseK

+0

@JoseK: Ja, geschützt (nicht statisch). –

+1

Related: http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC

Antwort

11

Für den allgemeinen Fall - nicht ausgeschüttete, multi-threaded, ist sichergestellt, dass es nur eine Instanz des Servlets sein wird. Von der Servlet 3.0-Spezifikation:

2,1 Anforderungsverarbeitung Methoden

Die grundlegende Servlet-Schnittstelle eine Service-Methode für den Umgang mit Client-Anforderungen definiert. Diese Methode wird für jede Anforderung aufgerufen, die der Servlet-Container an eine Instanz eines Servlets weiterleitet. Die Verarbeitung von gleichzeitigen Anforderungen an eine Webanwendung erfordert im Allgemeinen, dass die Webentwickler-Designservlets mehrere Threads verarbeiten können, die die Servicemethode zu einem bestimmten Zeitpunkt innerhalb von ausführen. Im Allgemeinen behandelt der Web-Container gleichzeitige Anforderungen an das gleiche Servlet durch gleichzeitige Ausführung der Service-Methode auf verschiedenen Threads durch .

2.2 Anzahl der Instanzen

Die Servlet Erklärung, die entweder über die Anmerkung wird, wie in Kapitel 8, beschrieben „Annotationen und Steckbarkeit“ oder einen Teil des Deployment Descriptor der Web Anwendung die Servlet enthält, Wie in Kapitel 14, "Deployment Deskriptor" beschrieben, wird gesteuert, wie der Servlet-Container Instanzen des Servlets bereitstellt. Für ein Servlet, das nicht in einer verteilten Umgebung gehostet wird (Standardeinstellung), muss der Servlet Container nur eine Instanz pro Servlet-Deklaration verwenden. Für ein Servlet , das die SingleThreadModel-Schnittstelle implementiert, kann der Servlet-Container jedoch mehrere Instanzen instanziieren, um eine schwere Anforderung zu verarbeiten und Anfragen an eine bestimmte Instanz zu serialisieren.

In dem Fall, dass ein Servlet als Teil einer Anwendung markiert in dem Deployment Descriptor als ausschüttungs bereitgestellt wurde, kann ein Behälter nur eine Instanz pro Servlet-Deklaration pro Java Virtual Machine (JVM ™) 1 hat. Wenn das Servlet in einer verteilbaren Anwendung jedoch die Schnittstelle SingleThreadModel implementiert, kann der Container mehrere Instanzen dieses Servlet in jeder JVM des Containers instanziieren.

0

Wenn Sie Daten speichern, die für jeden Benutzer relevant sind, sollten Sie sie in der HTTP-Sitzung speichern. Wie von skaffman angegeben, sollten Sie keine Daten in der Servlet-Klasse speichern, von denen Sie erwarten, dass sie für jeden Benutzer unterschiedlich sind. Hier ist ein kurzes Beispiel.

 

class MyServlet extends HttpServlet 
{ 
    private Object ThisIsTheWrongPlaceToStorePerUserData; 

    ... stuff ... doPut(HttpServletRequest httpRequest, ... more stuff ...) 
    { 
     Object iAmGood = new Object(); 
     HttpSession session = httpRequest.getSession(true); 

     session.setAttribute("GoodPlaceToStorePerUserData", iAmGood); 

     ... stuff ... 
    } 
} 
 
+0

Ich möchte das Objekt nicht in einer Sitzung speichern, weil ich keinen Grund habe, ein Cookie auf dem zu initiieren Benutzer, noch möchte ich serverseitige "pro Benutzer" Statusdaten speichern. Dies ist ein Backend-Service und das ist der ganze Grund, warum ich nach Alternativen suchte. Ich habe jetzt meinen Code korrigiert und es ist mir ehrlich gesagt ein bisschen peinlich, einen solchen Anfängerfehler gemacht zu haben :) –

Verwandte Themen