概述:
在Servlet2.3規范中,Web應用事件是新增加的部分。它讓你能最大程度地控制你的Web應用。在本文中,我們將學習兩個很重要的應用事件:
應用的啟動和停止
Session的創建和失效
如它們的名字那樣,應用啟動事件發生在你的應用第一次被servlet容器裝載和啟動的時候;停止事件發生在Web應用停止的時候。
Session創建事件發生在每次一個新的session創建的時候,類似地Session失效事件發生在每次一個Session失效的時候。為了使用這些Web應用事件為你做些有用的事情,我們必須創建和使用一些特殊的“監聽”類。下面,我們將研究這些監聽類到地是什么以及我們如何去使用它們。
監聽類:
它們是實現了下邊兩個接口中任何一個接口的簡單的java類:
javax.servlet.ServletContextListener
javax.servlet.http.HttpSessionListener
如果你想讓你的類監聽應用的啟動和停止事件,你就得實現ServletContextListener接口;如果你想讓你的類去監聽Session的創建和失效事件,那你就得實現HttpSessionListener接口。 讓我們看看在這些接口中你必須要實現的方法。
1.ServletContextListener :
接口包括如下兩個方法:
public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServletContextEvent sce);
如果你實現了一個接口,那你就必須實現它所有的方法。因此,如果你想利用應用的啟動和停止事件,你就需要創建一個Java類并實現ServletContextListener接口。下邊是這樣的一個類的例子:
/*File : ApplicationWatch.java*/
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class ApplicationWatch implements ServletContextListener {
public static long applicationInitialized = 0L;
/* 應用啟動事件 */
public void contextInitialized(ServletContextEvent ce) {
applicationInitialized = System.currentTimeMillis();
}
/*應用停止事件 */
public void contextDestroyed(ServletContextEvent ce) {}
}
在上邊的代碼中,ApplicationWatch類實現了ServletContextListener接口。它實現了接口中的兩個方法,但只用了其中的一個方法,另一個方法中沒有寫任何代碼。這個類把應用啟動的時間記錄在一個可以從其它應用類中存取應用啟動時間的public static變量中。
我將很快解釋如何告訴服務器我們有這個監聽類,但首先讓我們看看HttpSessionListener接口有什么不同的方法。
2.HttpSessionListener :
這個接口也只包含兩個方法,分別對應于Session的創建和失效:
public void sessionCreated(HttpSessionEvent se);
public void sessionDestroyed(HttpSessionEvent se);
如上邊的ApplicationWatch例子那樣,我們也創建了一個實現HttpSessionListener接口的類。如下:
/*File : SessionCounter.java*/
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class SessionCounter implements HttpSessionListener {
private static int activeSessions =0;
/* Session創建事件 */
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
}
/* Session失效事件 */
public void sessionDestroyed(HttpSessionEvent se) {
if(activeSessions>0)activeSessions--;
}
public static int getActiveSessions() {
return activeSessions;
}
}
在上邊的代碼中,SessionCounter類實現了HttpSessionListener接口,其目的是計算活動會話的數量。
好了,我們已經學習了什么是Web應用事件,有什么接口可以用以及看到了一些實現這些接口的例子。讓我們看看如何告訴應用服務器我們有這些監聽類。
Web.xml :
我們通過把類路徑加入/WEB-INF/web.xml文件的標簽<listener>中來告訴服務器我們的監聽類。下邊是一個web.xml文件的例子:
<!-- Web.xml -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">
<web-app>
<!-- Listeners -->
<listener>
<listener-class>
com.stardeveloper.web.listener.SessionCounter
</listener-class>
</listener>
<listener>
<listener-class>
com.stardeveloper.web.listener.ApplicationWatch</listener-class>
</listener>
</web-app>
如上所示,在web.xml文件中聲明監聽類是非常簡單的。現在,每次的服務器的啟動和停止,會話的創建和失效,配置好的監聽類的相應的方法就會被調用。就這么簡單!
總結:
在本文中我們學習了什么是Web應用事件和我們如何通過創建特殊的“監聽”類來使用它們。之后我們分別創建了兩個實現了ServletContextListener和HttpSessionListener接口的類。我們也學習了如何在web.xml文件中使用專門的<listener>和<listener-class>標簽來聲明這些監聽類。