【问题标题】:Servlet context scope vs global variableServlet 上下文范围与全局变量
【发布时间】:2010-11-14 03:34:03
【问题描述】:

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

【问题讨论】:

    标签: java tomcat servlets


    【解决方案1】:

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

    任何导致不同类加载器中的应用程序实例处理两个不同请求的情况(这可能是服务器重新启动、Web 应用程序重新部署或多节点服务器)都会使您的逻辑中断。 servlet 上下文将在这些事情中继续存在,因为 Web 容器知道它并可以对其进行序列化或拥有一个公共存储库。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我们能否将特定名称的值永久存储在 中,以便下次访问该参数将给出更新的值,即下一次调用 getServletContext().getInitParameters("name" );会给出上一个程序完成的更新值吗?
      猜你喜欢
      • 2016-11-13
      • 2014-02-22
      • 2012-04-29
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多