servlet上的全局变量。所有会话都是全局的,还是只针对当前会话?

时间:2014-06-28 17:24:57

标签: java session servlets

我需要在应用程序运行时共享信息;如果我有:

public class example extends HttpServlet
{
    Object globalObject;

    doGet...
    doPost....
}

用户通过服务器和对象globalObject使用aplication;如果其他用户使用该应用程序,将与第一个用户共享该对象?

5 个答案:

答案 0 :(得分:2)

  

用户通过服务器和对象globalObject使用aplication;如果其他用户使用该应用程序,将与第一个用户共享该对象?

是!不同的线程可能会用于为不同的用户呈现请求,但使用相同的servlet实例。所以变量对所有请求都是通用的。事实上,这就是为什么说我们不应该有全局变量to ensure thread safety

答案 1 :(得分:1)

servlet处理的所有请求都将使用相同的变量实例。 Servlet不是线程安全的,因为只创建了一个servlet实例。

这将导致两个用户使用globalObject的相同实例。

答案 2 :(得分:1)

使用HttpSession,您的变量将与每个用户会话相关,而不是与应用程序本身相关

您可以按照以下方式执行此操作

ServletContext application = getServletConfig().getServletContext();  

String data = "test";  
application.setAttribute("variable", data);  

String data_rtrvd= (String) application.getAttribute("variable"); 

您可以执行JSP代码:

<jsp:useBean id="obj" class="my.package.name.MyClass" scope="application" />

答案 3 :(得分:1)

这取决于应用程序服务器如何分配servlet。

如果您的应用程序服务器只分配一个servlet实例,那么所有请求都将共享对全局变量的访问权限,您必须考虑设计中的那个(除非您选择实现已弃用的SingleThreadModel接口,将保证,虽然所有请求都可以访问全局变量,但它们不会同时访问它。不要这样做。找另一种方式)。

如果您的应用程序服务器分配了多个servlet实例,则答案是“不一定”。

显然,您经常被屏蔽掉服务器的决定(关于是否实例化多个实例),因此您必须设计安全性。

答案 4 :(得分:1)

一般来说,线程是单身,所以你的问题的答案是肯定的。但是,如果要在不同用户之间共享数据,则应使用真正的Singleton实现。还要考虑并发性,因为你肯定会有许多线程同时执行(服务器收到的每个请求都有一个)