在JSF应用程序中,我有一个会话范围的bean,它有多个网页的各种getter和setter,当访问者点击“Submit”按钮时,页面中输入的值将被发送到输出文件以供以后处理与另一个申请。
我希望跟踪特定日期数据写入文件的次数,虽然我最终可能会使用数据库,但我希望将计数器存放在所有人都更新的地方谁访问该页面。我的理解是,如果我将它作为静态int存储在托管bean中,则该值将不会保留在其他会话中。我有一个非bean类,它存储了一些实用程序方法,比如处理日期,我的问题是非bean类存储一个静态变量,可以从任何会话访问,并用于跟踪信息,如计数提交?
非常感谢您的回复。
答案 0 :(得分:0)
我的理解是,如果我将它作为静态int存储在托管bean中,则该值将不会保留在其他会话中。
那是不对的。静态变量是应用范围的。它们与实例无关,而与课程有关。在应用程序的生命周期中,类只加载一次。您也可以通过一个相当简单的实验来确定自己。
您唯一关心的可能是线索安全。利用AtomicInteger
或AtomicLong
代替int
,以便在增量期间不会有竞争条件的风险。
答案 1 :(得分:0)
只要您不重新启动服务器,即使是会话范围内托管bean中的服务器,任何静态字段都将实现您的目标。静态变量属于类,而不是实例,托管bean的类只由JVM加载一次。由于您可能会从多个线程访问该静态变量,因此在修改其值时需要进行同步。