我正在通过编写代码来实现销售商品的webstore
来学习使用playframework
。我使用 crud
和 secure
模块实现了Admin
区域。现在,我想创建一个用户可以向其添加项目并继续结帐的shopping cart
。
我对电子商务的了解很少,但是我已经浏览了一些使用servlets
实现购物车和一些网店功能的教科书。在书中,购物车用来保存CartItem
的Set
,每个都包含一个Product
和quantity
的实例。之后,用户将商品添加到购物车中,购物车存储在user session
中。
因此,每当用户转到购物车详细信息页面时,它都会显示所有添加的项目。仅当会话被清除时(由于服务器中定义的会话超时,或者下订单时(,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();
这是正确的方法吗?如果我的想法不正确,请帮助我提出建议。
错了。很抱歉如此苛刻,但你正在做的事情可能会失败得很惨。
游戏是无所事事的,也是无状态的。所有相关数据必须存储在数据库中。这意味着,当用户添加新项目时,您必须保留购物车的数据,并在事务完成后将其删除。
为什么无法使用缓存?因为缓存是易失性的,其中的元素可能会在没有事先警告的情况下被删除。这意味着在任何时候,您的缓存都可能返回一个空值(未找到项(,并且您在代码中得到一个 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;
}
然后使用此方法在处理之前检索购物车。
我没有太多的Play经验! 但我认为这很棒。你的想法应该可以正常工作。我会为缓存的购物车对象添加超时,如下所示:
Cache.set(session.getId(), shopcart, "30mn");
上面的代码将缓存购物车 30 分钟。
请注意,Cache.get 可能会返回 null,因此用于处理的代码应更改为:
ShopCart cart = Cache.get(session.getId(),ShopCart.class);
if (cart != null) {
Set<CartItem> items = cart.getCartItems();
processOrder(items,userinfo);
cart.clearItems();
} else {
// maybe show expired session warning?
}
此外,您可能应该在成功调用 processOrder(...( 后从缓存中删除 cart 对象。
Cache.delete(session.getId());
希望这有帮助。