gpt4 book ai didi

jakarta-ee - session 监听器 - 不调用 valueBound 或 valueUnbound

转载 作者:行者123 更新时间:2023-12-02 07:33:33 24 4
gpt4 key购买 nike

我刚刚尝试在我的测试网络应用程序 HttpSessionBindingListener 中添加 session 监听器和 HttpSessionAttributeListener那些;它们都在我的测试对象中实现为:

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

事情是...

我试过这样的代码

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

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

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

session.removeAttribute("name");

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

我想试试 putValue()方法,但现在我正在看 HttpSession 文档,其中说“不推荐使用 putValue。从 2.2 版开始,此方法已替换为 setAttribute(java.lang.String, java.lang.Object)”

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

谢谢

最佳答案

简答

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

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

更长的解释

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

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

使用 HttpSessionBindingListener 容器会说:“嘿 TestValue,您已添加到 session 中”

使用 HttpSessionAttributeListener 容器会说:“嘿 MySessionListener,一个属性已添加到 session 中”

因此,如果 TestValue 实现了 HttpSessionBindingListener,它会在添加到 session 时调用 valueBound:

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

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

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

另见:Practical Usage of HttpSessionBindingListener And HttpSessionAttributeListener

关于jakarta-ee - session 监听器 - 不调用 valueBound 或 valueUnbound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19302055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com