Servlets HttpSessionAttributeListener混淆

Servlets HttpSessionAttributeListener混淆,servlets,Servlets,我正在阅读关于HttpSessionaDistributeListener的文章,下面是我举的一个小例子。 不过我有一个疑问。代码如下所示 public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { doPost(request,response); }

我正在阅读关于HttpSessionaDistributeListener的文章,下面是我举的一个小例子。 不过我有一个疑问。代码如下所示

public class TestServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    doPost(request,response);
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    HttpSession session = request.getSession();
    Dog d = new Dog();
    d.setName("Peter");
    session.setAttribute("test", d);
    /*Dog d1 = new Dog();
    d1.setName("Adam");
    */
    d.setName("Adam");
    session.setAttribute("test",d);
  }

}
这是我的听众课

public class MyAttributeListener implements HttpSessionAttributeListener {
  @Override
  public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
    System.out.println("Attribute Added");
    String attributeName = httpSessionBindingEvent.getName();
    Dog attributeValue = (Dog) httpSessionBindingEvent.getValue();
    System.out.println("Attribute Added:" + attributeName + ":" + attributeValue.getName());

  }

  @Override
  public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
    String attributeName = httpSessionBindingEvent.getName();
    String attributeValue = (String) httpSessionBindingEvent.getValue();
    System.out.println("Attribute removed:" + attributeName + ":" + attributeValue);


  }

  @Override
  public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
    String attributeName = httpSessionBindingEvent.getName();
    Dog attributeValue = (Dog) httpSessionBindingEvent.getValue();
    System.out.println("Attribute replaced:" + attributeName + ":" + attributeValue.getName());

  }
}
这是我的模型

public class Dog  {
  private String name ;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}
令人困惑的是,当我运行这个程序时,监听器调用added和added属性 替换得很好。当我在servlet中取消注释代码和注释时

d.setName("Adam")
被替换的属性不会被调用。但名字的价值仍然只是彼得。为什么? 是吗?原因是什么?另一个问题是什么时候使用HttpSessionAttributeListener 尤其是HttpSessionListener。有什么实际用途吗

谢谢, 彼得因为说:

返回已添加、删除或删除的属性的值 替换。如果已添加(或绑定)属性,则这是 属性。如果属性已删除(或未绑定),则这是 已删除属性的值。如果该属性已被替换,则为 属性的旧值

在第一种情况下,旧值和新值相同,因此可以看到新的狗名


HttpSessionListener用于了解会话的创建和销毁。HttpSessionAttributeListener用于识别会话中的新属性、已删除属性和已替换属性。它们非常不同。

非常感谢。我明白了你的观点,当新值被替换时,我们会按照javadoc得到属性的旧值。非常感谢:)