Servlet关于对象属性监听器,接口有三类:HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener。每种接口有三个方法attributeAdded、attributeReplace、attributeRemove,分别对应监控属性的添加、替换、移除。如果仔细考究的话,会有一些细节方面的问题需要回答。
一、HttpSessionAttributeListener问题
问题1:当向session添加名为test的属性时,如果test属性已存在,会发生什么呢?
猜测:当向session中添加已经存在的属性时,session的方法setAttribute应该会首先检查这个属性是否已经存在,如果存在则会触发属性替换事件,如果不存在则触发属性添加事情。
Servlet测试代码:
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
// 添加到Session的测试用属性类
class UserInfo {
private String name;
private Date createdDate;
public UserInfo(String name) {
this.name = name;
createdDate = new Date();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreatedDate() {
return createdDate;
}
}
public class SessionListener extends HttpServlet {
private static final long serialVersionUID = 1L;
public SessionListener() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建Session
HttpSession session = request.getSession(true);
// 向Session添加名为test的属性,此时应该触发监听器的attributeAdded事件
session.setAttribute("test", new UserInfo("billy"));
// 再一次向Session添加名为test的属性,此时应该触发监听器的attributeReplaced事件
session.setAttribute("test", new UserInfo("stars"));
// 将Session中的test属性删除,此时应该会触发attributeRemoved事件
session.removeAttribute("test");
response.getWriter().append("Served at: ").append(request.getContextPath());
}
}
监视器测试代码:
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class SessionAttributeListenerImpl implements HttpSessionAttributeListener {
public SessionAttributeListenerImpl() {
}
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("======Add Attribute=====");
display(event);
}
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("======Remove Attribute=====");
display(event);
}
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("======Replace Attribute=====");
display(event);
}
private void display(HttpSessionBindingEvent event) {
System.out.println("Source: " + event.getSource().getClass().getName());
System.out.println("Session ID: " + event.getSession().getId());
System.out.println("At