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

use*_*704 2 servlets java-ee httpsession

我刚刚尝试在我的测试Web应用程序中添加会话侦听器HttpSessionBindingListenerHttpSessionAttributeListener ; 它们都在我的测试对象中实现为:

public class MySessionListener implements HttpSessionBindingListener,HttpSessionAttributeListener 
{
//implemented methods...
}
Run Code Online (Sandbox Code Playgroud)

事情是...

我试过像一个代码

session.setAttribute("name",new TestValue());
Run Code Online (Sandbox Code Playgroud)

因此,我希望调用HttpSessionBindingListener事件,valueBound(...)但我只调用了HttpSessionAttributeListener一个attributeAdded(...):(

而且,关于valueUnbound(...)方法态度与我提到的完全相同,我使用的代码就像

session.removeAttribute("name");
Run Code Online (Sandbox Code Playgroud)

...但我attributeRemoved(...)只是被称为同一个:S

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

所以我不知道为什么调用valueBound(...)valueUnbound(...)不调用以及如何调用它们?

谢谢

Ami*_*r T 7

简短的回答

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

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

更长的解释

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

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

随着HttpSessionBindingListener这里是什么容器在说:"嘿TestValue,你添加到会话"

随着HttpSessionAttributeListener这里是什么容器在说:"嘿MySessionListener,属性添加到会话"

所以,如果是TestValueimplements HttpSessionBindingListener,它会在添加到会话时调用valueBound:

session.setAttribute("name",new TestValue());
Run Code Online (Sandbox Code Playgroud)

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

session.setAttribute("name", new MySessionListener());
Run Code Online (Sandbox Code Playgroud)

另见:HttpSessionBindingListener和HttpSessionAttributeListener的实际用法