簡體   English   中英

將@Stateful和@SessionScoped用於購物車EJB

[英]Using both @Stateful and @SessionScoped for shopping cart EJB

我知道在Web應用程序中使用有狀態與無狀態EJB存在很多爭議。

購物車是最常見的用例:Oracle的Java EE示例也在官方文檔中使用了很多。

在stackoverflow上,我發現了許多有趣的答案,例如JavaEE中的購物車困境 ,經常會說:

好的... SFSB在企業,復雜場景中表現良好,例如,如果您想與其他應用程序共享它們,並使它們不僅可用於JSF / Web客戶端

但是......如果您只是在開發爺爺的電子商務網站,只需堅持使用HttpSession / SessionScoped cdi托管bean,並在SLSB中編寫業務方法,因為它們更有效,等等......

但是,因為我還處於學習和發現階段,所以我只想嘗試自己試圖建立一個簡單的購物車。

我看到一個有趣的教程,建議在HttpSession中存儲一個JNDI檢索的@Stateful購物車ejb接口實例,這是Web客戶端第一次需要它,然后在網絡會話期間照常使用它。 在我的JSF表示層中,我想我會有一個@SessionScoped @Named bean(讓我們稱之為ShopController ),並且在其初始化中,將一個有狀態ejb實例存儲在一個實例變量中。

我想知道是否可以通過使用@SessionScoped CDI注釋將@Stateful bean直接綁定到http會話。

它會如上所述起作用嗎? CDI會為每個網絡會話創建一個SFSB嗎?

@SessionScoped用於@Named bean, @SessionScoped @Stateful用於@EJB bean。 如果我沒錯,你就不能用兩者注釋1個bean。 如果你想使用@Stateful ,只需用@EJB@Local注釋你的ShoppingCart bean,然后在你的ShopController引用它。 像這樣的東西:

@Named
@SessionScoped
public class ShopController {
    ...
    @EJB
    private ShoppingCart cart;
    ...

    // Getters and Setters
}

@Local
@Stateful
public class ShoppingCart {
    ...
}

不要浪費時間學習如何將SFSB用於Web應用程序。 您很快就會遇到可擴展性問題。 為什么要學習如何創建使用不必要的服務器資源的應用程序?

即使您的托管bean也不應該是SessionScoped。 最多只創建一個非常精簡的SessionScoped MB,其中包含小型用戶數據以跟蹤它,所有其他MB應該是請求,視圖范圍。

您的問題的答案是肯定的,您可以使用CDI將SessionScoped MB綁定到SFSB EJB。 但這不是一個很好的Web應用程序架構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM