Servlet上下文范围与全局变量

什么(如果有的话)是在ServletContext中存储变量和将其作为其中一个类的公共静态成员之间的区别?

而不是写:

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

为什么不只是:

 // in class MyServlet public static int counter = 0; // in a method somewhere MyServlet.counter++; 

(请忽略并发问题,这只是一个愚蠢的例子)

据我所知,这两个选项在Tomcat下的行为方式相同。 使用第一个选项有什么好处吗?

Web容器知道您的servlet上下文,但不知道您的静态变量,正如skaffman所说的那样是您的类加载器的私有变量。

任何导致两个不同请求由不同类加载器中的应用程序实例(可能是服务器重新启动,Web应用程序重新部署或多节点服务器)提供服务的东西都会使您的逻辑中断。 当Web容器知道它并可以序列化它或拥有一个公共存储库时,servlet上下文将在这些东西中存活下来。

嗯,他们不一样; servlet-context-scope对于webapp是私有的,而静态作用域对于类加载器是私有的。 根据您的容器及其配置方式,这些可能相同也可能不同。 在考虑webapps和JavaEE时,使用上下文加速字段将更可靠地移植。 此外,更容易从JSP访问上下文范围的属性,即您不需要scriptlet来访问它们。