javaWeb 三大元件之監聽器(Listener)
阿新 • • 發佈:2021-01-03
介紹
監聽器(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 的值 是 鈍化 (序列化)還是活化 (反序列化)的動作
- 鈍化 (序列化)
把記憶體中的資料 儲存到硬碟上
- 活化 (反序列化)
把硬碟中的資料讀取到記憶體中。