2

我刚刚尝试在我的测试网络应用程序中添加会话侦听器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(...)orvalueUnbound(...)不调用以及如何调用它们?

谢谢

4

1 回答 1

7

简短的回答

valueBound 没有被调用,因为MySessionListener不是被添加到会话的对象。

如果TestValue实现HttpSessionBindingListener它的valueBound方法将被调用。

更长的解释

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

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

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

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

因此,如果TestValueimplements HttpSessionBindingListener,它会在添加到会话时调用 valueBound :

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

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

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

另请参阅:HttpSessionBindingListener 和 HttpSessionAttributeListener 的实际用法

于 2013-10-10T17:16:10.263 回答