概述:
在Servlet2.3規(guī)范中,Web應(yīng)用事件是新增加的部分。它讓你能最大程度地控制你的Web應(yīng)用。在本文中,我們將學(xué)習(xí)兩個(gè)很重要的應(yīng)用事件:
應(yīng)用的啟動(dòng)和停止
Session的創(chuàng)建和失效
如它們的名字那樣,應(yīng)用啟動(dòng)事件發(fā)生在你的應(yīng)用第一次被servlet容器裝載和啟動(dòng)的時(shí)候;停止事件發(fā)生在Web應(yīng)用停止的時(shí)候。
Session創(chuàng)建事件發(fā)生在每次一個(gè)新的session創(chuàng)建的時(shí)候,類似地Session失效事件發(fā)生在每次一個(gè)Session失效的時(shí)候。為了使用這些Web應(yīng)用事件為你做些有用的事情,我們必須創(chuàng)建和使用一些特殊的“監(jiān)聽(tīng)”類。下面,我們將研究這些監(jiān)聽(tīng)類到地是什么以及我們?nèi)绾稳ナ褂盟鼈儭?BR>
監(jiān)聽(tīng)類:
它們是實(shí)現(xiàn)了下邊兩個(gè)接口中任何一個(gè)接口的簡(jiǎn)單的java類:
javax.servlet.ServletContextListener
javax.servlet.http.HttpSessionListener
如果你想讓你的類監(jiān)聽(tīng)?wèi)?yīng)用的啟動(dòng)和停止事件,你就得實(shí)現(xiàn)ServletContextListener接口;如果你想讓你的類去監(jiān)聽(tīng)Session的創(chuàng)建和失效事件,那你就得實(shí)現(xiàn)HttpSessionListener接口。 讓我們看看在這些接口中你必須要實(shí)現(xiàn)的方法。
1.ServletContextListener :
接口包括如下兩個(gè)方法:
public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServletContextEvent sce);
如果你實(shí)現(xiàn)了一個(gè)接口,那你就必須實(shí)現(xiàn)它所有的方法。因此,如果你想利用應(yīng)用的啟動(dòng)和停止事件,你就需要?jiǎng)?chuàng)建一個(gè)Java類并實(shí)現(xiàn)ServletContextListener接口。下邊是這樣的一個(gè)類的例子:
/*File : ApplicationWatch.java*/
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class ApplicationWatch implements ServletContextListener {
public static long applicationInitialized = 0L;
/* 應(yīng)用啟動(dòng)事件 */
public void contextInitialized(ServletContextEvent ce) {
applicationInitialized = System.currentTimeMillis();
}
/*應(yīng)用停止事件 */
public void contextDestroyed(ServletContextEvent ce) {}
}
在上邊的代碼中,ApplicationWatch類實(shí)現(xiàn)了ServletContextListener接口。它實(shí)現(xiàn)了接口中的兩個(gè)方法,但只用了其中的一個(gè)方法,另一個(gè)方法中沒(méi)有寫(xiě)任何代碼。這個(gè)類把應(yīng)用啟動(dòng)的時(shí)間記錄在一個(gè)可以從其它應(yīng)用類中存取應(yīng)用啟動(dòng)時(shí)間的public static變量中。
我將很快解釋如何告訴服務(wù)器我們有這個(gè)監(jiān)聽(tīng)類,但首先讓我們看看HttpSessionListener接口有什么不同的方法。
2.HttpSessionListener :
這個(gè)接口也只包含兩個(gè)方法,分別對(duì)應(yīng)于Session的創(chuàng)建和失效:
public void sessionCreated(HttpSessionEvent se);
public void sessionDestroyed(HttpSessionEvent se);
如上邊的ApplicationWatch例子那樣,我們也創(chuàng)建了一個(gè)實(shí)現(xiàn)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創(chuàng)建事件 */
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
}
/* Session失效事件 */
public void sessionDestroyed(HttpSessionEvent se) {
if(activeSessions>0)activeSessions--;
}
public static int getActiveSessions() {
return activeSessions;
}
}
在上邊的代碼中,SessionCounter類實(shí)現(xiàn)了HttpSessionListener接口,其目的是計(jì)算活動(dòng)會(huì)話的數(shù)量。
好了,我們已經(jīng)學(xué)習(xí)了什么是Web應(yīng)用事件,有什么接口可以用以及看到了一些實(shí)現(xiàn)這些接口的例子。讓我們看看如何告訴應(yīng)用服務(wù)器我們有這些監(jiān)聽(tīng)類。
Web.xml :
我們通過(guò)把類路徑加入/WEB-INF/web.xml文件的標(biāo)簽<listener>中來(lái)告訴服務(wù)器我們的監(jiān)聽(tīng)類。下邊是一個(gè)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文件中聲明監(jiān)聽(tīng)類是非常簡(jiǎn)單的。現(xiàn)在,每次的服務(wù)器的啟動(dòng)和停止,會(huì)話的創(chuàng)建和失效,配置好的監(jiān)聽(tīng)類的相應(yīng)的方法就會(huì)被調(diào)用。就這么簡(jiǎn)單!
總結(jié):
在本文中我們學(xué)習(xí)了什么是Web應(yīng)用事件和我們?nèi)绾瓮ㄟ^(guò)創(chuàng)建特殊的“監(jiān)聽(tīng)”類來(lái)使用它們。之后我們分別創(chuàng)建了兩個(gè)實(shí)現(xiàn)了ServletContextListener和HttpSessionListener接口的類。我們也學(xué)習(xí)了如何在web.xml文件中使用專門(mén)的<listener>和<listener-class>標(biāo)簽來(lái)聲明這些監(jiān)聽(tīng)類。