當Web應用在Web容器中運行時,Web應用內部會不斷髮生各種事件:如Web應用被啓動、Web應用被停止、用戶Session開始、用戶Session結束、用戶請求到達等,通常來說這些Web事件對於開發者是透明的。Servlet API提供了大量的監聽器來監聽Web應用的內部事件,從而允許當Web內部事件發生時回調事件監聽器內的方法。這些監聽器就是我們這一節要介紹的Listener。
Listener
實現Listener的步驟:
我們在使用Listener的過程中,只需要兩個步驟:
- 定義Listener實現類。
- 通過註解或者在web.xml文件中配置Listener。
常用的Web事件監聽器:
- ServletContextListener:用於監聽Web應用的啓動和關閉。
- ServletContextAttributeListener:用於監聽ServletContext範圍(application)內屬性的改變。
- ServletRequestListener:用於監聽用戶請求。
- ServletRequestAttributeListener:用於監聽ServletRequest範圍(request)內屬性的改變。
- HttpSessionListener:用於監聽用戶Session的開始和結束。
- HttpSessionAttributeListener:用於監聽HttpSession範圍(session)內屬性的改變。
Listener配置:
配置Listener只要向Web應用註冊Listener實現類就可以了,無需配置參數之類的東西,所以配置過程非常簡單,並且它的配置和Servlet一樣,有兩種配置的方式:
- 使用@WebListener修飾Listener實現類即可。
- 在web.xml文檔中使用
<listener>
<listener-class>com.example.TestListener</listener-class>
</listener>
Listener使用舉例:
在這裏我們使用ServletContextListener來實例使用Listener,在使用的時候我們只需要在我們的類中實現ServletContextListener接口,然後將我們要做的工作寫在相應的方法中就可以了,代碼如下:
package com.example;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* Application Lifecycle Listener implementation class TestListener
*
*/
@WebListener
public class TestListener implements ServletContextListener {
/**
* Default constructor.
*/
public TestListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Web應用啓動");
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Web應用關閉");
}
}
在上面的代碼中,我們在contextInitialized方法中輸出了“Web應用啓動”,在contextDestroyed方法中輸出了“Web應用關閉”,這樣當Web應用啓動的時候,我們可以在控制檯中看到“Web應用啓動”的字段,而在Web應用關閉的時候看到“Web應用關閉”的字段,這樣說明我們的Listener已經成功監聽到了Web應用的啓動和關閉,而我們也可以在這裏讓監聽器做更多的工作,例如可以在Web應用啓動的時候連接數據庫並且獲取到數據庫的連接,然後在Web應用關閉的時候斷開數據庫的連接。
其他的Web Listener類就不在一一舉例,它們的使用都和上述例子中的使用類似,只是不同的Listener實現類中方法也不同,我們在使用這些Listener類的時候要注意識別每個方法是在什麼時候被調用的。