我正在学习使用playframework
编写代码来实现销售商品的webstore
。我使用Admin
和{{1}实现了crud
区域} modules.Now,我想创建一个secure
用户可以添加项目并继续结帐。
我对电子商务的了解很少,但我已经阅读了一些使用shopping cart
实现购物车和一些网上商店功能的教科书。在书中,购物车用于保存servlets
Set
1}},每个包含CartItem
和Product
的实例。之后,用户将商品添加到购物车,购物车存储在quantity
。
因此,只要用户进入购物车详细信息页面,它就会显示所有添加的项目。只有当会话被清除时(由于服务器中定义的会话超时或订单下达时){ {1}}已从user session
移除。
我想,我可以在playframework中使用Cache来执行上述操作。将CartItem添加到ShoppingCart实例后。我可以
CartItem
以后,在另一页中,我可以检索购物车及其内容,处理它们并清理购物车。
ShoppingCart
这是正确的方法吗?如果我的想法不正确,请帮我提出建议。
答案 0 :(得分:13)
错误。抱歉这么严厉,但你正在做的事可能会失败。
游戏无所事事且无国籍。所有相关数据必须存储在数据库中。这意味着您必须在用户添加新项目时保留购物车的数据,并在事务完成后将其删除。
为什么不能使用缓存?因为缓存是易变的,并且可以在没有先前警告的情况下移除其中的元素。这意味着您的缓存可能随时返回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;
}
然后使用此方法在处理之前检索购物车。
答案 1 :(得分:1)
我对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());
希望这有帮助。