2011-03-01 267 views
8

我對Java EE 6的讀一本書,我會見了以下幾個部分:會話狀態

「無狀態:會話bean包含方法之間沒有會話狀態,任何 實例可以用於任何客戶端。「

「有狀態:會話Bean包含會話狀態,必須跨單個用戶的方法保留 。」

什麼是 「會話狀態」 是什麼意思?有人用真實世界的例子來解釋它嗎?

在此先感謝。

二,爲什麼豆類的分類如此重要?它無論是對於初學者還是對初學者都沒有提供正確的解釋 非常感謝你,我得到了邏輯上的區別,但是爲什麼這種行爲如此重要?

回答

11

最基本的,「會話狀態」是指實例字段的值。

對於無狀態會話bean,容器並不能保證以後的方法調用將使用相同的EJB實例(從池),因此你不能想當然地認爲,當你調用一個bean的方法,你放置的價值觀,仍然會在那裏當你再次調用該方法(或bean的另一種方法)時。

對於有狀態會話Bean,後續調用將使用相同的EJB實例容器擔保,因此可以保持實例字段的值。

舉一個例子起見,假設你有一個具有增量()和檢索()方法的bean。增量增加存儲值,並檢索獲取當前存儲值。

對於一個無狀態會話bean,如果你調用increment()方法5次,不能保證當你做一個retrieve()時,你會得到一個5.它取決於EJB的容器將分配給您的電話。所以如果你被分配了一個新的EJB實例,那麼你會得到一個零。容器還沒有清理你的EJB實例也是可能的,所以有可能得到一個5,但不能保證。

對於有狀態會話bean,如果您調用increment方法5次,當您檢索值時,您將得到一個5.容器保證第一次調用時使用的EJB將用於所有隨後的調用。

+0

感謝您的時間和精力,如果你有時間你能解釋一下我的第二個II。題 ? – cscsaba 2011-03-01 14:08:23

4

一個會話狀態的一個真實世界的例子就是購物車。用戶可以逐個添加多個商品到購物車,然後致電結帳。所有增加的時間會在那裏

假設車是有狀態的,即它會保持會話狀態。

cart.add(item1); // suppose cart keep tracks of item by adding it to ArrayList 
cart.add(item2); 

cart.checkOut(); // at this stage both item1 and item2 would be there in ArrayList. 

如果購物車是無狀態的,每次通話都將獨立於以前的通話,並且在結帳時它什麼也沒有。

關於你的第二點 的區別是必要的,因爲在這兩種豆類的行爲差異。維護狀態需要資源,因此有狀態bean不像無狀態bean那樣可伸縮。

+0

感謝您的時間和精力,如果您有時間可以解釋我的第二個II。題 ? – cscsaba 2011-03-01 14:09:07

+0

再次感謝無能。 – cscsaba 2011-03-01 17:10:54

0

至於問題的第二部分,從Java EE 6教程中,你可以閱讀以下內容:

當toUse會話Bean

如有以下

狀態會話bean是適當的條件是真的。

  • bean的狀態表示bean和特定客戶端之間的交互。
  • bean需要在方法調用中保存有關客戶端的信息。
  • bean在客戶端和應用程序的其他組件之間進行調解,向客戶端呈現簡化的視圖。
  • 在幕後,bean管理幾個企業bean的工作流程。

要提高性能,可以選擇無狀態會話bean,如果它具有任何這些特性。

  • 該bean的狀態沒有針對特定客戶端的數據。
  • 在單個方法調用中,bean爲所有客戶端執行通用任務。例如,您可以使用無狀態會話bean發送確認在線訂單的電子郵件。
  • 這個bean實現了一個web服務。

Java EE 6 Tutorial