action中的代码如下:
[code="java"]
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
import ez.store.pojo.Book;
import ez.store.pojo.User;
import ez.store.service.UserService;
import ez.store.util.CartItem;
public class OrderCartItemAction extends ActionSupport implements SessionAware{
private UserService userService;
private Map session;
private CartItem ci;
public Map getSession() {
return session;
}
public void setSession(Map session) {
this.session = session;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
// 用于将商品放到购物车里面
public String addBookToCart() {
HttpServletRequest request = ServletActionContext.getRequest();
Book book = (Book) session.get("book");
int score = user.getScore();
String bname = book.getBname();
double price = book.getPrice();
int amount = Integer.parseInt(request.getParameter("amount"));
ci=new CartItem();
Date date = new Date();
Map map = new HashMap();
ci.setBname(bname);
ci.setPrice(price);
ci.setAmount(amount);
map.put(date,ci);
session.put("list",map);
return "success";
}
}
[/code]
然后就在jp页面接受"list"的值用c:if迭代,但是现在每次只能添加一个商品信息进购物车,且第二次添加的会把第一次添加的给覆盖掉。问题好像是因为每次调用这个action都会重新去new一次,但是就是不知道该如何解决?求指点。
List list = null;
Object obj = session.get("list");
if(obj != null){
list = (List) obj;
}else{
list = new ArrayList();
session.put("list",list);
}
//list.add 商品
......
购物车中只能添加一个商品,第二次添加就会把第一次给覆盖掉了,怎么办?
你的用法也是不对的
ci=new CartItem();
Date date = new Date();
Map map = new HashMap();
ci.setBname(bname);
ci.setPrice(price);
ci.setAmount(amount);
map.put(date,ci);
session.put("list",map);
应该是这样的
List list = ...;
session.put("cartList", list);
购物车 添加产品算法一般是:
0、首先从如cookie/session中获取list,如果没有new一个新的放入
1、检查list有没有 如果没有创建一个
2、否则 获取该商品并增加数量
3、保存list到cookie/session中
因为每一次都新Map map = new HashMap();了一下,所以Session里面当然只存在一条。
应该先从Session里面取出来list,然后再往里面追加。
当然,要判断物品是否已经购买过
我觉得应该在数据库中保存购物车信息,而不仅仅在session中保持,这样可以查询数据库获取已选购的商品再最近现在选购的商品。
个人觉得你的HashMap map = new HashMap()这里不应该new一个新的map,而应该从session中取出map。
如果是认为的每一次访问action类都会被new一个新的对象:
struts2的action是多例的,意思就是每一次访问都会重新new一个该action类的对象,这样是为了简化多线程的编程,所过你使用了spring容器来管理action,那可以通过配置scope的值来配置action为session级别的单例,这样同一个session的同一个action只有一个对象,也就不会出现你所说的覆盖问题,但是没有用spring的话,可以每次购物的数值都存进数据库,或者如“jinnianshilongnian”所说的那4条去做。
给你一个免费下载源码csdn的地址,里面有一个完整的购物车项目,你可以下载来参考一下,有你说的bug解决:http://download.csdn.net/detail/tianyazaiheruan/4778368
购物车的功能用Cookie来做的,购物车的信息还要保存在数据库的
1、用户没有登录
Cookie[] cookies = ServletActionContext.getRequest().getCookies();
遍历cookies,判断
1,1、如果它不为空或长度大于0,将Cookie的值序列化成java对象集合,假设为previousOrderCartItemList,遍历previousOrderCartItemList,将当前商品的ID跟数据库取出来的做对比
1.1.1、如果相同,增加该Cookie的商品数量即可
1.2.1、如果不相同,追加这件商品到Cookie
1.2、如果它不存在,则把商品放进Cookie里
2、用户已经登录,直接根据用户去数据库取Cookie信息,剩下的基本相同了