在 ServletContext 中存储变量与仅将其作为其中一个类的公共(public)静态成员有什么区别(如果有)?
而不是写:
// 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 says对您的类加载器是私有(private)的。
任何导致不同类加载器中的应用程序实例处理两个不同请求的情况(这可能是服务器重新启动、Web 应用程序重新部署或多节点服务器)都会使您的逻辑中断。 servlet 上下文将在这些事情中继续存在,因为 Web 容器知道它并可以对其进行序列化或拥有一个公共(public)存储库。
关于java - Servlet 上下文范围与全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1184556/