现在有个问题
有一个arrlylist 然后放到session 里
在另一个 action 里我掉用 这个 session 把 arrliylist 取出来 放到 两个变量 A和B里
然后我需要把A和B再次放到 sessionA 和sessionB 中,然后迁移到另一个画面修改sessionA
但是,在修改后
我如果不想保存就返回原来画面
我想直接调用SessionB ,这样就可以显示最初的值了
我是这么想的
但是实现起来有问题,就是修改了sessionA后sessionB的值也变了,变的和A一样
有没有办法能把SessionB的值保存起来
然后无论怎么修改sessionA ,SessionB里的arrliylist内容都不改变?
我试着用static 方法声明变量,然后赋值,但是也还是不好用~~~
我用setter &getter 也是不好用~~~
谁能帮我
小弟分少~~~
在此全部奉上~~~
不尽感激~~~
有一个arrlylist 然后放到session 里
在另一个 action 里我掉用 这个 session 把 arrliylist 取出来 放到 两个变量 A和B里
然后我需要把A和B再次放到 sessionA 和sessionB 中,然后迁移到另一个画面修改sessionA
但是,在修改后
我如果不想保存就返回原来画面
我想直接调用SessionB ,这样就可以显示最初的值了
我是这么想的
但是实现起来有问题,就是修改了sessionA后sessionB的值也变了,变的和A一样
有没有办法能把SessionB的值保存起来
然后无论怎么修改sessionA ,SessionB里的arrliylist内容都不改变?
我试着用static 方法声明变量,然后赋值,但是也还是不好用~~~
我用setter &getter 也是不好用~~~
谁能帮我
小弟分少~~~
在此全部奉上~~~
不尽感激~~~
help~~~~~
其实我也晕~~
说白了
我就想保存个session
就算修改这个session所引用的值
也要保证这个session的内容不变~~~
sessionA="A";
ActionContext.getContext().getSession.put("name",sessionA);//cheng the value in session
(String)ActionContext.getContext().getSession.get("name");
里的ActionContext和getContext是什么
能自动取出来吗
我在我struts工程中(eclipse)提示ActionContext cannot be resolved
是自己定义的方法吗?
请宽恕小弟的无知~~~
真的不明白~~
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一样
有什么办法可以解决吗 ~~~~~~~~~~~~~~~~
Arrlylist B=(Arrlylist)request.getSession().setAttribute("B",“itm_tmp2”);
在这之前我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~~~
lz可以把两个变量保存到session中
原来的ArrayList al1
做一个copy 为al2=al1
不必要用俩session吧
让你们迷糊了
我代码贴出来吧
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 ”里面的一样了
我的问题就是怎么菜能吧最初的那个保存起来,但用户点击返回的时候,能显示出没被修改的值~~~
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得引用切断,成为一个独立的个体。
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");
你应该new两个arraylist出来,然后分别存储至SESSION,或者将值复制到另一个arrayList中存储就可以了。
你可以使用 对象克隆 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”这样做也有~~
没办法了~~哎~~~~
谁还有什么好的主意 帮帮忙~~
别误导大家了~~~
//传过来的
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);
////
结果还是失败~~~~~~~~~~~~
救命啦~~~~~~~~~~~~
我那个list里面是一个bean的类型啊
一开始以为"itm_tmp"改成new String("itm_tmp")就可以
不过setAttribute方法有返回值吗?
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]
但是要是同时引用的session里的值好像就哟问题了
我试了~~~
现在感谢大家的帮助
结贴~~
解决了
我先吧list里的object放到个object的数组里
在吧数组放到个新的list里
其实这里rainsilence的理论是对的
就是要切断源和后来备份的关系·~~
谢谢诶 大家 结贴