java开发中购物车问题_JavaEE中的购物车困境

本文讨论了在JavaEE开发中处理购物车问题的两种常见方法:使用有状态会话EJB和使用SessionScoped ManagedBean结合无状态EJB。文中详细解释了每种方法的实现细节,并分析了它们的优缺点。作者倾向于使用无状态EJB,因为它更快且支持池化,同时内存占用与使用有状态EJB的情况相当。
摘要由CSDN通过智能技术生成

实际上这是一个非常好的问题.

我70%的开发活动使用完全相同的堆栈(Java EE 7,Glassfish 4,JSF 2.2,EclipseLink JPA,EJB 3.1),我经常开发自定义电子商务网站,因此我对购物设计很熟悉推车.

我遵循的两种方法(在最终决定两者之一之前):

>有状态会话EJB,实现定义业务逻辑的@Remote普通Java接口

> SessionScoped ManagedBean和Stateless EJB实现了一个定义业务逻辑的@Local接口.

我个人从第一种方法开始,但我最近切换到第二种方法.我将在后面的答案中解释原因.

第一种方法非常简单.您只需要一个带有@Remote注释的简单接口和一个实现它的@Stateful会话Bean.然后在您的支持bean中,您可以使用@EJB注释而不是@Inject注入来通过CDI注入接口,以利用EJB注入的所有优秀功能,如池.对于你的购物车,我会创建:

1)名为ShoppingCart.java的接口:

@Remote

public interface ShoppingCart{

public void init(Integer id);

public void addToCart(String product);

}

2)实现ShoppingCart.java接口的名为ShoppingCartImpl.java的有状态会话EJB

@Stateful

public class ShoppingCartImpl implements ShoppingCart{

private Integer uid;

private ArrayList products;

@PostConstruct

private void create(){

producs = new ArrayList();

}

@Override

public void init(Integer id){

if(id==null){

uid = id;

}

}

@Override

public void addToCart(String product){

if(product!=null){

products.add(product);

}

}

}

客户端类可以通过@EJB注释使用CDI访问Statefull会话Bean.

public class ShoppingCartClient {

@EJB

private static ShoppingCart cart;

// your methods here, using the ShoppingCart interface

}

实际客户与ShoppingCart实现实例的实例之间的实际“链接”得到保证,因为每个客户端都与有状态会话bean的新实例相关联.从客户端的角度来看,业务方法似乎在本地运行,尽管它们在会话bean中远程运行.对于记录…… Oracle在他自己的教程中提出了这种方法.

我喜欢的方法

我首选的方法是使用表示代码的SessionScoped JSF支持bean,并使用无状态EJB来访问所需的业务逻辑.在这种情况下也需要一个接口,但它可以是Local,可以改变代码:

1)Java Local接口

@Local

public interface ShoppingCart{

public void doSomething(List list);

}

2)无状态EJB

@Stateless

public class ShoppingCartImpl implements ShoppingCart{

@Override

public void doSomething(List list){

// persistence, tax calculation, etc

}

}

3)JSF Session Scoped Bean

@ManagedBean

@SessionScoped

public class CartBean {

private List products = new ArrayList();

public void add(Product product) {

products.add(product);

}

public void remove(Product product) {

products.remove(product);

}

public List getProducts() {

return products;

}

}

第二种方法具有以下好处:

>无状态EJB比有状态EJB更快

>按设计无状态EJB支持池

内存占用与第一种情况相同,因为JSF以与存储状态会话Bean相同的方式存储会话范围的托管bean.

如果您希望能够在其他地方使用它或在不同的webapp之间共享它们,那么有状态EJB是适合的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值