2

在我们使用 Struts 1 的 Java Web 应用程序中,我们有很多代码基本上是这样做的:

HttpSession session = httpServletRequest.getSession();
MyObject myObject = session.getAttribute(MY_OBJECT_KEY);

//code that mutates myObject - setting properties or whatever

session.setAttribute(MY_OBJECT_KEY, myObject);

我的问题:最后一行 session.setAttribute(..) 是否必要?这对我来说似乎毫无意义 - 'myObject' 和 'session.getAttribute(..)' 指的是内存中的同一位置,对吧?那么不需要重新设置会话中的属性吗?这有什么我不知道的吗?该对象未实现文档中提到的 HttpSessionBindingListener。

我觉得我需要仔细检查,因为这是在整个应用程序中完成的,我当然不想仅仅因为我正在清理代码而破坏任何东西。谢谢

4

2 回答 2

1

这取决于您所说的“变异”是什么意思。如果在这种情况下“变异”意味着您更改了属性,但没有更改实例,那么不,您最后不需要setAttribute

myObject是对基础对象的引用。会话有它自己的参考。它们都指向同一个底层对象,因此您将更改同一个实例的属性。

现在,如果你这样做

myObject = new MYObject();

那么您需要将新对象传递给会话。在这种情况下,您的引用myObject现在指向与会话引用不同的实例。

注意,为什么不写一个单元测试并测试它呢?

于 2012-07-27T16:26:58.810 回答
0

@emulcahy,我知道这是一篇旧帖子。我只是在研究 Servlet 侦听器时偶然发现了这一点。你找到那些“冗余” setAttribute(s) 的原因了吗?

我想知道是否将它们添加到触发 Servlet 侦听器中的事件。您可能想要检查是否有任何对象实现了 HttpSessionAttributeListener 或 HttpSessionBindingListener。它们可用于在这些会话变量中记录信息。只是一个想法。如果您已经解决了问题,请忽略此消息。

于 2012-10-01T23:23:22.803 回答