java - 关于使用 playframework 实现购物车的建议

标签 java playframework shopping-cart

我正在通过编写代码来学习使用 playframework 来实现用于销售商品的 webstore。我已经使用 Admin 区域实现了 crudsecure 模块。现在,我想创建一个购物车,用户可以向其中添加商品并继续结帐。

我对电子商务的了解很少,但我已经阅读了一些使用 servlet 实现购物车和一些网上商店功能的教科书。在书中,购物车用于保存一个 SetCartItem,每个都包含一个 Productquantity 的实例。在用户将商品添加到购物车之后,购物车存储在 user session 中。

因此,无论何时用户进入购物车详细信息页面,它都会显示所有添加的项目。只有当 session 被清除时(由于服务器中定义的 session 超时,或者下订单时)CartItem 已从 ShoppingCart 中删除。

我想,我可以使用 playframework 中的缓存来执行上述操作。在将 CartItem 添加到 ShoppingCart 实例之后。我可以

shopcart.add(mycartItem);
Cache.set(session.getId(), shopcart);
..

稍后,在另一个页面中,我可以检索购物车及其内容,处理它们并清除购物车。

ShopCart cart = Cache.get(session.getId(),ShopCart.class);
Set<CartItem> items = cart.getCartItems();
processOrder(items,userinfo);
...
cart.clearItems();

这是正确的做法吗?如果我的想法不正确,请帮助我提出建议。

最佳答案

错了。抱歉这么苛刻,但你正在做的事情可能会失败。

Play 是无共享和无状态的。所有相关数据必须存储在数据库中。这意味着您必须在用户添加新商品时保留购物车的数据,并在交易完成后将其删除。

为什么不能使用缓存?因为缓存是易变的,其中的元素可能会在没有事先警告的情况下被删除。这意味着您的缓存随时可能返回 null(未找到项目)并且您的代码中出现 NullPointerException 并且您的用户丢失了购物车。

缓存只是为了提高性能,但你不能指望它总是拥有你需要的所有项目。

您应该将您的 ShopCart 变成一个实体(如果它不是一个)并向其中添加如下内容:

public static ShopCart findCart(String sessionId){
   ShopCart sc = Cache.get(session.getId(),ShopCart.class);
   if(sc == null){
      sc = ShopCart.findCurrentUserCart(); //implement to find the cart of the current user
      Cache.set(sessionId,sc);
   }
   return sc; 
}

然后在处理之前使用此方法检索购物车。

关于java - 关于使用 playframework 实现购物车的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244040/

相关文章:

asp.net - 如何在 ASPDotNetStoreFront 中为产品添加子产品?

java - 按类别获取页面上的所有 tr

scala - Controller 中的授权检查 - Scala/Play

java - 参数未知(Play! Framework)

java - File.separator 斜杠 不同方向

magento - 将商品添加到magento的购物车中

jxpath 的 Java 枚举

Java 如何在模块中创建自定义名称的数组,可以做到吗?

java - Hibernate 多态查询

seo - 将购物车系统放置在网站根目录以外的目录中会影响 SEO/google 排名吗?