我刚尝试在我的测试网络应用中添加会话监听器HttpSessionBindingListener和HttpSessionAttributeListener; 它们都在我的测试对象中实现为:
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(...)
没有调用以及如何调用它们?
由于
答案 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