我正在通过编写代码来学习使用 playframework
来实现用于销售商品的 webstore
。我已经使用 Admin
区域实现了 crud
和 secure
模块。现在,我想创建一个购物车
,用户可以向其中添加商品并继续结帐。
我对电子商务的了解很少,但我已经阅读了一些使用 servlet
实现购物车和一些网上商店功能的教科书。在书中,购物车用于保存一个 Set
的 CartItem
,每个都包含一个 Product
和 quantity
的实例。在用户将商品添加到购物车之后,购物车存储在 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/