当前位置: 首页 > 面试题库 >

重新分配Java会话对象

陈博容
2023-03-14
问题内容

我试图通过在会话中设置项目列表来将它们发送到JSP。我在这里使用Spring控制器。

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

会话对象包含所有三个项目。

...
...

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

return "some_page";

问题:

预期: fisrt_item_list会话对象应包含3个项目。

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


问题答案:

您必须首先了解Java中的 值类型引用类型
之间的区别,然后检查以下链接http://codingdict.com/questions/3227

让我给您一个简单的值类型示例

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 aint bin 的值C1 class没有增加,因为in是primitive typein中的java(碰巧是一种值类型)值类型
的真实示例如下:
如果我给我我的标记纸的照片副本,并且在scribble上它不会对原始标记表造成任何影响,因为当您传递变量int a和int
b时,它是我的标记表的副本,这些变量的副本将发送到inc函数,因此不会增加in int aint bclass 的原始值C1

让我们看一个参考类型的例子

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在堆内存中建立一个对象of ,并且对该对象的引用存储在variable obj1of中时type C1obj1它不是object是Object of C1在堆中创建的句柄,因此当我们传入obj1inc(C1 obj1)class C2传递的是对象的句柄而不是object,对象在堆中。
所以这不是对象的副本,而是原始对象的传递,因为obj1的句柄(参考真实世界,例如前面给出的)

回答主要问题

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

在这里,您在ArrayList object中设置了session object,但对象不是字面意义上存储在会话对象中,Arraylist对象的句柄存储在会话对象中,因此,从Arraylist对象中删除值时,它会反映在会话对象中,因为您的会话对象持有Arraylist对象的句柄,该句柄仍指向从中删除值的堆中的同一对象



 类似资料:
  • 我在localhost上设置了一个分片的mongo db环境,有3个配置服务器、2个分片的mongo实例和一个mongos。 集群启动后,我运行以下命令序列: 我启用数据库进行分片,并创建一个索引等。 以上所有操作的结果都是成功的。 但是一旦我做到了:db.foo.stats() 我看到所有的数据都在一个分片中结束,而没有被分发。和运行 生产: 然而,有趣的是,如果我从一个空白集合开始,并在向其中

  • 问题内容: 我是Java的新手,因此我对对象分配有一些疑问。例如, 假设变量的测试类中定义的,我说得对假设T1和T2点到修改同一个对象会影响和?其实我测试了一下,似乎我是对的。但是,当我尝试相同的操作时,修改仅发生在不影响另一侧的一侧。这是什么原因呢? 编辑:我尝试使用String的情况。 我通过测试String的大小写来意识到我的错误,因为它是不可变的。我认为修改字符串的情况实际上是将对“ 1”

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 我试图从实际对话框控制器的视图关闭并重新打开对话框。最终发生的情况是,在对话框关闭/打开后,它不会再次正确关闭。Escape在某些浏览器上工作(但覆盖仍保留),单击背景可能会导致对话框关闭,但覆盖仍保留(取决于浏览器)。 问题:如何从对话框控制器上的函数/按钮/事件关闭/重新打开对话框,以及对话框的关闭是否正常(在转义或单击背景时)。 下面的演示只是一个简单的示例,演示了这个问题,因为我将执行下一

  • 问题内容: 我的问题如下:如何在不同Java类中的测试中重复使用浏览器会话?我打开了这样的浏览器: 然后,我必须使用一些凭据登录网站,并在登录后想执行其他测试,所以我不想为每个测试都登录,因为我需要进行很多测试并为每个用户登录花十年时间。例如,流程如下所示:登录->推送一些组件->添加一些值->生成报告。在此之后,我想在另一个组件上生成其他报告,但是当我尝试使用它时,将给出一个空指针异常。有任何想

  • 问题内容: 我正在维护Java Web应用程序。 通过登录代码,它可以通过HttpServletRequest的getSession()方法从HttpServletRequest中获取一个HttpSession。(它在会话中使用一些值进行认证) 但是,我担心会话固定攻击,因此在使用初始会话后,我想开始一个新会话或更改会话ID。这可能吗? 问题答案: Servlet 3.0 API不允许您更改现有会