用來監(jiān)聽特定對象的創(chuàng)建或銷毀耿导、屬性的變化
1.監(jiān)聽器接口的分類
1.1、監(jiān)聽對象創(chuàng)建/銷毀的監(jiān)聽器接口
Interface ServletRequestListener 監(jiān)聽request對象的創(chuàng)建或銷毀
Interface HttpSessionListener 監(jiān)聽session對象的創(chuàng)建或銷毀
Interface ServletContextListener 監(jiān)聽servletContext對象的創(chuàng)建或銷毀
1.2、監(jiān)聽對象屬性的變化
Interface ServletRequestAttributeListener 監(jiān)聽request對象屬性變化: 添加抵卫、移除、修改
Interface HttpSessionAttributeListener 監(jiān)聽session對象屬性變化: 添加殖氏、移除姻采、修改
Interface ServletContextAttributeListener 監(jiān)聽servletContext對象屬性變化
1.3、session相關(guān)監(jiān)聽器
Interface HttpSessionBindingListener 監(jiān)聽對象綁定到session上的事件
Interface HttpSessionActivationListener(了解) 監(jiān)聽session序列化及反序列化的事件
2.監(jiān)聽器的開發(fā)
2.1 步驟:
2.1.1.寫一個普通java類慨亲,實現(xiàn)相關(guān)接口;
2.1.2.配置(web.xml)
2.2 實例
A.監(jiān)聽request對象的創(chuàng)建或銷毀
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener{
// 對象銷毀
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 獲取request中存放的數(shù)據(jù)
Object obj = sre.getServletRequest().getAttribute("cn");
System.out.println(obj);
System.out.println("MyRequestListener.requestDestroyed()");
}
// 對象創(chuàng)建
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("MyRequestListener.requestInitialized()");
}
}
<!-- 監(jiān)聽request對象創(chuàng)建巴刻、銷毀 -->
<listener>
<listener-class>cn.acamy.a_life.MyRequestListener</listener-class>
</listener>
B. 監(jiān)聽ServletContext對象創(chuàng)建或銷毀
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("MyServletContextListener.contextDestroyed()");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("1..........MyServletContextListener.contextInitialized()");
}
}
<!-- 監(jiān)聽servletContext對象創(chuàng)建胡陪、銷毀 -->
<listener>
<listener-class>cn.acamy.a_life.MyServletContextListener</listener-class>
</listener>
C.監(jiān)聽Session對象創(chuàng)建碍舍、銷毀
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener{
// 創(chuàng)建
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("MySessionListener.sessionCreated()");
}
// 銷毀
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("MySessionListener.sessionDestroyed()");
}
}
<!-- 監(jiān)聽session對象創(chuàng)建、銷毀 -->
<listener>
<listener-class>cn.itcast.a_life.MySessionListener</listener-class>
</listener>
D.監(jiān)聽session對象屬性的變化
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MySessionAttrListener implements HttpSessionAttributeListener {
// 屬性添加
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
// 先獲取session對象
HttpSession session = se.getSession();
// 獲取添加的屬性
Object obj = session.getAttribute("userName");
// 測試
System.out.println("添加的屬性:" + obj);
}
// 屬性移除
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("屬性移除");
}
// 屬性被替換
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// 獲取sesison對象
HttpSession session = se.getSession();
// 獲取替換前的值
Object old = se.getValue();
System.out.println("原來的值:" + old);
// 獲取新值
Object obj_new = session.getAttribute("userName");
System.out.println("新值:" + obj_new);
}
}
E.監(jiān)聽此對象綁定到session上的過程
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class Admin implements HttpSessionBindingListener {
private int id;
private String name;
public Admin() {
super();
}
public Admin(int id, String name) {
super();
this.id = id;
this.name = name;
}
// 構(gòu)造函數(shù)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 對象放入session
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("Admin對象已經(jīng)放入session");
}
// 對象從session中移除
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("Admin對象從session中移除!");
}
}
注意:
因為監(jiān)聽的對象是自己創(chuàng)建的對象捧书,不是服務(wù)器對象,所以不用再進(jìn)行web.xml配置