//下面的方法是用一商品ActionForm 放入购物车中.
public void putIntoCart(CartGoodsForm cartGoodF,HttpServletRequest request){
System.out.println("2:"+cartGoodF.getGoodsid()+","+cartGoodF.getName()+","+cartGoodF.getProducer()+","+cartGoodF.getNumber());
HttpSession httpSession=request.getSession();
List stockGoodsList=(List)httpSession.getAttribute("stocklist");
//CartGoodsForm good=(CartGoodsForm)stockGoodsList.get(0);
//System.out.println("cart.do:"+good.getGoodsid()+","+good.getName()+","+good.getProducer()+","+good.getNumber());
if(stockGoodsList==null){
stockGoodsList=new ArrayList(); 
stockGoodsList.add(cartGoodF);
httpSession.setAttribute("stocklist",stockGoodsList);
CartGoodsForm cgf=(CartGoodsForm)stockGoodsList.get(0);
System.out.println("3:"+cgf.getGoodsid()+" , "+cgf.getName()+","+cgf.getNumber());
}else{
boolean isexist=false;
//System.out.println("else----1");
for(int i=0;i<stockGoodsList.size();i++){
//System.out.println("for here----"+i);
CartGoodsForm stkgood=(CartGoodsForm)stockGoodsList.get(i);
System.out.println("4:stkgood:"+stkgood.getGoodsid()+" , "+stkgood.getName()+","+stkgood.getNumber());
System.out.println("5:cartGoodF:"+cartGoodF.getGoodsid()+" , "+cartGoodF.getName()+","+cartGoodF.getNumber());
if(stkgood.getGoodsid().equals(cartGoodF.getGoodsid())){
stkgood.setNumber(stkgood.getNumber()+cartGoodF.getNumber());
stockGoodsList.set(i,stkgood);
httpSession.setAttribute("stocklist",stockGoodsList);
System.out.println("InstorageDAO:stockGoodsList.size():"+stockGoodsList.size()+">>已经存在GOODID");
isexist=true;
System.out.println("here----isexist:"+isexist);
break;
}
}
if(isexist==false){
stockGoodsList.add(cartGoodF);
httpSession.setAttribute("stocklist",stockGoodsList);
System.out.println("InstorageDAO:stockGoodsList.size():"+stockGoodsList.size()+">>不存在GOODID");
}
/* stockGoodsList.add(cartGoodF);
httpSession.setAttribute("stocklist",stockGoodsList);*/

}
}//可是不知道为什么,每当新放入一个商品时,原来session中已经购买的商品被新商品覆盖了,也就是说,购物车中永远只有一条商品记录.如果把上面的全部注释,而只用红色部分,结果是,商品记录是可以有多条,但是每条商品记录却是一样的,且为最后一次购买的商品记录.哪位大哥懂得是什么原因的吗?搞了一整天了.不知道问题在哪.....大伙帮帮忙.

解决方案 »

  1.   

    import java.util.ArrayList;
    import java.util.List;public class A {
    private String id; //声明一个属性

    //set get 方法
    public String getId() {
    return id;
    }
    public void setId(String id) {
    this.id = id;
    } //测试
    public static void main(String[] args) {

    //new一个A的对象,并为属性赋值
    A a=new A();
    a.setId("aaaaa");
    //new一个list,并将A对象放进去
    List list=new ArrayList();
    list.add(a);
    //从list中取出A对象
    a=(A) list.get(0);
    System.out.println(a.getId());
    //改变a对象属性,此处不用list.set()
    a.setId("bbbbb");
    System.out.println(a.getId());
    //结果是aaaaa      bbbbb
    }
    }这是一个小例子,你可以看一看,list等集合类存放对象的方式是存放对象的引用,也就是说在一般情况下当对象改变时不需要list.set()方法对list中对象进行替换,我的理解就是你的程序中,虽然新添加的商品cartGoodF是不同的商品,但使用的是同一个CartGoodsForm类,所以list中只会每次自动覆盖原cartGoodF(即使你不做stockGoodsList.set(i, stkgood);)解决方案你自己想办法吧。
    我不敢保证我说的100%正确,但我敢保证我说的内容中100%有误差,呵呵!
      

  2.   

    List 接口不但以位置序列迭代的遍历整个列表,还能处理集合的子集。关于在java中List取值的方法(List中是数据对象)!        
            Iterator i = list.iterator();list 是已填充好对象的list
            Jobdicuser2 user= new Jobdicuser2();Jobdicuser2是一个数据对象
            while(i.hasNext())
            {
                user = (Jobdicuser2)i.next();
                xb =user.getXb();
                xl =user.getPycc();    
            }  
      

  3.   

    是不是你set(i, stkgood)的问题?
    这个i好像并不是要覆盖第i个对象,而是把i向后移,把新对象放到第i个.
      

  4.   

    set(i, stkgood)这个有问题
    改变对象的值不需要这个方法