0

基本上和这里一样的问题

如何在重定向到不同浏览器选项卡的页面上保留 ViewScoped bean:

第一页.xhtml:

<h:commandLink action="#{controller.redirect}" value="#{bean.value} target="_blank"/>

当重定向/导航完成初始化其他 bean 时,它会在进程中销毁这个 #{bean}。在重定向的代码中,我什至没有使用#{bean}。这曾经与

<a4j:keepAlive>

这是我目前的设置。豆类:

@ViewScoped
public class Bean{ 
    @PreDestroy
    public void onDestroy(){ // being destroyed when I don't want to }
}

面孔配置:

<navigation-rule>
  <from-view-id>/firstPage.xhtml</from-view-id>
    <navigation-case>
      <from-outcome>redirect</from-outcome>
      <to-view-id>/secondPage.xhtml</to-view-id>
  </navigation-case>
</navigation-rule>
4

1 回答 1

2

您需要按照 Luiggi 的建议进行操作,并将数据临时存储在会话中,或通过查询参数将数据(或足以重新获取数据的键)传递给目标视图。即使您没有重定向和/或定位新窗口/选项卡,情况也是如此。

视图范围很奇怪。只要用户停留在同一视图上,它就存在。当 JSF 发现视图已被导航离开时,它将自动销毁范围为该视图的所有 bean。

有两种方法可以导航到不同的视图。第一个是非人脸请求,例如 fromh:linkh:button。在这种情况下,之前的视图不会被恢复,因此 JSF 不会知道有任何视图范围的 bean 需要销毁。第二个是 faces 请求,例如 from h:commandLinkor h:commandButton,它返回voidor以外的内容null。在这种情况下,有一个对视图的回发,它被恢复以处理操作。如果该操作的结果是离开该视图,重定向与否,则范围为该视图的任何 bean 都将被销毁。

在底层,视图范围本质上是会话范围,具有一些用于清理“旧”数据的内置语义。如果用户不在多个窗口/选项卡中打开应用程序并且只使用应用程序中提供的导航(即,不是浏览器的后退/前进按钮),这实际上很有效。但是,由于我们谈论的是针对 Web 浏览器,因此在我看来,视图范围非常无用(唯一的例外是您可以控制目标浏览器并完全禁用后退/前进/重新加载/定位的情况,但它没有'听起来不像你在那种环境中)。

于 2012-04-11T15:00:16.277 回答