servlet 上的全局变量。对所有会话是全局的,还是仅对当前会话? [复制]

Posted

技术标签:

【中文标题】servlet 上的全局变量。对所有会话是全局的,还是仅对当前会话? [复制]【英文标题】:Global variable on servlet. is global for all sessions, or only for the current session? [duplicate] 【发布时间】:2014-08-19 14:13:39 【问题描述】:

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

public class example extends HttpServlet

    Object globalObject;

    doGet...
    doPost....

用户正在通过服务器和对象 globalObject 使用应用程序;如果另一个用户使用该应用程序,是否会与第一个用户共享该对象?

【问题讨论】:

感谢您的回答。我问这个是因为我需要提交一个表单并将其临时保存,以便用户稍后提交另一个表单,然后在数据库中保存 2 个表单;有什么建议吗? 在 Servlet 中使用实例变量并不是这样做的方法。在请求中收到表单时,将表单存储在临时表中。当临时表中有两个表单时,调用存储过程进行处理并将两个表单存储在正确的表中。 【参考方案1】:

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

【讨论】:

【参考方案2】:

这取决于您的应用服务器如何分配 servlet。

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

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

显然,服务器的决策(关于是否实例化多个实例)常常让您无法做出决定,因此您必须进行安全设计。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

用户正在通过服务器和对象 globalObject 使用应用程序;如果另一个用户使用该应用程序,是否会与第一个用户共享对象?

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

【讨论】:

【参考方案5】:

使用 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" />

【讨论】:

以上是关于servlet 上的全局变量。对所有会话是全局的,还是仅对当前会话? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Linux环境变量

Linux环境变量

PL/SQL - 全局变量并非在所有会话中都可用

CentOS中环境变量和配置文件

SQL进阶17-变量的声明/使用(输出)--全局变量/会话变量--用户变量/局部变量

Mysql变量简介