介紹
監聽器(Listener)的作用
監聽某一個事件的發生,狀態的改變等。
原理
接口回調:
- A在執行循環,當循環到5的時候, 通知B。
- 事先先把一個接口對象傳遞給 A , 當A執行到5的時候,通過這個接口對象,來調用B中的方法。 但是注意,不是直接傳遞B的實例,而是傳遞一個接口的實例過去,而B是這個接口的實現。
javaWeb中的8個Listener
監聽servlet 三個作用域的創建與銷燬(3)
此類監聽器用來監聽servlet三大作用域的創建和銷燬:
作用域 | 實例對象 | 監聽器Listener |
---|---|---|
application | ServletContext | ServletContextListener |
session | HttpSession | HttpSessionListener |
request | HttpServletRequest | ServletRequestListener |
ServletContextListener
ServletContextListener
servletcontext創建:
- 啓動服務器的時候
servletContext銷燬:
- 關閉服務器.
- 從服務器移除項目
demo:
@WebListener
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 被創建了、、、");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 被銷燬了、、、");
}
}
項目啓動時(Tomcat啓動):
關閉項目:
HttpSessionListener
HttpSessionListener
session的創建:只要調用getSession
- html: 不會
- jsp: 會 getSession();
- servlet: 會
session的銷燬
- 超時 30分鐘
- 非正常關閉 銷燬
- 正常關閉服務器(序列化)
demo:
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session 創建了、、、");
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session 銷燬了、、、");
}
}
訪問資源/test01
關閉項目服務
ServletRequestListener
ServletRequestListener
request創建:訪問服務器上的任意資源都會有請求出現。
- 訪問 html: 會
- 訪問 jsp: 會
- 訪問 servlet : 會
request銷燬:服務器已經對這次請求作出了響應。
demo:
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request 創建了、、、");
}
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request 銷燬了、、、");
}
}
訪問資源/test01
:
監聽servlet 三個作用域屬性變更(3)
可以監聽在作用域中值的 添加 | 替換 | 移除
的動作。
- servletContext — ServletContextAttributeListener
- session — HttpSessionAttributeListener
- request — ServletRequestAttributeListener
demo:
@WebServlet(urlPatterns = "/test03")
public class MyServlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("111","111");
System.out.println("MyServlet03: set 111:111");
req.setAttribute("222","222");
System.out.println("MyServlet03: set 222:222");
req.removeAttribute("111");
System.out.println("MyServlet03: remove 222");
req.setAttribute("111","222");
System.out.println("MyServlet03: set 111:222");
}
}
@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("添加數據:"+srae.getName()+"-"+srae.getValue());
}
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("刪除數據:"+srae.getName()+"-"+srae.getValue());
}
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("替換數據:"+srae.getName()+"-"+srae.getValue());
}
}
請求/test03
監聽httpSession裏面存值的狀態變更
這一類監聽器不用註冊。
HttpSessionBindingListener
監聽對象與session 綁定和解除綁定 的動作
讓javaBean 實現該接口即可
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("對象被綁定進來了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("對象被解除綁定");
}
HttpSessionActivationListener
用於監聽現在session的值 是 鈍化 (序列化)還是活化 (反序列化)的動作
- 鈍化 (序列化)
把內存中的數據 存儲到硬盤上
- 活化 (反序列化)
把硬盤中的數據讀取到內存中。