2009-07-26 6 views
20

Quelle est la différence (le cas échéant) entre le stockage d'une variable dans le ServletContext et son simple appartenance à un membre public statique de l'une des classes?Portée du contexte de servlet par rapport à la variable globale

Au lieu d'écrire:

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

Pourquoi ne pas avoir simplement:

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

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

(Ignorer les problèmes de concurrence, s'il vous plaît, cela est juste un exemple stupide)

D'après ce que je peux dire , ces deux options se comportent de la même manière sous Tomcat. Y a-t-il quelque chose de mieux à propos de l'utilisation de la première option?

Répondre

17

Le conteneur Web connaît votre contexte de servlet, mais pas vos variables statiques skaffman says qui sont privées à votre chargeur de classe. Tout ce qui provoque le traitement de deux demandes différentes par une instance d'application dans un chargeur de classe différent (redémarrage du serveur, redéploiement d'applications Web ou serveurs multi-nœuds) risque d'entraîner la casse de votre logique. Le contexte de servlet survivra à ces choses car le conteneur Web le sait et peut le sérialiser ou avoir un référentiel commun.

14

Eh bien, ils ne sont pas tout à fait la même chose; servlet-context-scope est privé à la webapp, tandis que la portée statique est privée au classloader. Selon votre conteneur et la façon dont il est configuré, ils peuvent être identiques ou non. Quand on pense en termes de webapps et de JavaEE, l'utilisation d'un champ contextuel sera plus fiable. De plus, les attributs contextuels sont plus faciles d'accès depuis les pages JSP, c'est-à-dire que vous n'avez pas besoin de scriptlets pour y accéder.

+0

pouvons-nous stocker de manière permanente la valeur dans pour un nom particulier, de sorte que l'accès suivant à ce paramètre donnera la valeur mise à jour, c'est-à-dire appel suivant de getServletContext(). GetInitParameters ("name"); donnera la valeur mise à jour qui a été faite par le dernier programme? – Ars

Questions connexes