我知道在Web应用程序中使用有状态与无状态EJB存在很多争议。
购物车是最常见的用例:Oracle的Java EE示例也在官方文档中大量使用它。
在stackoverflow中,我发现了许多有趣的答案,例如The Shopping Cart dilemma in JavaEE,这些答案通常会说:
ok ... SFSB在企业,复杂场景中表现良好,例如如果您想与其他应用程序共享它们,并使它们不仅可用于JSF / Web客户端
但是......如果您只是开发爷爷的电子商务网站,只需坚持使用HttpSession / SessionScoped cdi托管bean,并在SLSB中编写业务方法,它们更有效率,等等......
然而,由于我还处于学习和发现阶段,我只想亲自试试SFSB尝试建立一个简单的购物车。
我看到一个有趣的教程,建议在HttpSession中存储一个JNDI检索的@Stateful购物车ejb接口实例,这是Web客户端第一次需要它,然后在网络会话期间照常使用它。在我的JSF表示层中,我想我会有一个@SessionScoped @Named bean(让我们称之为 ShopController ),并且在初始化时,存储一个实例变量中有状态ejb的实例。
我想知道是否可以通过使用@SessionScoped CDI注释来注释它来直接将@Stateful bean绑定到http会话。
它会如上所述起作用吗? CDI会为每个网络会话创建一个SFSB吗?
答案 0 :(得分:6)
@SessionScoped
适用于@Named
个bean,@Stateful
适用于@EJB
个bean。如果我没错,你就不能用两者注释1个bean。如果您想使用@Stateful
,只需使用ShoppingCart
和@EJB
对您的@Local
bean进行注释,然后在ShopController
中引用它。像这样:
@Named
@SessionScoped
public class ShopController {
...
@EJB
private ShoppingCart cart;
...
// Getters and Setters
}
@Local
@Stateful
public class ShoppingCart {
...
}
答案 1 :(得分:-1)
不要浪费时间学习如何将SFSB用于Web应用程序。您很快就会遇到可扩展性问题。为什么要学习如何创建使用不必要的服务器资源的应用程序?
即使您的托管bean也不应该是SessionScoped。最多只创建一个非常精简的SessionScoped MB,其中包含小型用户数据以跟踪它,所有其他MB应该是请求,视图范围。
您的问题的答案是肯定的,您可以使用CDI将SessionScoped MB绑定到SFSB EJB。但这不是一个很好的Web应用程序架构。