Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于使用playframework实现购物车的建议_Java_Playframework_Shopping Cart - Fatal编程技术网

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

Java 关于使用playframework实现购物车的建议,java,playframework,shopping-cart,Java,Playframework,Shopping Cart,我正在学习使用playframework,通过编写代码来实现销售物品的webstore。我已经使用crud和secure模块实现了管理区域。现在,我想创建一个购物车,用户可以向其中添加物品并继续结账 我对电子商务的了解很少,但我读过一些使用servlets实现购物车和一些网店功能的教科书。在这些书中,购物车用来保存一套CartItems,每一本书都包含产品和数量的实例,用户将项目添加到购物车,购物车存储在用户会话中 因此,每当用户进入购物车详细信息页面时,它都会显示所有添加的项目。只有当会话被清

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

我对电子商务的了解很少,但我读过一些使用
servlets
实现购物车和一些网店功能的教科书。在这些书中,购物车用来保存
一套
CartItem
s,每一本书都包含
产品和
数量的实例,用户将项目添加到购物车,购物车存储在
用户会话中

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

我想,我可以使用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();
ShopCart=Cache.get(session.getId(),ShopCart.class);
Set items=cart.getCartItems();
processOrder(项目、用户信息);
...
cart.clearItems();

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

我没有太多的游戏经验!但我认为这是伟大的。你的想法应该行得通。我将为缓存的购物车对象添加超时,如中所示:

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?
}

希望这有帮助。

错了。很抱歉这么苛刻,但你所做的可能会失败得可怕

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

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

ShopCart cart = Cache.get(session.getId(),ShopCart.class);
Set<CartItem> items = cart.getCartItems();
processOrder(items,userinfo);
...
cart.clearItems();
缓存只是为了提高性能,但您不能期望它总是包含您需要的所有项目

你应该将你的购物车变成一个实体(如果它不是实体的话),并向其中添加如下内容:

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; 
}

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

这是正确的。很抱歉误导您@Damon,这不会影响性能,将shopcart中的每一项内容保存到db中?@Damon Julian不要担心性能,这不会产生明显的影响。@Damon the stateless是一种用于可伸缩性的性能策略。这就是无状态哲学的全部观点。缓存而不是会话不是一个可行的解决方案。这与Play的无状态哲学背道而驰。