【问题标题】:Start multiple new window but keep the current view alive启动多个新窗口但保持当前视图处于活动状态
【发布时间】:2012-02-02 21:14:29
【问题描述】:

我有一个员工会话 bean,其中包含同一类的相关员工 bean 的列表。我的用户需要能够查看“主要”员工,并从该员工生成多个浏览器窗口以显示相关员工的信息,但保持“主要”或“根”员工视图处于活动状态,以便他们可以继续从那里工作。

我认为当前正在发生的事情是 JSF 将打开一个新窗口并呈现相关员工,但随后会丢失原始窗口/视图的跟踪,因此如果您单击命令链接或从原始窗口运行任何内容(在您使用命令链接中的目标属性生成新窗口)第二个操作将不会运行或调用会话 bean 中的任何方法,除了重新加载页面之外,它似乎没有做任何事情。我相信是因为您正试图从不再注册的旧 JSF 视图运行操作,所以当框架收到来自这个陈旧视图的请求时,它必须注册?也许吧?

本质上,我试图为同一用户激活多个显示相同会话 bean 类型的会话,并将每个会话 bean 视图附加到单独的浏览器窗口。

如果您有任何想法,请告诉我。或者如果有更好的方法来做到这一点。

【问题讨论】:

  • 请在描述具体问题时更加具体。从开发人员的角度进行阐述,而不是从最终用户的角度进行阐述。例如,当您说 “如果您尝试从原始窗口运行命令时会发生什么,它会忽略它”.
  • 对不起,感谢您的建设性批评。我将编辑并添加更多信息。
  • 我认为您正在寻找的一句话就是如何在用户在另一个视图中工作而不获取 ViewExpiredException 时保持一个视图处于活动状态。 Mojarra(逻辑视图的数量)和 MyFaces(MYFACES-3117 参见 org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION Web 配置参数)都有一些解决这个问题的方法已经足够好了,但最终的解决方案可能在 JSF 2.2 上。
  • 您的应用程序的行为方式很大程度上取决于您用于导航的组件(即h:linkh:commandLink)和支持bean 的范围(请求、会话等)。 )。任何人都需要查看一些 XHTML 和 Java 源代码才能理解您为什么会看到这种行为。

标签: java jsf-2


【解决方案1】:

抱歉回复晚了。

我通过使用命令链接调用请求 bean 方法(并在新窗口中打开它)解决了这个问题。这允许我打开多个浏览器窗口(每个窗口都是对请求 bean 的新调用),而不会影响我的会话 bean“主”员工 bean。然后,用户可以在多个窗口中同时查看多个员工。我的部分问题与对 JSF 的误解有关。我一次只能在会话中拥有一个“员工”会话 bean,因此当我尝试使用不同的员工生成多个浏览器窗口时,它们都引用了同一个会话员工 bean,而这将不起作用。 JSF 将附加到打开的新窗口,不再知道原来的打开窗口。

无论如何,我建议您在每次打开新窗口查看新员工时实例化一个新的请求 bean。

抱歉,由于政策,我无法发布任何代码

【讨论】:

  • 是的,将@SessionScoped bean 用于在不同窗口中可能不同的数据是一个典型的错误。我也犯了这个错误:-/。请注意,请求范围的 bean 不是唯一的选择;通常 view-scope 更有意义(甚至是自定义范围)。
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2017-11-07
相关资源
最近更新 更多