2010-10-28 8 views
5

Ho una classe public class GAE_SERVLETREQUESTServlet extends HttpServlet {Un contenitore di servlet dovrebbe creare una nuova istanza javax.servlet.http.HttpServlet per ogni richiesta in entrata?

Non sei sicuro di quello che dice la specifica sul riciclaggio del HttpServlet: Se il contenitore di servlet creare nuova istanza di questa classe su ogni richiesta in arrivo oppure possono le classi di implementazione di riutilizzo tra le richieste?

Sto esaminando un problema divertente in cui sembra che una mappa creata nell'istanza GAE_SERVLETREQUESTServlet mantenga lo stato tra le richieste.

+0

La mappa è definita come variabile di istanza? – JoseK

+0

@JoseK: Sì, protetto (non statico). –

+1

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

risposta

11

Per il caso generale - non distribuita, multi-threaded, è garantito che ci sarà solo un'istanza del servlet. Dal Servlet 3.0 specifica:

2,1 Richiesta metodi di gestione

L'interfaccia di base Servlet definisce un metodo di servizio per la gestione delle richieste dei client. Questo metodo viene chiamato per ogni richiesta che il contenitore servlet instrada su un'istanza di un servlet. La gestione di richieste simultanee a un'applicazione Web richiede in genere che i servlet di progettazione Web che possono gestire più thread in esecuzione all'interno di il metodo di servizio in un determinato momento. Generalmente il contenitore Web gestisce le richieste simultanee allo stesso servlet tramite l'esecuzione simultanea del metodo di servizio su thread diversi tramite .

2.2 Numero di istanze

La dichiarazione servlet che è o tramite l'annotazione, come descritto nel capitolo 8, “Annotazioni e innestabilità” o parte del descrittore di deployment dell'applicazione Web contenente il servlet, come descritto nel Capitolo 14, "Descrittore Descriptor", controlla come il servlet container fornisce istanze del servlet. Per un servlet non ospitato in un ambiente distribuito (impostazione predefinita), il contenitore servlet deve utilizzare solo un'istanza per la dichiarazione servlet. Tuttavia, per un servlet che implementa l'interfaccia SingleThreadModel, il contenitore servlet può istanziare più istanze per gestire un carico di richieste pesanti e serializzare le richieste in una particolare istanza.

Nel caso in cui un servlet stato distribuito come parte di un'applicazione marcata nel descrittore distribuzione come distribuibile, un contenitore può avere una sola istanza per dichiarazione servlet per Java Virtual Machine (JVM ™) 1. Tuttavia, se il servlet in un'applicazione distribuibile implementa l'interfaccia SingleThreadModel, il contenitore può creare istanze multiple di quel servlet in ogni JVM del contenitore.

0

Se si salvano dati rilevanti per ciascun utente, è necessario memorizzarli nella sessione HTTP. Come affermato da skaffman, non archiviare i dati nella classe servlet che si prevede siano diversi per ciascun utente. Ecco un rapido esempio.

 

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

Non voglio archiviare l'oggetto in una sessione perché non ho motivo di avviare un cookie sul utente, né voglio memorizzare dati di stato "per utente" lato server. Questo è un servizio di back-end e questa è l'intera ragione per cui ho iniziato a cercare alternative. Ho corretto il mio codice ora e sinceramente sono un po 'imbarazzato per aver commesso un errore da principiante :) –

Problemi correlati