在 Java EE 中的 类 之间共享变量

Sharing variables between classes in Java EE

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

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

所以,谁能解释一下如何只为给定的 sessionId 共享信息?

更明确地说:

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

我会使用 HttpSession。您可以设置和获取属性。

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

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

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

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