HttpSessionAttributeListener混淆

时间:2012-09-24 19:10:36

标签: servlets

我正在阅读有关HttpSessionAttributeListener的内容,这是我做的一个小例子。 我有一个疑问。代码如下:

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;
  }
}

混淆是当我运行这个程序时,监听器调用添加的属性和 完全取代。当我取消注释我的servlet中的代码并发表评论时

d.setName("Adam")

被替换的属性会被调用。但名字的价值只有彼得。为什么 就是它?什么原因?另一个问题是什么时候我们使用HttpSessionAttributeListener 特别是HttpSessionListener。任何实际用法?

谢谢, 彼得

1 个答案:

答案 0 :(得分:1)

因为the javadoc说:

  

返回已添加,删除或删除的属性的值   更换。如果属性已添加(或绑定),则此值为   属性。如果属性已被删除(或未绑定),则为   已删除属性的值。如果替换了属性,则为   属性的旧值。

在第一种情况下,旧值和新值相同,因此您会看到新的狗名称。

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