JavaEE中类间共享变量

JavaEE中类间共享变量,java,jakarta-ee,static-variables,Java,Jakarta Ee,Static Variables,我正在开发一个Java Web应用程序,在共享变量方面遇到了一些问题。 据我所知,有两种方法: (1) 通过使用静态变量,每个类都可以访问给定的变量, (2) 通过使用setter和getter 每种方法我都有一个问题。对于第一个,所有用户(即使具有不同的会话ID)将共享相同的值。 对于第二种情况,通过getter访问会强制程序使用构造函数,在这种情况下,我们将丢失以前为当前用户获得的值 那么,任何人都可以向我解释如何只共享给定sessionId的信息吗 更明确地说: 我试图将模型与应用程序的视

我正在开发一个Java Web应用程序,在共享变量方面遇到了一些问题。 据我所知,有两种方法: (1) 通过使用静态变量,每个类都可以访问给定的变量, (2) 通过使用setter和getter

每种方法我都有一个问题。对于第一个,所有用户(即使具有不同的会话ID)将共享相同的值。 对于第二种情况,通过getter访问会强制程序使用构造函数,在这种情况下,我们将丢失以前为当前用户获得的值

那么,任何人都可以向我解释如何只共享给定sessionId的信息吗

更明确地说:

我试图将模型与应用程序的视图方面分开。因此,包模型将包含所有数据库访问或Web服务请求,例如,视图包将包含所有servlet页面和与程序的用户交互。 当用户选择一个选项时,该信息存储在公共静态变量中,然后其他类可以访问。但当两个用户选择两个不同的选项时,就会发生冲突。因为变量是静态的。。。
我需要一个可以在类之间共享的变量,并且只为给定的用户保留它的值。您可以设置和获取属性。

您列出的第一个选项,使用静态变量存储可变状态,在Java EE web应用程序中不起作用。没错,相同服务器上的不同用户将看到相同的值。除此之外,如果部署了应用程序的多个实例,则一台服务器上的静态变量可能包含与另一台服务器上的静态变量不同的值,因此如果您有多个框,每个框中都有一个web应用程序的实例,并且前面有一个负载平衡器发送循环请求,用户可以看到不同请求的不同状态。所以你可以排除这个选项

您的第二个选项“(2)通过使用setter和getter”,一点也不清楚

如果您想保持仅对一个用户可见的状态,可以将其放在HttpSession中。HttpSession中存储的内容特定于登录的当前用户。这只是一个临时存储点,当会话超时时,会话的内容就会消失。在HttpSession中放置太多东西可能是一个问题;它会占用大量内存,并且会导致集群应用程序中的速度减慢,因为节点试图在节点之间复制信息,以保持每个服务器的会话内容最新。(另一种选择是将用户固定到给定的服务器上,从而导致负载分布不均匀。)


最好在数据库中保留用户特定的信息。通过这种方式,数据位于应用程序的所有实例都可用的一个位置,您可以像从数据库中获取的任何其他数据一样对其进行缓存,并且您的应用程序可以确保只有适当的用户才能看到它。此外,数据是持久的,而不是在会话超时时消失

我们真的需要更多的细节来帮助你。什么样的变量?每个用户都是私有的吗?它们对于整个应用程序是全局的吗?也许编辑你的帖子并提供更多细节。非常感谢,我不知道httpSession,实际上,它非常有用,我们可以根据每个用户存储(设置和获取)我们需要的所有数据