【问题标题】:jsf 2.0 @ViewScoped redirect (navigation) to target="_blank"jsf 2.0 @ViewScoped 重定向(导航)到 target="_blank"
【发布时间】:2012-04-23 07:41:41
【问题描述】:

和here基本一样的问题

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

firstPage.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>

【问题讨论】:

  • 该 bean 应该在 @Session 范围内才能工作。作为最后一个资源,您可以在会话中保存数据并在另一个 bean 的构造函数中恢复它。

标签: jsf-2 richfaces facelets


【解决方案1】:

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

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

您可以通过两种方式导航到不同的视图。第一个是非人脸请求,例如来自h:link 或h:button。在这种情况下,之前的视图不会被恢复,因此 JSF 不会知道有任何视图范围的 bean 需要销毁。第二个是面部请求,例如来自h:commandLink 或h:commandButton,它返回除void 或null 之外的其他内容。在这种情况下,有一个对视图的回发,它被恢复以处理操作。如果该操作的结果是离开该视图,重定向与否,则范围为该视图的任何 bean 都将被销毁。

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

【讨论】:

  • 我不情愿地接受这个答案......只是因为这不是我希望听到的:))所以我需要做一些重新设计,听起来。要么管理我自己的会话清理,要么不在同一个 post pack 请求中重定向,而是以一种不会触及 bean 的非面孔方式进行。谢谢布赖恩。
猜你喜欢
  • 2020-11-19
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多