2016-07-19 46 views
-2

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

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

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

更明确:

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

+0

我们确实需要更多的细节来帮助您。什么样的变量?他们是每个用户的私人?它们是整个应用程序的全局吗?也许编辑你的文章并提供更多细节。 – stdunbar

回答

1

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

第二个选项“(2)通过使用setter和getter”,根本不清楚。

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

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

+0

非常感谢,我不知道httpSession,实际上,它是非常有用的,我们可以根据每个用户存储(设置和获取)我们需要的所有数据 – pseudo2188