打开多个页面而不替换Managed Bean中的Property

时间:2012-08-12 17:34:48

标签: jsf properties managed-bean

我有一个问题,但不知道我应该看到什么。我不认为我是第一个遇到这个问题的人!

这是一个带有JSF和Java的Java SE应用程序。 Co,基本框架。

应用程序可以向线程提交注释。我写了一个评论,然后我打开另一个线程(另一个Browser-Tab),以便在新打开的帖子中发布评论。

我有一个属性为“selectedThread”的ManagedBean。该错误是由于该属性被较新的属性替换而导致的。我该如何解决这个问题?

我有几个想法,但都会产生同样的问题。

谢谢!


@ManagedBean
@SessionScoped
public class ViewBean {



private Thread selectedThread = new Thread(); //Current opened Threas
private String threadId=""; //ThreadId read out from Database by Id convert to Object
private Comment selectedThreadComment = new Comment(); //Comment to be made

工作/失败步骤:

  1. 打开:thread_detail.xhtml?id = 10
  2. ThreadId和选定的Trip设置
  3. 撰写评论(selectedThreadComment setted)
  4. 打开:thread_detail.xhtml?id = 11
  5. 提交评论
  6. 对于id 11而不是id 10,可以理解为持续存在注释。

    使用哪个Scope并不重要。必须有一种方法可以根据打开的网站保存评论。

    我希望现在我的问题更明确了!

1 个答案:

答案 0 :(得分:0)

听起来好像托管bean的范围对于它所拥有的数据而言过于宽泛。这些症状表明托管bean已放置在会话范围内,而其保存的数据特定于单个HTTP请求或单个视图。只要建立了浏览器会话,会话范围的托管bean实例就会存在。它在同一会话中的所有请求/视图中共享。由一个窗口/选项卡启动的任何更改都将反映在同一会话中的另一个窗口/选项卡中。

如果bean仅包含请求或视图范围数据,那么您应该将bean放在请求或视图范围中。如果您有某些数据,这些数据肯定会保留在会话范围内,例如:登录用户,然后您应该将当前会话范围的托管bean拆分为两个托管bean,每个托管bean都在正确的范围内。然后,使用作用域的会话来保存表示登录用户的数据,然后使用请求/视图作用域来保存表示提交的表单数据和/或视图状态的数据。您可以使用@ManagedProperty将会话作用域注入到请求/视图作用域中。

另见: