java - ejemplo - contexto organizacional iso 9001
Alcance del contexto del servlet frente a la variable global (2)
Bueno, no son exactamente lo mismo; servlet-context-scope es privado para la aplicación web, mientras que el alcance estático es privado para el cargador de clases. Dependiendo de su contenedor y cómo está configurado, estos pueden ser o no iguales. Al pensar en términos de webapps y JavaEE, usar un campo contextual será más confiablemente portátil. Además, los atributos basados en el contexto son más fáciles de acceder desde los JSP, es decir, no necesita scriptlets para acceder a ellos.
¿Qué (si hay) es la diferencia entre almacenar una variable en ServletContext y simplemente tenerla como miembro público estático de una de las clases?
En lugar de escribir:
// simplified (!)
int counter = (Integer)getServletContext().getAttribute("counter");
counter++;
this.getServletContext().setAttribute("counter", counter);
Por qué no solo tener:
// in class MyServlet
public static int counter = 0;
// in a method somewhere
MyServlet.counter++;
(Ignore los problemas de concurrencia, por favor, esto es solo un tonto ejemplo)
Por lo que puedo decir, estas dos opciones se comportan de la misma manera bajo Tomcat. ¿Hay algo mejor sobre usar la primera opción?
El contenedor web conoce su contexto de servlet, pero no sobre sus variables estáticas que, como dice skaffman, son privadas para su cargador de clases.
Cualquier cosa que provoque que dos solicitudes diferentes sean atendidas por una instancia de aplicación en un cargador de clases diferente (esto podría ser el reinicio del servidor, la redistribución de la aplicación web o los servidores multinodo) dañará su lógica. El contexto servlet sobrevivirá a estas cosas ya que el contenedor web lo conoce y puede serializarlo o tener un repositorio común.