【问题标题】:session listener - valueBound or valueUnbound doesn't called会话侦听器 - 未调用 valueBound 或 valueUnbound
【发布时间】:2013-10-18 14:01:28
【问题描述】:

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

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.对象)”

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

谢谢

【问题讨论】:

    标签: jakarta-ee servlets httpsession


    【解决方案1】:

    简答

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

    如果TestValue 实现了HttpSessionBindingListener,则将调用valueBound 方法。

    更长的解释

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

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

    HttpSessionBindingListener 是容器的意思:“嘿TestValue,您已被添加到会话中”

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

    所以,如果TestValue 实现HttpSessionBindingListener,它会在添加到会话时调用 valueBound:

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

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

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

    另见:Practical Usage of HttpSessionBindingListener And HttpSessionAttributeListener

    【讨论】:

    • 谢谢。但就我的情况而言,我不明白“如何直接添加到会话本身”,因为我看不到(在其文档中 - docs.oracle.com/javaee/5/api/javax/servlet/http/…)除 addAttribute(...) 一个之外的任何相关“添加”方法:S您的意思是不推荐使用的 putValue(...,...) 方法?
    • setAttribute 会触发 valueBound,removeAttribute(或会话到期)会触发 valueUnbound。
    • "会触发" ?你是什​​么意思?你的意思是他们被链接和同步或什么?请提供更多详细信息,因为我不明白应该使用 putValue(...,...) 而不是 setAttribute(...,...)
    • “将触发”,我的意思是“将导致”,因为通过实现该接口,通知对象是容器的工作。 putValue (如您所指出的)已被弃用,因此您应该使用 setAttribute 将对象添加到会话中。
    • 是的。所以我做了。但我有 HttpSessionAttributeListener 方法只工作:( 但是为什么?
    猜你喜欢
    • 2012-10-07
    • 2012-04-30
    • 2019-07-25
    • 2019-01-26
    • 1970-01-01
    • 2012-04-08
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多