Servlet上下文范围与全局变量

its*_*dok 20 java tomcat servlets

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

而不是写:

// simplified (!)
int counter = (Integer)getServletContext().getAttribute("counter");
counter++;
this.getServletContext().setAttribute("counter", counter);
Run Code Online (Sandbox Code Playgroud)

为什么不只是:

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

// in a method somewhere
MyServlet.counter++;
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*sen 17

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

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


ska*_*man 15

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