[英]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.