Servlet上下文范围与全局变量

时间:2009-07-26 13:10:58

标签: java tomcat servlets

在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下的行为方式相同。使用第一个选项有什么好处吗?

2 个答案:

答案 0 :(得分:17)

Web容器知道您的servlet上下文,但不知道您的类加载器是skaffman says专用的静态变量。

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

答案 1 :(得分:15)

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