2012-08-10 71 views
0

下面是我嘗試做的一個例子。使用Session和View來瀏覽視圖scoped託管bean JSF 2.0

在sessionScoped豆

SessionBeanloadRecord(){ 
Do something 
ViewScopedBean viewScopedBean = (ViewScopedBean) context.getApplication().evaluateExpressionGet(context, "#{viewScopedBean}", ViewScopedBean.class); 
return viewScopedBean.viewScopedBeanLoadRecord(); 
} 

在viewScoped豆

ViewScopedBeanloadRecord(){ 
Retrieve and populateFields  
return "viewRecord.xhtml";  
} 

所以在堅果殼我想調用的圖中的方法從另一個bean這是對另一個作用域bean查看(listRecords.xhtml)。 當我運行這個(只使用一個標準的命令鏈接)時,會話bean按我的預期工作,viewScoped bean被創建並且ViewScopedBeanloadRecord方法被調用但是那麼viewScoped bean被重新創建(構造函數被再次調用),但是這次ViewScopedBeanloadRecord未運行,頁面加載空白字段。

據我所知,只要您返回null(或有一個void方法)留在相同的視圖,但你如何從listRecords.xhtml過渡到viewRecord.xhtml並運行加載方法?

一旦我在viewRecord.xhtml視圖中,我也將被要求同時加載更多的記錄(在不同的瀏覽器窗口中),所以我不能保留會話中的記錄。

請注意:根據公司政策,我不允許發佈實際的代碼,所以這個例子是我所限制的。抱歉!

任何幫助,將不勝感激!

感謝

埃裏克

回答

0

戰鬥後,並試圖與Requestscoped,Viewscoped不同的組合和@PostConstruct我無法獲得這種情況下正常工作。我還使用動態包含文件,這些文件依賴於bean中的屬性來決定構建哪個xhtml文件,這在使用viewScope和@PostConstruct時似乎會導致問題。

所以我去了一個完全基於會話的解決方案。

取代viewScoped或requestScoped bean我在會話bean中創建了一個類型爲「record」的屬性,並且每當調用sessionbean中的視圖記錄方法時,我都將新記錄屬性替換爲新記錄屬性,然後轉發給顯示記錄視圖。所以它創建了一種「請求」記錄屬性,每次對視圖記錄方法的新調用都會覆蓋該屬性。所以只有最後一次被觀看的觀看留在會話中。

我已閱讀了關於<t:saveState>標籤,可以解決這個問題,但作爲一個項目,決定不在JSF上使用任何額外的框架,因此這不是一個選項。

0

我們有一個類似的問題,我們通過使用@SessionScoped bean作爲支持Bean整個會話解決它。我們將其注入管理會話中所需數據的其他@ViewScoped@RequestScoped bean中。

另一個步驟是使用GET參數。

記住豆類的生命週期,並使用不同的函數來污染數據。 @PostConstruct註釋也非常方便。

祝你好運:)

+0

所有與此解決方案的會話中,因爲它們始終被引用,所以JVM永遠不會銷燬它們,直到會話結束。這就像所有的豆被標記爲「sessionScoped」。 – 2012-11-28 16:16:50