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

时间:2016-07-19 14:12:28

标签: java java-ee static-variables

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

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

那么,任何人都可以解释我如何仅为给定的sessionId共享信息?

更明确:

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

你的第二个选择,“(2)使用setter和getter”,根本不清楚。

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

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