Java 理解作为实例的应用程序范围中的属性
我有两个JSP文件,每个文件都由不同的PC访问 在第一个示例中,我创建的对象类型为Java 理解作为实例的应用程序范围中的属性,java,jsp,Java,Jsp,我有两个JSP文件,每个文件都由不同的PC访问 在第一个示例中,我创建的对象类型为Integer: Integer var = 0; application.setAttribute("name_var", var); 在第二个示例中,我将获得之前创建的属性: var = (Integer) application.getAttribute("name_var"); 在这一点上,一切都很好。我在另一台PC中的第二个JSP中得到了我的值 由于Java是按值传递的,其中的值是references
Integer
:
Integer var = 0;
application.setAttribute("name_var", var);
在第二个示例中,我将获得之前创建的属性:
var = (Integer) application.getAttribute("name_var");
在这一点上,一切都很好。我在另一台PC中的第二个JSP中得到了我的值
由于Java是按值传递的,其中的值是references(),我想我在两个JSP文件中都有相同的实例(被不同的PC访问)
所以现在,当我修改我的var值时,它在另一边没有被修改,我不明白为什么
var++;
Output (in the JSP where the attribute was set): 0 (still)
有人能解释一下发生了什么事吗?每次修改对象的值时,是否必须使用setAttribute
更新对象
提前感谢您您需要将更改后的值设置回应用程序属性,而不仅仅是
var++
:
application.setAttribute("name_var", ++var);
原因是
Integer
对象的自动装箱和不变性。当您说var++
时,java将整数
解压为一个原语int
,并将其递增。但是结果不会进入属性。var++
不会更改存储在应用程序中的整数实例的内部状态。整数是不可变的。它的状态永远不会改变
该操作相当于
int tmp = var.intValue();
tmp = tmp + 1;
var = Integer.valueOf(i);
因此var
现在引用的是另一个整数实例,而不是存储在应用程序中的实例
另一种方法是在应用程序中再次存储新值,或者在应用程序中存储线程安全的可变值:
AtomicInteger var = new AtomicInteger(0);
application.setAttribute("name_var", var);
...
var.incrementAndGet();
这里发生了一些奇怪的事情。不是开玩笑-为什么显示我回答了两次?@gknicker StackOverflow可能将答案计数存储为应用程序中的整数,并认为增加它会更改应用程序属性:)也感谢解释@gknicker感谢解释,以及AtomicInteger类。这将非常有用=)