2009-07-26 1 views
20

Was ist der Unterschied zwischen dem Speichern einer Variablen im ServletContext und dem bloßen Speichern als statisches Mitglied einer der Klassen?Servlet-Kontext und globale Variable

Statt zu schreiben:

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

Warum nicht einfach haben:

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

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

(Concurrency Probleme ignorieren, bitte, das ist nur ein stummes Beispiel)

Von dem, was ich sagen kann, Diese beiden Optionen verhalten sich unter Tomcat auf die gleiche Weise. Gibt es etwas besseres über die erste Option?

Antwort

17

Der Web-Container kennt Ihren Servlet-Kontext, aber nicht Ihre statischen Variablen, die als skaffman says für Ihren Classloader reserviert sind.

Alles, was dazu führt, dass zwei unterschiedliche Anforderungen von einer Anwendungsinstanz in einem anderen Klassenlader bedient werden (dies kann ein Serverneustart, eine Neuverteilung von Webanwendungen oder Server mit mehreren Knoten sein), wird Ihre Logik unterbrechen. Der Servlet-Kontext wird diese Dinge überleben, da der Web-Container davon weiß und sie serialisieren oder ein gemeinsames Repository haben kann.

14

Nun, sie sind nicht ganz gleich; servlet-context-scope ist für die Webanwendung privat, während der statische Bereich für den Klassenlader privat ist. Abhängig von Ihrem Container und seiner Konfiguration können diese identisch sein oder auch nicht. Wenn Sie in Bezug auf Webapps und JavaEE denken, wird die Verwendung eines kontextbehafteten Feldes zuverlässiger tragbar sein. Auf kontextabhängige Attribute kann auch von JSPs aus leichter zugegriffen werden, d. H. Sie benötigen keine Skriptlets, um an sie zu gelangen.

+0

können wir den Wert in für einen bestimmten Namen dauerhaft speichern, sodass der nächste Zugriff auf diesen Parameter den aktualisierten Wert ergibt, d. H. Nächsten Aufruf von getServletContext(). GetInitParameters ("name"); gibt den aktualisierten Wert, der vom letzten Programm gemacht wurde? – Ars