java - Servlet 上下文范围与全局变量

标签 java tomcat servlets

在 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/

相关文章:

linux - 在 Windows 中编译的 Java 可以在 Linux 中运行吗?

java - 我需要查看上传的图片的正确路径是什么?

java - Web 应用程序 [ROOT] 仍在处理尚未完成的请求。 [ Tomcat ]

java - Apache POI - 使用 XSSFWorkbok + servlet 响应

java - Spring数据-根据先前的插入插入数据

java - System.out.println( number1 + "score"+ (number1 + number2) + number1 ) 结果解释(字符串与数字加法运算符)

authentication - Jenkins - j_acegi_security_check

java - 如何列出不同 Java Web 应用程序的 Web 文件夹中的文件

java - 如何使用 App Engine 获取静态 URL

java - Android 应用的 Google 访问 token 服务器端验证