0

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

混乱は、このプログラムを実行すると、リスナーが追加された属性を完全に呼び出して置き換えたことです。サーブレットのコードのコメントを外してコメントすると

d.setName("Adam")

置き換えられた属性は呼び出されます。しかし、name の値は Peter のみのままです。何故ですか?どういう理由ですか?特に HttpSessionAttributeListener と HttpSessionListener をいつ使用するかという別の質問があります。実用的な使用法はありますか?

ありがとう、ピーター

4

1 に答える 1

1

javadoc に次のように記載されているためです。

追加、削除、または置換された属性の値を返します。属性が追加 (またはバインド) された場合、これは属性の値です。属性が削除された (またはバインド解除された) 場合、これは削除された属性の値です。属性が置き換えられた場合、これは属性の古い値です。

最初のケースでは、古い値と新しい値が同じであるため、新しい犬の名前が表示されます。

HttpSessionListener は、セッションの作成と破棄を認識するために使用されます。HttpSessionAttributeListener は、セッション内の新しい属性、削除された属性、および置き換えられた属性を認識するために使用されます。彼らは非常に異なっています。

于 2012-09-24T19:55:44.207 に答える