购物车中只能添加一个商品,第二次添加就会把第一次给覆盖掉了,怎么办?

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信息,剩下的基本相同了