摘自BalusC's Communication in JSF 2.0
•@ ViewScoped:在這個範圍豆住,只要你在瀏覽器窗口/標籤相同的JSF視圖交互。它會在HTTP請求中創建,並在您回發到其他視圖後被破壞。當您通過GET請求離開/關閉視圖時,它不會立即被破壞,但它不再以通常的方式訪問。 JSF將bean以受管bean名稱作爲關鍵字存儲在UIViewRoot#getViewMap()中,該關鍵字又存儲在會話中。您需要從操作(偵聽器)方法返回null或void以保持bean活着。使用此作用域可以使用更復雜的表單,這些表單使用ajax,數據表和/或多個呈現/禁用屬性,其狀態需要在同一瀏覽器窗口/選項卡(視圖)內的後續請求中保留。
•@ SessionScoped:只要HTTP會話存在,此範圍內的bean就會一直存在。它在會話中涉及此Bean的第一個HTTP請求時創建,並在HTTP會話失效時(或者從會話映射中手動刪除Bean)被破壞。 JSF將bean作爲HttpSession的一個屬性進行存儲,並將託管的bean名稱作爲關鍵字。它也可以通過ExternalContext#getSessionMap()獲得。使用此作用域可以在同一會話中的所有瀏覽器窗口/選項卡(視圖)之間安全地共享純會話範圍的數據。例如,登錄用戶,所述用戶偏好例如用戶特定的設置和所選擇的語言/區域設置等
ViewScoped
豆被存儲在其又被存儲在用戶會話中的UIViewRoot,因此ViewScoped
bean也間接存儲在會話中。會話過期並被銷燬後,ViewScoped
bean也會被銷燬,如果您在該代碼中引用期望狀態的代碼中的某些內容,或者您正在使用需要狀態(如.a4j)的第三方組件,那麼這可以解釋這個奇怪的問題。
我建議切換到RequestScoped
爲您的LoginBean。我從來沒有遇到過需要ViewScoped
支持bean登錄到應用程序的情況。
當您說「a4j」是指RichFaces的「」組件? –
BalusC
2012-02-10 13:26:53
@BalusC >>是的。 – user1201055 2012-02-13 03:28:01