Servlet監聽器

原文地址:http://hht83.blog.163.com/blog/static/44037112008324232278/

概述:

Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。

接口:

目前Servlet2.4和JSP2.0總共有8個監聽器接口和6個Event類,其中HttpSessionAttributeListener與

HttpSessionBindingListener 皆使用HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener則都使用HttpSessionEvent;其餘Listener對應的Event如下所 示:

Listener接口

Event類

ServletContextListener

ServletContextEvent

ServletContextAttributeListener

ServletContextAttributeEvent

HttpSessionListener

HttpSessionEvent

HttpSessionActivationListener

HttpSessionAttributeListener

HttpSessionBindingEvent

HttpSessionBindingListener

ServletRequestListener

ServletRequestEvent

ServletRequestAttributeListener

ServletRequestAttributeEvent

分別介紹:

一 ServletContext相關監聽接口

補充知識:

通過ServletContext 的實例可以存取應用程序的全局對象以及初始化階段的變量。

在JSP文件中,application 是 ServletContext 的實例,由JSP容器默認創建。Servlet 中調用 getServletContext()方法得到 ServletContext 的實例。

注意:

全局對象即Application範圍對象,初始化階段的變量指在web.xml中,經由<context-param>元素所設定的變量,它的範圍也是Application範圍,例如:

<context-param>

<param-name>Name</param-name>

<param-value>browser</param-value>

</context-param>

當容器啓動時,會建立一個Application範圍的對象,若要在JSP網頁中取得此變量時:

String name = (String)application.getInitParameter("Name");

或者使用EL時:

${initPara.name}

若是在Servlet中,取得Name的值方法:

String name = (String)ServletContext.getInitParameter("Name");

1.ServletContextListener:

用於監聽WEB 應用啓動和銷燬的事件,監聽器類需要實現javax.servlet.ServletContextListener 接口。

ServletContextListener 是 ServletContext 的監聽者,如果 ServletContext 發生變化,如服務器啓動時 ServletContext 被創建,服務器關閉時 ServletContext 將要被銷燬。

ServletContextListener接口的方法:

void contextInitialized(ServletContextEvent sce)

通知正在接受的對象,應用程序已經被加載及初始化。

void contextDestroyed(ServletContextEvent sce)

通知正在接受的對象,應用程序已經被載出。

ServletContextEvent中的方法:

ServletContext getServletContext()

取得ServletContext對象

2.ServletContextAttributeListener:用於監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener接口。

ServletContextAttributeListener接口方法:

void attributeAdded(ServletContextAttributeEvent scab)

若有對象加入Application的範圍,通知正在收聽的對象

void attributeRemoved(ServletContextAttributeEvent scab)

若有對象從Application的範圍移除,通知正在收聽的對象

void attributeReplaced(ServletContextAttributeEvent scab)

若在Application的範圍中,有對象取代另一個對象時,通知正在收聽的對象

ServletContextAttributeEvent中的方法:

java.lang.String getName()

回傳屬性的名稱

java.lang.Object getValue()

回傳屬性的值

二、HttpSession相關監聽接口

1.HttpSessionBindingListener接口

注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設定的Listener

當我們的類實現了HttpSessionBindingListener接口後,只要對象加入Session範圍 (即調用HttpSession對象的setAttribute方法的時候)或從Session範圍中移出(即調用HttpSession對象的 removeAttribute方法的時候或Session Time out的時候)時,容器分別會自動調用下列兩個方法:

void valueBound(HttpSessionBindingEvent event)

void valueUnbound(HttpSessionBindingEvent event)

思考:如何實現記錄網站的客戶登錄日誌, 統計在線人數?

2.HttpSessionAttributeListener接口

HttpSessionAttributeListener監聽HttpSession中的屬性的操作。

當 在Session增加一個屬性時,激發attributeAdded(HttpSessionBindingEvent se) 方法;當在Session刪除一個屬性時,激發attributeRemoved(HttpSessionBindingEvent se)方法;當在Session屬性被重新設置時,激發attributeReplaced(HttpSessionBindingEvent se) 方法。這和ServletContextAttributeListener比較類似。

3.HttpSessionListener接口

HttpSessionListener監聽 HttpSession的操作。當創建一個Session時,激發session Created(HttpSessionEvent se)方法;當銷燬一個Session時,激發sessionDestroyed (HttpSessionEvent se)方法。

4.HttpSessionActivationListener接口

主要用於同一個Session轉移至不同的JVM的情形。

四、ServletRequest監聽接口

1.ServletRequestListener接口

和ServletContextListener接口類似的,這裏由ServletContext改爲ServletRequest

2.ServletRequestAttributeListener接口

和ServletContextListener接口類似的,這裏由ServletContext改爲ServletRequest

有的listener可用於統計網站在線人數及訪問量。 如下:

服務器啓動時(實現ServletContextListener監聽器contextInitialized方法),讀取數據庫,並將其用一個計數變量保存在application範圍內

session創建時(實現HttpSessionListener監聽器sessionCreated方法),讀取計數變量加1並重新保存

服務器關閉時(實現ServletContextListener監聽器contextDestroyed方法),更新數據庫


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