Servlet監聽器

ServletContextListener的用法。

這個事件類作爲Web應用服務的一部分,處理Web應用的 servlet上下文(context)的變化的通知。這可以解釋爲,好像有個人在服務器旁不斷地通知我們服務器在發生什麼事件。那當然需要監聽者了。因此,在通知上下文(context)初始化和銷燬的時候,ServletContextListner非常有用。

import javax.servlet.ServletContextListener;

import javax.servlet.ServletContextEvent;
import javax.servlet.*;
public class MyListener implements ServletContextListener {
     private ServletContext context = null;

     public void contextDestroyed(ServletContextEvent event){
              //Output a simple message to the server's console
              System.out.println("The Simple Web App. Has Been Removed");
               this.context = null;
     }
     // 這個方法在Web應用服務做好接受請求的時候被調用。
      public void contextInitialized(ServletContextEvent event){
              this.context = event.getServletContext();
              //Output a simple message to the server's console
              System.out.println("The Simple Web App. Is Ready");
      }

}


<web-app>
<listener>
  <listener-class>
   com.listeners.MyContextListener
  </listener-class>
</listener>
<servlet/>
<servlet-mapping/>

</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()會得到同樣的結果.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章