2012-04-11 106 views
0

基本上相同的问题作为hereJSF 2.0 @ViewScoped重定向(导航)来定位=“_空白”

如何保留页面上的ViewScoped豆从中我重定向到一个不同的浏览器标签:

firstPage.xhtml:

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

当重定向/导航与初始化其他豆类完成,它破坏过程中的这#{豆}。在重定向的代码中,我甚至没有使用#{bean}。这用于与

<a4j:keepAlive> 

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

@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> 
+0

这个bean应该是@Session的作用域。作为最后一个资源,您可以保存会话中的数据并将其恢复到其他bean的构造函数中。 – 2012-04-11 01:40:23

回答

2

你需要做的是Luiggi在会议上暂时建议和存储数据或者传递数据(或按键足以重新获取数据)通过查询参数传递给目标视图。即使您没有重定向和/或定位新的窗口/标签,情况也是如此。

查看范围很奇怪。只有当用户停留在同一视图中时,它才存在。当JSF发现视图已被导航时,它将自动销毁作用域为该视图的所有bean。

有两种方法可以导航到不同的视图。第一种是非面孔请求,例如从h:linkh:button。在这种情况下,前一个视图没有被恢复,所以JSF不知道有任何视图范围的bean可以销毁。第二种是面询,例如从h:commandLinkh:commandButton,返回除voidnull以外的内容。在这种情况下,会有一个回传到视图,该视图将被恢复以处理该操作。如果该操作的结果是从该视图导航离开,重定向或不重定向,那么任何被视为该视图的bean将被销毁。

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

+0

我勉强接受答案...只因为它不是我希望听到的:))所以我需要做一些重新设计,听起来像。要么管理我自己的会话清理,要么不要在相同的post pack请求中重定向,而是以不会触及bean的非面向方式进行清理。谢谢Brian。 – Elijah 2012-04-11 16:02:51