gpt4 book ai didi

重新分配 Java session 对象

转载 作者:行者123 更新时间:2023-11-29 07:31:02 24 4
gpt4 key购买 nike

我试图通过在 session 中设置项目列表来将它们发送到 JSP。我在这里使用 Spring Controller 。

List<Item> l = new ArrayList<Item>();
l.add("item1");
l.add("item2");
l.add("item3");
session.setAttribute("fisrt_item_list", l); // So the fisrt_item_list

session 对象包含所有三个项目。

...
...

// Somewhere down the code, l.remove(2); //removing item3.

return "some_page";

问题:

预期 fisrt_item_list session 对象应包含 3 个项目。

实际: session 中只有 2 个项目可用,因为删除第三个项目更新了 session 对象。但我从未将更新后的 l 对象添加到 session 中。为什么 java 在返回页面之前重新分配 session 对象?那么,我是否需要将 l 复制到另一个列表并使用它?

最佳答案

你必须首先了解Java中Value TypeReference Type的区别,查看以下链接StackOverflow

let me give you a simple example of Value Type

MAIN.java :

class Main{
public static void main(String [] args){
C1 obj1 = new C1();
obj1.print();
obj1.increment();
obj1.print();
}
}

C1.java:

class C1{
int a = 10;
int b = 20;

public C1(){
}
void increment(){
System.out.println("incrementing a and b");
new C2().inc(a,b);
}
void print(){
System.out.println("Value of a "+ a);
System.out.println("Value of b "+ b);
}
}

C2.java

class C2{
void inc(int a, int b){
a++;
b++;
}
}

输出

Value of a 10
Value of a 20
incrementing a and b
Value of a 10
Value of a 20

结论

int a 的值和 int bC1 class没有递增,因为 in 是 primitive type在java中(恰好是一个值类型)
值类型的真实世界示例如下:
如果我给你我的标记表的照片副本,如果你在上面涂鸦,原始标记表不会发生任何事情,因为它是我的标记表的副本,当你传递变量 int a 和 int b 时,这些变量的副本被发送到 inc 函数,因此它不会增加 int a 中的原始值和 int b C1类

let us see an example for reference type

MAIN.java :

class Main{
public static void main(String [] args){
C1 obj1 = new C1();
obj1.print();
C2.inc(obj1);
obj1.print();
}
}

C1.java:

class C1{
int a = 10;
int b = 20;

public C1(){
}

void print(){
System.out.println("Value of a "+ a);
System.out.println("Value of b "+ b);
}
}

C2.java

class C2{
public static void inc(C1 obj1){
obj1.a++;
obj1.b++;
}
}

输出

Value of a 10
Value of a 20
incrementing a and b
Value of a 11
Value of a 21

结论

这里 int a 和 int b 的原始值被递增,因为传递了对该对象的引用
当我们说 C1 obj1 = new C1();关键字 new 成为 class C1 的对象在堆内存上,对该对象的引用存储在 variable obj1 中的 type C1 , obj1不是对象它是 Object of C1 的句柄在堆中创建,所以当我们通过 obj1inc(C1 obj1)class C2我们传递对象的句柄而不是对象,对象在堆中
所以这不是对象的副本,而是原始对象因为句柄 obj1 而被传递(引用到现实世界,例如前面给出的)

Answer to the main question

List<Item> l = new ArrayList<Item>();
l.add("item1");
l.add("item2");
l.add("item3");
session.setAttribute("fisrt_item_list", l);

在这里你设置了ArrayList objectsession object ,但对象并没有真正存储在 session 对象中,Arraylist 对象的句柄存储在 session 对象中,因此当从 Arraylist 对象中删除一个值时,它反射(reflect)在 session 对象中,因为您的 session 对象持有句柄到 Arraylist 对象,它仍然指向从中删除值的堆上的同一个对象

Note : One object holding the reference to another object is Called Object Composition , do check this link StackOverflow

关于重新分配 Java session 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42606099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com