本博客為原創:綜合 尚硅谷(http://www.atguigu.com)的系統教程(深表感謝)和 網絡上的現有資源(博客,文檔,圖書等),資源的出處我會標明
本博客的目的:①總結自己的學習過程,相當於學習筆記 ②將自己的經驗分享給大家,相互學習,互相交流,不可商用
內容難免出現問題,歡迎指正,交流,探討,可以留言,也可以通過以下方式聯系。
本人互聯網技術愛好者,互聯網技術發燒友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.簡介
1)監聽器:專門用於對其他對象身上發生的事件或狀態改變進行監聽和相應處理的對象,當被監視的對象發生情況時,立即采取相應的行動
2)Servlet 監聽器:Servlet 規范中定義的一種特殊類,它用於監聽 web 應用程序中的 ServletContext, HttpSession 和 ServletRequest 等域對象的創建與銷毀事件,以及監聽這些域對象中的屬性發生修改的事件
2.按監聽的事件類型 Servlet 監聽器可分為如下三種類型
1)監聽域對象自身的創建和銷毀的事件監聽器
> 域對象創建和銷毀的事件監聽器就是用來監聽 ServletContext(Application 對象), HttpSession (Session 對象), HttpServletRequest (request 對象) 這三個對象的創建和銷毀事件的監聽器
> 域對象的創建和銷毀時機
> ServletContextListener 接口
what: ServletContextListener 接口用於監聽 ServletContext 對象的創建和銷毀事件
* 當 ServletContext 對象被創建時,激發contextInitialized (ServletContextEvent sce)方法。當前web 應用被加載到服務器的時候
* 當 ServletContext 對象被銷毀時,激發contextDestroyed(ServletContextEvent sce)方法。當前 web 應用從服務器卸載的時候
How:①創建一個實現了 ServletContextListener 的類,並且實現其中的兩個方法
public class HelloServletContextListner implements ServletContextListener
② 在web.xml 文件中配置Listener
1 <listener>
2 <listener-class>com.jason.listener.HelloServletContextListner</listener-class>
3 </listener>
Why:ServletContextListener 是最常用的 listener,可以在當前 WEB 應用加載時對當前 WEB 應用的相關進行初始化操作
比如:創建數據庫連接池,創建spring的IOC容器,讀取當前web應用的初始化參數,
API:
1 @Override 2 //ServletContext 對象被(即,當前web應用被加載時)創建的時候,Servlet 容器調用該方法
3 public void contextInitialized(ServletContextEvent sce) { 4 // TODO Auto-generated method stub
5 System.out.println("ServletContext 對象被創建"); 6
7 } 8
9 @Override 10 //ServletContext 對象被銷毀之前(即,當前web應用被卸載時)的時候, Servlet 容器調用該方法
11 public void contextDestroyed(ServletContextEvent sce) { 12 // TODO Auto-generated method stub
13 System.out.println("ServletContext 對象被銷毀"); 14 }
> HttpSessionListener 接口 與ServletContextListener類似
* HttpSessionListener 接口用於監聽HttpSession對象的創建和銷毀
* 創建一個Session時,激發sessionCreated (HttpSessionEvent se) 方法
* 銷毀一個Session時,激發sessionDestroyed (HttpSessionEvent se) 方法。
> ServletRequestListener接口 與ServletContextListener 類似
* ServletRequestListener 接口用於監聽ServletRequest 對象的創建和銷毀
* 創建一個ServletRequest 對象時,激發requestInitialized(ServletRequestEvent sre)方法
* 銷毀一個Session時,激發requestDestroyed(ServletRequestEvent sre)方法
2)監聽域對象中的屬性的增加和刪除的事件監聽器
3)監聽綁定到 HttpSession 域中的某個對象的狀態的事件監聽器
3.編寫 Servlet 監聽器
1) Servlet 規范為每種事件監聽器都定義了相應的接口,開發人員編寫的事件監聽器程序只需實現這些接口,web 服務器根據用戶編寫的事件監聽器所實現的接口把它注冊到相應的被監聽對象上
1 package com.jason.listener; 2
3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5
6 public class HelloServletContextListner implements ServletContextListener { 7
8 @Override 9 //ServletContext 對象被(即,當前web應用被加載時)創建的時候,Servlet 容器調用該方法
10 public void contextInitialized(ServletContextEvent sce) { 11 // TODO Auto-generated method stub
12 System.out.println("ServletContext 對象被創建"); 13
14 } 15
16 @Override 17 //ServletContext 對象被銷毀之前(即,當前web應用被卸載時)的時候, Servlet 容器調用該方法
18 public void contextDestroyed(ServletContextEvent sce) { 19 // TODO Auto-generated method stub
20 System.out.println("ServletContext 對象被銷毀"); 21 } 22
23 }
2) 一些 Servlet 事件監聽器需要在 web 應用程序的 web.xml 文件中進行注冊,一個 web.xml 文件中可以注冊多個 Servlet 事件監聽器,web 服務器按照它們在 web.xml 文件中的注冊順序來加載和注冊這些 Serlvet 事件監聽器。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
3
4 <!-- 配置listener -->
5
6 <listener>
7 <listener-class>com.jason.listener.HelloServletContextListner</listener-class>
8 </listener>
9 </web-app>
3) Serlvet 事件監聽器的注冊和調用過程都是由 web 容器自動完成的,當發生被監聽的對象被創建,修改或銷毀事件時,web容器將調用與之相關的 Servlet 事件監聽器對象的相關方法,開發人員在在這些方法中編寫的事件處理代碼即被執行
4)由於一個 web 應用程序只會為每個事件監聽器創建一個對象,有可能出現多個線程同時調用同一個事件監聽器對象的情況,所以,在編寫事件監聽器類時,應考慮多線程安全的問題
4.利用ServletContextListener ,HttpSessionListener,ServletRequestListener理解 application session request 對象的生命周期
> request:是一個請求,當一個響應返回時,即被銷毀。當發送一個請求時被創建 。注意,請求轉發的過程是一個 request 對象。重定向是兩個請求
> session:當第一次訪問WEB 應用的一個 JSP 或 Servlet 時,且 JSP 或者Servlet 中還需要創建 session 對象。此時服務器會創建一個 session 對象
session銷毀: session 時間過期 或者 直接調用session 的invalidate 方法 或者 當前web 應用被卸載
* 關閉瀏覽器,並不意味着 session 被銷毀,還可以通過 sessionid 找到服務器總的 session 對象
> application: 貫穿與當前的web 應用聲明周期,當前web 應用被加載時創建application,當前web 應用被卸載的時候銷毀application 對象