将变量存储在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上下文将在这些情况下幸免。