2010-09-23 46 views
0

我正在使用。 和我的託管bean在會話範圍中定義。當我打開一個新的瀏覽器時,託管bean的構造函數第一次被調用。但在此之後,當我打開另一個瀏覽器實例時,我直接看到該方法正在調用,而不是通過託管bean的構造函數。JSF:如何強制爲每個瀏覽實例創建一個新的託管bean實例

有沒有做具體的方式,在JSF中創建託管Bean的新實例爲每個瀏覽器實例

Apprecitate任何幫助

鮑勃

回答

2

「問題」是在你的網頁瀏覽器。它在所有實例/窗口/選項卡之間共享相同的會話。這是正常的行爲。在JSF 2.x中,您可以通過將bean放置在view範圍內來「解決」這個問題,只要您每次提交併導航回相同的視圖,就可以使bean保持活動狀態。在JSF 1.x中,它缺乏view範圍,你可以通過將豆在request範圍和使用任何Tomahawk's <t:saveState>,或RichFaces' <a4j:keepAlive>,或JBoss Seam對話範圍,或MyFaces Orchestra實現期望的行爲。

同樣,這個問題不是JSF特有的。標準的HTTP規範根本不提供任何方式來區分客戶端的狀態(新實例,選項卡或窗口)和服務器端。

+0

感謝您的回覆。請您告訴我,如何在視圖範圍內定義bean – Bob 2010-09-24 00:13:47

+0

使用'@ ViewScoped'或'視圖'。再一次,這只是JSF 2.x。在JSF 1.x中,你只有'request','session','application'和'none'。 – BalusC 2010-09-24 00:32:03

+0

非常感謝BalusC的幫助。最後一個問題,我使用的是JSF2.0(Mojarra),而且我有一個preRenderView事件,那麼a4j:keepAlive會工作嗎?因爲我試過了,我沒有看到任何效果。 – Bob 2010-09-24 05:57:15

0

第一種方法,最明顯的是使用請求範圍bean

但是,正如前面描述的那樣,您不能爲每個瀏覽器窗口都創建會話bean的新實例。

相關問題