现在有个问题 
有一个arrlylist 然后放到session 里 
在另一个 action 里我掉用 这个 session 把 arrliylist 取出来 放到 两个变量 A和B里 
然后我需要把A和B再次放到 sessionA 和sessionB 中,然后迁移到另一个画面修改sessionA 
但是,在修改后 
我如果不想保存就返回原来画面 
我想直接调用SessionB ,这样就可以显示最初的值了 
我是这么想的 
但是实现起来有问题,就是修改了sessionA后sessionB的值也变了,变的和A一样 
有没有办法能把SessionB的值保存起来 
然后无论怎么修改sessionA ,SessionB里的arrliylist内容都不改变? 
我试着用static 方法声明变量,然后赋值,但是也还是不好用~~~ 
我用setter &getter  也是不好用~~~ 
谁能帮我 
小弟分少~~~ 
在此全部奉上~~~ 
不尽感激~~~

解决方案 »

  1.   

    sessionA,sessionB也是session?不太清除楼主想说的具体什么意思
      

  2.   

    难道就那么难懂吗~~
    help~~~~~
      

  3.   

    呵呵
    其实我也晕~~
    说白了 
    我就想保存个session
    就算修改这个session所引用的值
    也要保证这个session的内容不变~~~
      

  4.   

    你先把值取出来,然后修改,如果想保存,就保存,不想保存就不保存不就可以啦。String sessionA=(String)ActionContext.getContext().getSession.get("name");
    sessionA="A";
    ActionContext.getContext().getSession.put("name",sessionA);//cheng the value in session
      

  5.   

    未完待续兄
    (String)ActionContext.getContext().getSession.get("name");
    里的ActionContext和getContext是什么
    能自动取出来吗 
    我在我struts工程中(eclipse)提示ActionContext cannot be resolved
    是自己定义的方法吗?
    请宽恕小弟的无知~~~
    真的不明白~~
      

  6.   

    我要是直接
    Arrlylist A=(Arrlylist)request.getSession().setAttribute("A",“itm_tmp”);
    Arrlylist B=(Arrlylist)request.getSession().setAttribute("B",“itm_tmp”);
    然后我在另一个页面取出A去修改
    Arrlylist  Arr_tmp = (Arrlylist)request.getSession().getAttribute("A");
    进过修改后
    我觉得不好
    决定不改了
    我可以直接掉Arrlylist  Arr_tmp_b = (Arrlylist)request.getSession().getAttribute("B");
    因为这个一直没修改啊
    可是现在的问题就是改了A后B也变的和A一样
    有什么办法可以解决吗 ~~~~~~~~~~~~~~~~
      

  7.   

    你把变量名改成不同的就行了,- -Arrlylist A=(Arrlylist)request.getSession().setAttribute("A",“itm_tmp1”); 
    Arrlylist B=(Arrlylist)request.getSession().setAttribute("B",“itm_tmp2”); 
      

  8.   

    可是我要储存的都是一个啊 
    在这之前我new 了2 个变量 A_tmp和B_tmp
    来分别储存 itm_tmp;
    然后在把
    Arrlylist A=(Arrlylist)request.getSession().setAttribute("A",“ A_tmp”); 
    Arrlylist B=(Arrlylist)request.getSession().setAttribute("B",“ B_tmp”); 
    这样都不灵哦~~~
    要是修改了A
    B还是会相应的改变的啊
    我debug一看当时就傻B了
    哎~~~~
    兄弟们帮帮我吧
    要不我就郁闷死了~~
    help~~~help~~~~help~~~
      

  9.   

    迷糊 。和看谜语一样
    lz可以把两个变量保存到session中
    原来的ArrayList  al1
    做一个copy 为al2=al1
    不必要用俩session吧
      

  10.   

    不能用Static是因为,Static声明的变量在内存中只有一份,你改变任何一个引用这个变量的象时,这个变量就会随着变化。在不用Static的情况下,你New出两个对象来保存ArrayList的值,但不要改动ArrayList就可以实现你上面的想法。
      

  11.   

    10楼中,你没有用New关键字,所以你的对象都指向Session中的引用,改变一下,两个都变了,你先New一下,再赋值应该就可以了。
      

  12.   

    哎~~~
    让你们迷糊了 
    我代码贴出来吧
    ArrayList<Corp_Info> itm_tmp = new ArrayList<Corp_Info>();
    //这个“ iteminfo_tmp”就是最初的arrlylist,也是我需要保存的
    itm_tmp = (ArrayList<Corp_Info>)request.getSession().getAttribute("iteminfo_tmp");
    //同时分别放在两个不同的session里面
    request.getSession().setAttribute("iteminfo_tmp","itm_tmp ");
    request.getSession().setAttribute("iteminfo_tmp_for_bak","itm_tmp ");
    //然后跳转到另一个页面操作
    return mapping.findForward("edit_show");
    //在edit_show页面里,我要取出iteminfo_tmp来操作
    ArrayList<Corp_Info> itm_tmp_for_edit = (ArrayList<Corp_Info>)request.getSession().getAttribute("iteminfo_tmp");
    //经过很多操作,但是我忽然不想要了。于是点击返回,在返回方法里面我调用上面那个“ iteminfo_tmp_for_bak”
    request.getSession().removeAttribute("iteminfo_tmp");
    //在new个类型
    ArrayList<Corp_Info> itm_tmp = new ArrayList<Corp_Info>();
    itm_tmp = (ArrayList<Corp_Info>)request.getSession().getAttribute("iteminfo_tmp_for_bak");
    //这里应该就是最初的那个没经过改变的Arrlylist了吧!但是,结果很痛心~~,用debug看了下里面的值已经改变,变的和“ itm_tmp_for_edit ”里面的一样了 
    我的问题就是怎么菜能吧最初的那个保存起来,但用户点击返回的时候,能显示出没被修改的值~~~
      

  13.   


    import java.io.ObjectInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ObjectOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;public class Test {
    public static Object deepClone(Object target) {
    Object retValue = null;
    try {
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(bo);
    os.writeObject(target);

    ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(bo.toByteArray()));
    retValue = is.readObject();


    } catch(IOException e){
    e.printStackTrace();
    } catch(ClassNotFoundException e){
    e.printStackTrace();
    }
    return retValue;
    }

    public static void main(String[] args) throws Exception {
    java.util.ArrayList list = new java.util.ArrayList();
    list.add(1);
    System.out.println(deepClone(list));
    list.add(2);
    System.out.println(list);
    }}
    用深复制,把sessionA里的list,和原来的list得引用切断,成为一个独立的个体。
      

  14.   

    ArrayList<Corp_Info> itm_tmp = new ArrayList<Corp_Info>(); 
    ArrayList<Corp_Info> iteminfo_tmp_for_bak = new ArrayList<Corp_Info>();
    itm_tmp = (ArrayList <Corp_Info>)request.getSession().getAttribute("iteminfo_tmp");
    iteminfo_tmp_for_bak = itm_tmp;
    request.getSession().setAttribute("iteminfo_tmp","itm_tmp"); 
    request.getSession().setAttribute("iteminfo_tmp_for_bak","iteminfo_tmp_for_bak"); 
    return mapping.findForward("edit_show"); 
    ArrayList <Corp_Info> itm_tmp_for_edit = (ArrayList <Corp_Info>)request.getSession().getAttribute("iteminfo_tmp"); 
    request.getSession().removeAttribute("iteminfo_tmp"); 
    itm_tmp = (ArrayList <Corp_Info>)request.getSession().getAttribute("iteminfo_tmp_for_bak"); 
      

  15.   

    你的sessionA和sessionB是一个什么说得不是很清晰,不过可以这样想想。如果她们都是两个变量那么要实现你所说的效果只需要把他们都放入request作用域中就可以了。如果你指的是两个session的话就必须用一些非常特殊的方式来出来,因为原则上你一次会话只能拥有一个session而创建session的动作你是不会有的,并且不同的web服务器session的实现方式也不一定相同。除非你通过一些比较特殊的手段去实现,比如说在tomcat中,请求就是用隐藏的sessionId用来标识
      

  16.   

    晕倒了,楼主,你注意一下哦,arraylist是指的一块内存地址,你A和B中存放的都是同一地址的肯定不行啦。
    你应该new两个arraylist出来,然后分别存储至SESSION,或者将值复制到另一个arrayList中存储就可以了。
      

  17.   

    两个session指的是同一块内存,所以改一个 另一个也改了 
    你可以使用 对象克隆 clone();把克隆的给另一个
      

  18.   

    经过一番深刻的验证~~clone 不灵
    代码如下
    ArrayList<Corp_Info> itm_tmp = (ArrayList<Corp_Info>)request.getSession().getAttribute("iteminfo_tmp");
    ArrayList<Corp_Info> itm_tmp_for_bak  = new ArrayList<Corp_Info>();  
    itm_tmp_for_bak=(ArrayList<Corp_Info>)itm_tmp.clone();
    request.getSession().setAttribute("itm_tmp_for_bak_sess", itm_tmp_for_bak);
    //////////////调用的方法~~~~~
    request.getSession().removeAttribute("iteminfo_tmp");
    (ArrayList<Corp_Info>)request.getSession().getAttribute("iteminfo_tmp_for_bak");
    ArrayList<Corp_Info> itm_tmp_for_bak  = (ArrayList<Corp_Info>)request.getSession().getAttribute("itm_tmp_for_bak_sess");
    request.getSession().setAttribute("iteminfo_tmp",itm_tmp_for_bak);
     结果还是变了~~~
    至于深复制 我一炮就报异常~~~
    java.io.NotSerializableException
    就这个异常~~~
    “implements java.io.Serializable”这样做也有~~
    没办法了~~哎~~~~
    谁还有什么好的主意  帮帮忙~~
      

  19.   

    上面多写了(ArrayList <Corp_Info>)request.getSession().getAttribute("iteminfo_tmp_for_bak"); 
    别误导大家了~~~
      

  20.   

    ArrayList<Corp_Info> itm_tmp = new ArrayList<Corp_Info>();
    //传过来的
    itm_tmp = (ArrayList<Corp_Info>)request.getSession().getAttribute("iteminfo_tmp");
    //new 2个
    ArrayList<Corp_Info> itm_tmp_for_bak  = new ArrayList<Corp_Info>();
    ArrayList<Corp_Info> itm_tmp_for_edit  = new ArrayList<Corp_Info>();  
    //分别赋值
    itm_tmp_for_bak=itm_tmp;
    itm_tmp_for_edit=itm_tmp;
    //分别放入~~
    request.getSession().setAttribute("itm_tmp_for_bak_sess", itm_tmp_for_bak);
    request.getSession().setAttribute("iteminfo_tmp", itm_tmp_for_edit);
    ////
    结果还是失败~~~~~~~~~~~~
    救命啦~~~~~~~~~~~~
      

  21.   

    你虽然写了两个arraylsit,或两sessioin,但指向的都是同一个内存地址,改变和显示的都是同一个对象,当然会出现那种情况。你试试arraycopy();
      

  22.   

    arraycopy好像只能用在数组上吧~~?
    我那个list里面是一个bean的类型啊
      

  23.   


    一开始以为"itm_tmp"改成new String("itm_tmp")就可以
    不过setAttribute方法有返回值吗?
      

  24.   

    package pack;
    import java.util.ArrayList;
    public class CloneTest {
    public static void main(String[] args){
    ArrayList<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    System.out.println(list);
    ArrayList<String> list1 = list;
    list1.remove(0);
    System.out.print(list);
    System.out.println(list1);
    ArrayList<String> list2 = (ArrayList<String>)list.clone();
    list.remove(0);
    System.out.print(list);
    System.out.println(list2);
    }
    }
    用clone没有问题呀,你可以试下这个application
    输出
    [1, 2, 3]
    [2, 3][2, 3]
    [3][2, 3]
      

  25.   

    clone没问题~~~
    但是要是同时引用的session里的值好像就哟问题了 
    我试了~~~
    现在感谢大家的帮助
    结贴~~
    解决了
    我先吧list里的object放到个object的数组里
    在吧数组放到个新的list里
    其实这里rainsilence的理论是对的
    就是要切断源和后来备份的关系·~~
    谢谢诶 大家 结贴