2011-06-05 85 views
2

是否可以這樣做:當用戶會話啓動時,我從數據庫中讀取某個集成屬性。當用戶在本次會話中執行某些活動時,我會在會話結束時更新該變量(存儲在會話中)&,然後我最終將該值存儲到數據庫。監聽用戶會話何時在JSF受管Bean中結束

我的問題是如何確定如果用戶會話已結束使用JSF框架&我應該將值存儲回數據庫?

回答

7

除了HttpSessionListener之外,您可以爲此使用會話作用域託管bean。您可以使用@PostConstruct(或只是bean的構造函數)和@PreDestroy註釋勾上會話創建和銷燬

@ManagedBean 
@SessionScoped 
public class SessionManager { 

    @PostConstruct 
    public void sessionInitialized() { 
     // ... 
    } 

    @PreDestroy 
    public void sessionDestroyed() { 
     // ... 
    } 

} 

唯一的要求是,這個bean是在一個JSF頁面引用或提出的任何要求@ManagedProperty作用域bean。否則它不會被創建。但在你的情況下,這應該是沒有問題的,因爲你顯然已經使用會話範圍的託管bean,只需添加一個@PreDestroy方法就足夠了。

+0

我想嘗試第二種方法,因爲它看起來不錯。另外我需要能夠獲得ejbs和實體管理器的處理,這似乎只能從JSF中的託管bean(而不是HttpSessionListener)中獲得。我將會話範圍的managedbean作爲我的登錄處理requestscoped bean的託管屬性,以便它在用戶登錄時進入範圍。我遇到的問題是,標記爲@PreDestroy的方法在登錄bean退出時似乎被調用範圍(即登錄方法返回時)。所以我的代碼很早就開始了。任何想法爲什麼會發生這種情況? – BillR 2012-08-07 02:05:56

5

我的問題是如何識別使用 JSF框架,如果用戶會話 已經結束&我應該然後存儲 值回DB?

JSF框架沒有單獨的會話概念;它使用Servlet規範的底層會話管理功能。

您將不得不創建一個HttpSessionListener,它爲您提供了捕獲會話創建和銷燬事件的鉤子,您可以在其中讀取該值並將其存儲回數據庫。

2

HttpSessionListener,或者如果您需要依賴注入爲了保存,您可以使用@PostConstruct & @PreDestroy。請記住,當您撥打invalidate()或會話超時後,而不是在用戶關閉瀏覽器時會話被破壞。爲什麼你使用會話範圍無論如何,對話範圍可能會更適合你。