在Servlet API中有一個ServletContextListener接口,它能夠監聽ServletContext對象的生命週期,實際上就是監聽Web應用的生命週期。
當Servlet容器啓動或終止Web應用時,會觸發ServletContextEvent事件,該事件由 ServletContextListener 來處理。在 ServletContextListener 接口中定義了處理ServletContextEvent事件的兩個方法。 contextInitialized(ServletContextEvent sce):當Servlet容器啓動Web應用時調用該方法。在調用完該方法之後,容器再對Filter初始化,並且對那些在Web應用啓動時就需要被初始化的Servlet進行初始化。 contextDestroyed(ServletContextEvent sce):當Servlet容器終止Web應用時調用該方法。在調用該方法之前,容器會先銷燬所有的Servlet和Filter過濾器。 這個J2EE小提示闡述了ServletContextListener的用法。這個事件類作爲Web應用服務的一部分,處理Web應用的 servlet上下文(context)的變化的通知。這可以解釋爲,好像有個人在服務器旁不斷地通知我們服務器在發生什麼事件。那當然需要監聽者了。因此,在通知上下文(context)初始化和銷燬的時候,ServletContextListner非常有用。 import javax.servlet.ServletContextListener; import javax.servlet.ServletContextEvent; public void contextDestroyed(ServletContextEvent event){
</web-app> ServletContextListener接口有兩方需要實現的方法:contextInitialized()和contextDestroyed(); Listener,譯爲監聽者.顧名思義,它會監聽Servlet容器,當應用開始的時候它會調用contextInitialized()方法; 當應用關閉的時候,它同樣會調用contextDestroyed()方法. 我們可以利用這個特性初始化一些信息,當然我們也可以利用Servlet類init()方法,並在配置文件中讓它啓動應用的時候 就執行,並且在關閉的時候執行destroy()方法.但是繼承此接口應該更符合容器的應用. 舉個簡單的例子:在一些論壇,社區及聊天室當中,刪除在線的超時用戶就可以利用這個接口來實現. 可以利用JAVA的TimerTask及Timer類來實現每隔一定的時間進行自動檢測. 實例代碼如下: UserOnlineTimerTask.java ----------------- package com.bcxy.servlet; import java.util.TimerTask; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class UserOnlineTimerTask extends TimerTask { Log log = LogFactory.getLog(UserOnlineTimerTask.class); public void run() { // 刪除超時在線用戶 log.info("刪除在線的超時用戶...."); } } ------------------------------------ ------------------------------------ SysListener.java ----------------------------------- package com.bcxy.servlet; import java.io.IOException; import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SysListener extends HttpServlet implements ServletContextListener { Log log = LogFactory.getLog(SysListener.class); Timer timer = new Timer(); public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // } public void contextInitialized(ServletContextEvent sce) { log.info("initial context...."); timer.schedule(new UserOnlineTimerTask(), 0, 10000); } public void contextDestroyed(ServletContextEvent sce) { log.info("destory context...."); timer.cancel(); } } -------------------------------- 如果你沒有使用log4j的話,你可以把log.info()改爲System.out.println()會得到同樣的結果. |
ServletContextListener 的用法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.