将应用程序范围中的属性理解为实例

时间:2015-03-13 17:57:37

标签: java jsp

我有两个JSP文件,每个文件都由不同的PC访问。

在第一个中,我正在创建一个Integer类型的对象:

Integer var = 0;
application.setAttribute("name_var", var);

在第二个,我得到之前创建的属性:

var = (Integer) application.getAttribute("name_var");

此时一切都很好。我在第二个JSP中,在不同的PC中具有我的价值。

由于Java是按值传递的,其中值是引用(Is Java "pass-by-reference" or "pass-by-value"?),我想我在两个JSP文件中都有相同的实例(由不同的PC访问)。

所以现在,当我修改我的var值,并且它在另一侧没有出现修改时,我不明白为什么。

var++;
Output (in the JSP where the attribute was set): 0 (still)

任何人都可以解释我发生了什么吗?每次修改其值时,是否要用setAttribute更新对象?

提前谢谢

2 个答案:

答案 0 :(得分:1)

您需要将更改后的值设置回应用程序属性,而不仅仅是var++

application.setAttribute("name_var", ++var);

原因是Integer对象的自动装箱和不变性。当您说var++时,java会将Integer解包为原始int并将其递增。但结果不属于该属性。

答案 1 :(得分:1)

var++不会更改应用程序中存储的Integer实例的内部状态。整数是不可变的。它的状态永远不变。

该操作相当于

int tmp = var.intValue();
tmp = tmp + 1;
var = Integer.valueOf(i);

所以var现在引用另一个Integer实例,而不是存储在应用程序中的实例。

另一种方法是再次将新值存储在应用程序中,或者在应用程序中存储一个线程安全的可变值:

AtomicInteger var = new AtomicInteger(0);
application.setAttribute("name_var", var);
...
var.incrementAndGet();