2012-12-14 9 views
1

語境爲什麼不直接使用CDI支持的bean(而不是SFSB)來保存會話信息?

簡單的Java EE 6(JBoss應用服務器7.1)CRUD Web應用程序,使用@Named支持豆,@SessionScope JSF頁面

問題

爲什麼在CDI bean上存儲HTTP會話狀態會是一個壞主意?例如,將購物車物品存儲在那裏。

評論

SFSB都是爲了這個,由於其會話狀態,但我讀過,他們不容易在practice使用。另外我認爲,另一種選擇是HttpSession對象。

我也意識到他們擁有的鈍化/激活優勢。

回答

3

我認爲你在用於HTTP會話的「session」和用於具有特定bean(本例中爲有狀態bean)的會話之間存在混淆。

他們服務於不同的目的,但也有重疊。最初,與SFSB的會話用於非HTTP遠程客戶端(Applets和Swing應用程序)。在某種程度上,你可以說它是HTTP會話的RMI等價物。

當已經有一個HTTP會話可用時,爲此目的使用有狀態會話bean沒有意義,並且您最好使用HTTP會話作用域bean。

有狀態會話bean雖然有它們的用途,例如它們能夠適應擴展的持久化上下文, (樂觀)鎖定在事務之外打開。

在Java EE 6 Web應用程序中使用時,通常希望爲有狀態會話Bean分配HTTP會話作用域。否則,即使這個bean有一個內部會話,但它並沒有連接到任何東西,而是連接到用來與之通信的代理。

另見:

+0

uff ...你能給我更多關於擴展持久化上下文的信息嗎?爲SFSB分配一個@SessionScope ...使用CDI bean有什麼好處? – jacktrades

+1

擴展持久化上下文是一個JPA上下文,它不綁定(作用域)到事務,而是綁定到有狀態會話bean的生命週期。有關更詳細的解釋,您可以查看「Pro JPA 2」一書。 –

+0

所以,爲了簡單起見,如果不需要擴展持久性上下文,那麼我應該離開SFSB? – jacktrades

2

這裏是SFSB的supposely好處:

  • SFSB是事務性的。
  • SFSB可以被鈍化/激活。
  • SFSB啓用擴展持久性上下文。

要付出的代價是異常方案更復雜(回滾,非回滾異常等),生命週期以及後果調試。

通常,您不需要鈍化/激活。爲了使設計具有可擴展性,請儘可能少地存儲在內存中。通常情況下,擴展持久化上下文也不是必需的(儘管如此,它們也有其用處)。

但是,請求必須以事務處理的方式進行處理。但你不需要SFSB。你可以自己處理錯誤和恢復,以確保你的HttpSession是一致的。但請確保您使用事務來訪問您的後端!

相關問題