一尘不染

Servlet上下文范围与全局变量

tomcat

将变量存储在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下的行为相同。使用第一个选项有什么更好的选择吗?


阅读 515

收藏
2020-06-16

共1个答案

一尘不染

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

导致不同类加载器中的应用程序实例满足两个不同请求的任何事情(这可能是服务器重新启动,Web应用程序重新部署或多节点服务器)都会使您的逻辑中断。当Web容器知道它并可以序列化它或具有一个公共存储库时,servlet上下文将在这些情况下幸免。

2020-06-16