它是基於觀察者模式設計的,Listener 的設計對開發 Servlet 應用程序提供了一種快捷的手段,能夠方便的從另一個縱向維度控制程序和數據。目前 Servlet 中提供了 5 種兩類事件的觀察者接口,它們分別是:4 個 EventListeners 類型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 個 LifecycleListeners 類型的,ServletContextListener、HttpSessionListener。如下圖所示:
Listener是Servlet的監聽器,它可以監聽客戶端的請求、服務端的操作等。通過監聽器,可以自動激發一些操作,比如監聽在線的用戶的數量。當增加一個HttpSession時,就激發sessionCreated(HttpSessionEvent se)方法,這樣就可以給在線人數加1。常用的監聽接口有以下幾個:
ServletContextAttributeListener監聽對ServletContext屬性的操作,比如增加、刪除、修改屬性。
ServletContextListener監聽ServletContext。當創建ServletContext時,激發contextInitialized(ServletContextEvent sce)方法;當銷燬ServletContext時,激發contextDestroyed(ServletContextEvent sce)方法。
HttpSessionListener監聽HttpSession的操作。當創建一個Session時,激發session Created(HttpSessionEvent se)方法;當銷燬一個Session時,激發sessionDestroyed (HttpSessionEvent se)方法。
HttpSessionAttributeListener監聽HttpSession中的屬性的操作。當在Session增加一個屬性時,激發attributeAdded(HttpSessionBindingEvent se) 方法;當在Session刪除一個屬性時,激發attributeRemoved(HttpSessionBindingEvent se)方法;當在Session屬性被重新設置時,激發attributeReplaced(HttpSessionBindingEvent se) 方法。
下面我們開發一個具體的例子,這個監聽器能夠統計在線的人數。在ServletContext初始化和銷燬時,在服務器控制檯打印對應的信息。當ServletContext裏的屬性增加、改變、刪除時,在服務器控制檯打印對應的信息。
要獲得以上的功能,監聽器必須實現以下3個接口:
HttpSessionListener
ServletContextListener
ServletContextAttributeListener
例子:
- /**
- *
- */
- package com.ee.listener;
- import javax.servlet.ServletContextAttributeEvent;
- import javax.servlet.ServletContextAttributeListener;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- /**
- * @author Administrator
- *
- */
- public class OnlineUserListener implements HttpSessionListener,
- ServletContextListener, ServletContextAttributeListener {
- private long onlineUserCount = 0;
- public long getOnlineUserCount() {
- return onlineUserCount;
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent)
- */
- @Override
- public void attributeAdded(ServletContextAttributeEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent)
- */
- @Override
- public void attributeRemoved(ServletContextAttributeEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent)
- */
- @Override
- public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {
- System.err.println("...attributeReplaced...");
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
- */
- @Override
- public void contextDestroyed(ServletContextEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
- */
- @Override
- public void contextInitialized(ServletContextEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
- */
- @Override
- public void sessionCreated(HttpSessionEvent httpSessionEvent) {
- onlineUserCount ++;
- toUpdateCount(httpSessionEvent);
- }
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
- */
- @Override
- public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
- onlineUserCount --;
- toUpdateCount(httpSessionEvent);
- }
- private void toUpdateCount(HttpSessionEvent httpSessionEvent){
- httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
- }
- }
Web.xml
- <listener>
- <listener-class>com.ee.listener.OnlineUserListener</listener-class>
- </listener>