2009-07-26 16 views
20

Che cosa (se presente) è la differenza tra la memorizzazione di una variabile nel ServletContext e il fatto di averlo come membro statico pubblico di una delle classi?Ambito contesto servlet vs variabile globale

Invece di scrivere:

// simplified (!) 
int counter = (Integer)getServletContext().getAttribute("counter"); 
counter++; 
this.getServletContext().setAttribute("counter", counter); 

Perché non basta avere:

// in class MyServlet 
public static int counter = 0; 

// in a method somewhere 
MyServlet.counter++; 

(ignorare problemi di concorrenza, per favore, questo è solo un esempio stupido)

Da quello che posso dire , queste due opzioni si comportano allo stesso modo in Tomcat. C'è qualcosa di meglio nell'usare la prima opzione?

risposta

17

Il contenitore Web conosce il contesto del servlet, ma non le variabili statiche che come skaffman says sono private per il classloader.

Tutto ciò che causa due richieste diverse di essere fornite da un'istanza dell'applicazione in un classloader diverso (questo potrebbe essere il riavvio del server, la ridistribuzione dell'applicazione Web o server multi-nodo) farà sì che la logica si interrompa. Il contesto servlet sopravviverà a queste cose mentre il contenitore web lo sa e può serializzarlo o avere un repository comune.

14

Beh, non sono proprio la stessa cosa; servlet-context-scope è privato per la webapp, mentre l'ambito statico è privato per il classloader. A seconda del contenitore e del modo in cui è configurato, questi possono o meno essere uguali. Quando si pensa in termini di applicazioni web e JavaEE, l'utilizzo di un campo contestato dal contesto sarà più affidabile. Inoltre, gli attributi con ambito contestuale sono più facili da accedere da JSP, cioè non è necessario disporre di scriptlet per raggiungerli.

+0

possiamo memorizzare permanentemente il valore in per un nome particolare, in modo che l'accesso successivo a quel parametro fornisca il valore aggiornato, ad esempio la prossima chiamata di getServletContext(). GetInitParameters ("nome"); fornirà il valore aggiornato che è stato fatto dall'ultimo programma? – Ars