私は 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 をいつ使用するかという別の質問があります。実用的な使用法はありますか?
ありがとう、ピーター