当前位置: 首页 > 知识库问答 >
问题:

JavaEE中的购物车困境

淳于鹏
2023-03-14

实际问题是购物车的实施。在某一点上,购物车可以是SFSB(有状态会话Bean)。这意味着EJB容器将把servlet/Web容器视为客户机,并管理两个容器之间的会话。如果EJB客户机是Servlet/Web容器,那么我如何识别正在向购物车添加项目的最终用户(实际客户机)呢?

我的第二个选项是将SFSB存储到HttpSession中。这样,最终用户就可以从HttpSession中检索购物车(并且会话已经从servlet容器中管理)。这将如何影响EJB会话的事务状态?

购物车使用JPA持久化在数据库中。

多谢了。

共有1个答案

汪阳飇
2023-03-14

其实这是一个很好的问题。

我在70%的开发活动中使用了完全相同的堆栈(Java EE 7、Glassfish 4、JSF 2.2、EclipseLink JPA、EJB 3.1)。我经常开发定制的电子商务站点,因此我熟悉购物车的设计。

我遵循的两种方法(在最后决定选择其中一种方法之前):

    null

1)名为shoppingcart.java的接口:

@Remote
public interface ShoppingCart{

  public void init(Integer id);
  public void addToCart(String product);

}

2)一个名为shoppingcartimpl.java的有状态会话EJB实现shoppingcart.java接口

 @Stateful
 public class ShoppingCartImpl implements ShoppingCart{

   private Integer uid;
   private ArrayList<String> products;

   @PostConstruct
   private void create(){
     producs = new ArrayList<String>();
   }

   @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来访问所需的业务逻辑。在这种情况下也需要一个接口,但可以将其设置为本地的,以如下方式更改代码:

1)Java本地接口

@Local
public interface ShoppingCart{
   public void doSomething(List<Product> list);
}

2)无状态EJB

@Stateless
public class ShoppingCartImpl implements ShoppingCart{

   @Override
   public void doSomething(List<Product> list){
    // persistence, tax calculation, etc
   }
}

3)JSF会话范围Bean

@ManagedBean
@SessionScoped
public class CartBean {

 private List<Product> products = new ArrayList<Product>();

 public void add(Product product) {
     products.add(product);
 }

 public void remove(Product product) {
     products.remove(product);
 }

 public List<Product> getProducts() {
     return products;
 }
}
    null
 类似资料:
  • 购物车 手淘iOS 5.2.5 Android 5.2.7,天猫客户端暂未支持 Tida.cart({ sellerNick: "莱夫箱包旗舰店", itemId: "42828909348", skuId: "73068526031" }, function (data) { alert(JSON.stringify(data)); }); 该接口支持SPI回

  • 购物车类允许项目被添加到session中,session在用户浏览你的网站期间都保持有效状态。这些项目能够以标准的 "购物车" 格式被检索和显示,并允许用户更新数量或者从购物车中移除项目。 请注意购物车类只提供核心的"购物车"功能。它不提供配送、信用卡授权或者其它处理组件。 初始化购物车类 重要:购物车类利用 CodeIgniter 的 Session 类把购物车信息保存到数据库中,所以在使用购物

  • 购物车类允许项目被添加到 session 中,session 在用户浏览你的网站期间都保持有效状态。 这些项目能够以标准的 "购物车" 格式被检索和显示,并允许用户更新数量或者从购物车中移除项目。 重要 购物车类已经废弃,请不要使用。目前保留它只是为了向前兼容。 请注意购物车类只提供核心的 "购物车" 功能。它不提供配送、信用卡授权或者其它处理组件。 使用购物车类 初始化购物车类 将一个项目添加到

  • 问题内容: 我有上面的代码。 如果我在cart_item上运行print_r,我将得到一个多维数组: 我如何只获得product_id? 我试过$ test = 没用 问题答案: 要获取 foreach循环中的每个购物车商品(对于简单产品): 如果是可变产品,请获取 : 或在两种情况下 ( Woocommerce 3+中 的 Object在哪里) : 更新: 循环外使用产品ID 1)打破循环 (仅

  • 最初,我选择了一个包(Woo订阅) 然后添加了所有详细信息。 但未提交。 回到网站,所以再次购买我需要选择一个包。所以我选择了这个包,并填写了详细信息,然后转到付款包。 现在在我的购物车中,两个包都存在(即我没有第一次购买就选择的包和最近的包) 如何修复此问题,使最新选定的一个在购物车中,而较早的一个在选定最新的一个后立即删除。 我尝试了这个Woocommerce从购物车中删除所有产品,并将当前产

  • 我试图从以下链接实现这个购物车示例http://o7planning.org/en/10605/create-a-java-shopping-cart-web-application-using-spring-mvc-and-hibernate 我使用了与它相同的代码。但我得到了以下错误。 有人能帮我解决这个吗?