2012-04-11 76 views
0

我想在我的網站上有一個基於Ajax的選項卡式界面。JSF 2.0 ViewScoped Bean何時死亡?

我也想每個選項卡都有一個bean。
當離開標籤頁時,預計這些豆類是「出生」,「死亡」。

重要 - 標籤之間的切換必須是AJAX事件,而不是整頁重繪。

我認爲@ViewScoped是適合這種行爲類型的範圍,但是當我離開選項卡時,我陷入了殺死bean的問題。據我所知,一個@ViewScoped bean只會在重定向/導航事件中死亡。

是否有正確的方法使@ViewScoped豆死?我應該使用不同的範圍嗎?

謝謝!

UPDATE

閱讀BalusC對this問題的答案是很好的跡象:

視圖作用域爲您提供了同樣的看法 互動豆住,只要(即返回空或空的bean操作方法)。當您轉到其他視圖時,例如通過點擊一個鏈接或返回一個不同的動作結果,那麼視圖範圍的bean將在渲染響應結束時被丟棄 ,並且在下一個請求中不可用。

因此,根據這一點,我可以返回從操作方法不同的結果,使@ViewScoped豆模具。
但要做到這一點,我有一個從操作方法(JSF 2隱式導航)的結果後禁用導航,我不知道該怎麼做(或者如果這是實現我的目標,以正確的方式)

+0

[本答案](https://stackoverflow.com/questions/15265433/how-and-when-is-a-view-scope-bean-destroyed-in-jsf/15391453#15391453)至問題*「在JSF中視圖範圍bean何時被銷燬?」*可能是相關的。 – Lii 2016-01-20 16:09:16

回答

1

我將只使用一個ViewScoped bean,將數據顯示爲一個簡單的POJO屬性。這些頁面將被惰性初始化。

@ManagedBean 
@ViewScoped 
public class BackingBean { 

    private WizardData wizardData; 

    public WizardData getWizardData() { 
     if (wizardData == null) { 
      wizardData = new WizardData(); 
     } 
     return wizardData; 
    } 

    public void setWizardData(WizardData wizardData) { 
     this.wizardData = wizardData; 
    } 
} 

public class WizardData { 
    private WizardPage1 page1; 
    private WizardPage2 page2; 

    public WizardPage1 getPage1() { 
     if (page1 == null) { 
      page1 = new WizardPage1(); 
     } 
     return page1; 
    } 

    public void setPage1(WizardPage1 page1) { 
     this.page1 = page1; 
    } 

    public WizardPage2 getPage2() { 
     if (page2 == null) { 
      page2 = new WizardPage2(); 
     } 
     return page2; 
    } 

    public void setPage2(WizardPage2 page2) { 
     this.page2 = page2; 
    } 
} 

所以在頁面上,當你使用它們,例如POJO的將被創建

<h:outputText value="#{backingBean.wizardData.page1.someTextToShow}"/>