是否有任何会话bean(Java / JSF托管bean而不是浏览器会话),每个选项卡都不同

时间:2013-02-27 07:58:34

标签: java jsf jsf-2 scope javabeans

我想要的是每个标签/窗口不同的会话bean。我知道会话bean工作,但我想为新选项卡创建新的sessionbean。以下是我想要新会话bean的原因。

假设在第1页,我有用户列表。点击用户后,我会在第2页获得用户的详细信息。

现在假设我有两个标签。在这两个页面中我都有page1.xhtml。 在tab1上,我单击了User A.我在page2.xhtml上看到了用户A的详细信息 现在我来到tab2。 在tab2上,我点击了用户B.我在page2.xhtml上看到了用户B的详细信息 问题就在这里。现在我回到tab1并刷新page2.xhtml,我看到用户B的详细信息不正确,因为之前我看到了用户A的详细信息。

因此我想要的是每个新标签/窗口的新sessionbean。

有没有办法在每个标签/窗口中创建新的sessionbean?在素面或冰面上可能?


我认为ViewScope是解决方案,但事实并非如此。参考BalusC article

只要您在浏览器窗口/标签中与 相同的JSF视图进行交互,

@ViewScoped:此范围内的bean 就会存在 的。它是在HTTP请求时创建的,一旦您回发到另一个视图就会被销毁。


使用SessionBean,我的意思是Java / JSF托管会话托管bean而不是浏览器会话(历史记录)。

2 个答案:

答案 0 :(得分:1)

如果您正在使用CDI会话范围可能有所帮助。

来自Java EE文档:ConversationScoped

这些教程可能会有所帮助。

  1. CDI Conversations Part 1
  2. CDI Conversations Part 2
  3. 希望这有帮助!!!

答案 1 :(得分:0)

事实上,

@ViewScoped是解决这个问题的方法。问题似乎是您在从page1.xhtml导航然后在page2.xhtml中加载此会话数据时将UserX数据(id,detail或其他内容)设置为会话。因此,如果这是您当前的情况,即使CDI @ConversationScoped也不会帮助您(因为它使用cid查询字符串参数)。

为了解决这个问题,您应该对page2.xhtml发出GET请求并发送userId(或其他有用的参数)来恢复UserX的详细信息。

更多信息:

请注意,您可以加密参数(例如,ID)以为参数添加一些安全性。请参阅第二个建议的链接以实现此目的。