我知道在web应用程序中使用有状态和无状态的EJB有很多争论。
购物车是最常见的用例:Oracle的Java示例在官方文档中也经常使用它。
在这里,在堆栈溢出中,我发现了许多有趣的答案,比如这个The Shopping Cart dilemma in JavaEE,它经常说:
好的..。SFSB擅长于企业、复杂的场景,例如,如果您希望与其他应用程序共享它们,并且不仅将它们提供给JSF/web客户端,
但是..。如果您只是在开发您爷爷的电子商务网站,只需坚持使用HttpSession / SessionScoped cdi管理的bean,并使用SLSB编写您的业务方法,因为它们更有效,等等……
然而,由于我还处在学习和发现阶段,我只想让SFSB自己试一试,尝试构建一个简单的购物车。
我看了一篇有趣的教程,建议在HttpSession中存储一个JNDI检索的@Statty购物车ejb接口实例,这是web客户端第一次需要它,然后在web会话期间像往常一样使用它。在我的JSF表示层中,我想我应该有一个@SessionScoped @命名bean (让我们称它为ShopController),,并在初始化时将有状态ejb的一个实例存储在一个实例变量中。
我想知道是否可以通过使用@SessionScoped注释将@Stateful直接绑定到http会话。
它会像上面所描述的那样起作用吗?CDI会为每个网络会话创建一个SFSB吗?
发布于 2014-04-01 10:12:56
@SessionScoped用于@Named bean,@Stateful用于@EJB bean。如果我没有错,您不能用两者来注释一个bean。如果您想使用@Stateful,只需用@EJB和@Local注释ShoppingCart bean,然后在ShopController中引用它。就像这样:
@Named
@SessionScoped
public class ShopController {
...
@EJB
private ShoppingCart cart;
...
// Getters and Setters
}
@Local
@Stateful
public class ShoppingCart {
...
}发布于 2014-04-01 18:33:18
不要浪费时间学习如何在web应用程序中使用SFSB。您很快就会遇到可伸缩性问题。为什么要学习如何制作使用不必要的服务器资源的应用程序?
即使您的托管bean也不应该是SessionScoped。最多只能创建一个非常薄的SessionScoped MB,并使用小用户数据来跟踪它,所有其他的都应该是请求、视图作用域。
对您的问题的回答是肯定的,您可以使用CDI将SessionScoped MB绑定到SFSB。但对于web应用程序来说,这不是一个很好的架构。
https://stackoverflow.com/questions/22779577
复制相似问题