会话侦听器 - 不调用valueBound或valueUnbound

时间:2013-10-10 17:10:14

标签: java-ee servlets httpsession

我刚尝试在我的测试网络应用中添加会话监听器HttpSessionBindingListenerHttpSessionAttributeListener; 它们都在我的测试对象中实现为:

public class MySessionListener implements HttpSessionBindingListener,HttpSessionAttributeListener 
{
//implemented methods...
}

事情是......

我尝试了像

这样的代码
session.setAttribute("name",new TestValue());

因此,我希望将HttpSessionBindingListener事件称为valueBound(...),但我仅将HttpSessionAttributeListener一个称为attributeAdded(...) :(

此外,关于valueUnbound(...)方法态度与我提到的完全相同,我使用的代码如

session.removeAttribute("name");

...但是我得到了所有相同的attributeRemoved(...)仅被调用:S

我想尝试使用putValue()方法,但现在我正在观看HttpSession文档,其中说“putValue已弃用。从版本2.2开始,此方法被setAttribute(java.lang.String,java。 lang.Object)“

所以我不明白为什么valueBound(...)valueUnbound(...)没有调用以及如何调用它们?

由于

1 个答案:

答案 0 :(得分:7)

简短回答

未调用valueBound,因为MySessionListener不是要添加到会话中的对象。

如果TestValue已实施HttpSessionBindingListener,则会调用valueBound方法。

更长的解释

HttpSessionBindingListener用于通知对象它正被添加到会话中。

HttpSessionAttributeListener用于(如您所发现的)从会话中添加/删除的属性。

这里有HttpSessionBindingListener容器所说的内容:“嘿TestValue,你被添加到会话中”

这里有HttpSessionAttributeListener容器所说的内容:“Hey MySessionListener,一个属性被添加到会话中”

因此,如果TestValue实现HttpSessionBindingListener,则在添加到会话时会调用valueBound:

session.setAttribute("name",new TestValue());

在您的情况下,如果您向会话添加了MySessionListener的实例(不是您想要的,但因为它实现了HttpSessionBindingListener),它会调用valueBound方法添加到会话时:

session.setAttribute("name", new MySessionListener());

另见:Practical Usage of HttpSessionBindingListener And HttpSessionAttributeListener