2012-04-11 54 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