Java Servlet上下文范围与全局变量

Java Servlet上下文范围与全局变量,java,tomcat,servlets,Java,Tomcat,Servlets,在ServletContext中存储变量和将其作为其中一个类的公共静态成员之间有什么区别(如果有的话) 而不是写: // simplified (!) int counter = (Integer)getServletContext().getAttribute("counter"); counter++; this.getServletContext().setAttribute("counter", counter); 为什么不干脆: // in class MyServlet publi

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

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

web容器知道您的servlet上下文,但不知道您的静态变量,它们是类加载器的私有变量


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

我们是否可以将特定名称的值永久存储在中,以便下次访问该参数时将给出更新的值,即下一次调用getServletContext().getInitParameters(“名称”);将给出上一个程序完成的更新值?