Servlet 上下文范围与全局变量

2022-09-02 01:09:12

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


答案 1

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

任何导致两个不同请求由不同类装入器中的应用程序实例提供服务(这可能是服务器重新启动、Web 应用程序重新部署或多节点服务器)的情况都会导致逻辑中断。Servlet 上下文将保留这些东西,因为 Web 容器知道它,并且可以序列化它或具有公共存储库。


答案 2

好吧,它们并不完全相同;servlet-context-scope 是 webapp 的私有,而静态作用域是类装入器私有的。根据容器及其配置方式,这些可能相同,也可能不同。在考虑Web应用程序和JavaEE时,使用上下文应对字段将更加可靠地移植。此外,上下文范围的属性更容易从 JSP 访问,即您不需要 scriptlet 来访问它们。


推荐