1. 程式人生 > >Servlet-listener監聽器

Servlet-listener監聽器

基本概念

JavaWeb中的監聽器是Servlet規範中定義的一種特殊類,它用於監聽web應用程式中的ServletContext, HttpSession和 ServletRequest等域物件的建立與銷燬事件,以及監聽這些域物件中的屬性發生修改的事件。

Servlet監聽器的分類

在Servlet規範中定義了多種型別的監聽器,它們用於監聽的事件源分別為ServletContext,HttpSession和ServletRequest這三個域物件
  Servlet規範針對這三個物件上的操作,又把多種型別的監聽器劃分為三種類型:

1. 監聽域物件自身的建立和銷燬的事件監聽器。
2. 監聽域物件中的屬性的增加和刪除的事件監聽器。
3. 監聽繫結到HttpSession域中的某個物件的狀態的事件監聽器。

監聽ServletContext域物件的建立和銷燬

ServletContextListener介面用於監聽ServletContext物件的建立和銷燬事件。實現了ServletContextListener介面的類都可以對ServletContext物件的建立和銷燬進行監聽。
  當ServletContext物件被建立時,激發contextInitialized (ServletContextEvent sce)方法。
  當ServletContext物件被銷燬時,激發contextDestroyed(ServletContextEvent sce)方法。

ServletContext域物件建立和銷燬時機:
    建立:伺服器啟動針對每一個Web應用建立ServletContext
    銷燬:伺服器關閉前先關閉代表每一個web應用的ServletContext

範例:編寫一個MyServletContextListener類,實現ServletContextListener介面,監聽ServletContext物件的建立和銷燬

1、編寫監聽器,程式碼如下:

1 package me.gacl.web.listener;
2
3 import javax.servlet.ServletContextEvent;
4 import javax.servlet.ServletContextListener;
5
6 /**
7 * @ClassName: MyServletContextListener
8 * @Description: MyServletContextListener類實現了ServletContextListener介面,
9 * 因此可以對ServletContext物件的建立和銷燬這兩個動作進行監聽。
10 *
11 *
12 *
13 */
14 public class MyServletContextListener implements ServletContextListener {
15
16 @Override
17 public void contextInitialized(ServletContextEvent sce) {
18 System.out.println("ServletContext物件建立");
19 }
20
21 @Override
22 public void contextDestroyed(ServletContextEvent sce) {
23 System.out.println("ServletContext物件銷燬");
24 }
25 }

2、在web.xml檔案中註冊監聽器
  我們在上面的中講到,要想監聽事件源,那麼必須將監聽器註冊到事件源上才能夠實現對事件源的行為動作進行監聽,在JavaWeb中,監聽的註冊是在web.xml檔案中進行配置的,如下:

1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
7 <display-name></display-name>
8 <welcome-file-list>
9 <welcome-file>index.jsp</welcome-file>
10 </welcome-file-list>11
12 <!-- 註冊針對ServletContext物件進行監聽的監聽器 -->
13 <listener>
14 <description>ServletContextListener監聽器</description>
15 <!--實現了ServletContextListener介面的監聽器類 -->
16 <listener-class>me.gacl.web.listener.MyServletContextListener</listener-class>17 </listener>18
19 </web-app>

經過這兩個步驟,我們就完成了監聽器的編寫和註冊,Web伺服器在啟動時,就會自動把在web.xml中配置的監聽器註冊到ServletContext物件上,這樣開發好的MyServletContextListener監聽器就可以對ServletContext物件進行監聽了。監聽HttpSession域物件的建立和銷燬

HttpSessionListener 介面用於監聽HttpSession物件的建立和銷燬

建立一個Session時,激發sessionCreated (HttpSessionEvent se) 方法
  銷燬一個Session時,激發sessionDestroyed (HttpSessionEvent se) 方法。

範例:編寫一個MyHttpSessionListener類,實現HttpSessionListener介面,監聽HttpSession物件的建立和銷燬

1、編寫監聽器,程式碼如下:

1 package me.gacl.web.listener;
2
3 import javax.servlet.http.HttpSessionEvent;
4 import javax.servlet.http.HttpSessionListener;
5
6 /**
7 * @ClassName: MyHttpSessionListener
8 * @Description: MyHttpSessionListener類實現了HttpSessionListener介面,
9 * 因此可以對HttpSession物件的建立和銷燬這兩個動作進行監聽。
10 *
11 *
12 *
13 */
14 public class MyHttpSessionListener implements HttpSessionListener {
15
16 @Override
17 public void sessionCreated(HttpSessionEvent se) {
18 System.out.println( se.getSession() + "建立了!!");
19 }
20
21 /* HttpSession的銷燬時機需要在web.xml中進行配置,如下:
22 * <session-config>
23 <session-timeout>1</session-timeout>
24 </session-config>
25 這樣配置就表示session在1分鐘之後就被銷燬
26 */
27 @Override
28 public void sessionDestroyed(HttpSessionEvent se) {
29 System.out.println("session銷燬了!!");
30 }
31 }

2、在web.xml檔案中註冊監聽器

1 <!--註冊針對HttpSession物件進行監聽的監聽器-->
2 <listener>
3 <description>HttpSessionListener監聽器</description>
4 <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class>
5 </listener>
6 <!-- 配置HttpSession物件的銷燬時機 -->
7 <session-config>
8 <!--配置HttpSession物件的1分鐘之後銷燬 -->
9 <session-timeout>1</session-timeout>
10 </session-config>

當我們訪問jsp頁面時,HttpSession物件就會建立,此時就可以在HttpSessionListener觀察到HttpSession物件的建立過程了,我們可以寫一個jsp頁面觀察HttpSession物件建立的過程。

如下:index.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
2
3 <!DOCTYPE HTML>
4 <html>
5 <head>
6 <title>HttpSessionListener監聽器監聽HttpSession物件的建立</title>
7 </head>
8
9 <body>
10 一訪問JSP頁面,HttpSession就建立了,建立好的Session的Id是:${pageContext.session.id}
11 </body>
12 </html>

監聽ServletRequest域物件的建立和銷燬

ServletRequestListener介面用於監聽ServletRequest 物件的建立和銷燬
  Request物件被建立時,監聽器的requestInitialized(ServletRequestEvent sre)方法將會被呼叫
  Request物件被銷燬時,監聽器的requestDestroyed(ServletRequestEvent sre)方法將會被呼叫

ServletRequest域物件建立和銷燬時機:
    建立:使用者每一次訪問都會建立request物件
    銷燬:當前訪問結束,request物件就會銷燬

範例:編寫一個MyServletRequestListener類,實現ServletRequestListener介面,監聽ServletRequest物件的建立和銷燬
  1、編寫監聽器,程式碼如下:

1 package me.gacl.web.listener;
2
3 import javax.servlet.ServletRequestEvent;
4 import javax.servlet.ServletRequestListener;
5
6 /**
7 * @ClassName: MyServletRequestListener
8 * @Description: MyServletRequestListener類實現了ServletRequestListener介面,
9 * 因此可以對ServletRequest物件的建立和銷燬這兩個動作進行監聽。
10 *
11 *
12 *
13 */
14 public class MyServletRequestListener implements ServletRequestListener {
15
16 @Override
17 public void requestDestroyed(ServletRequestEvent sre) {
18 System.out.println(sre.getServletRequest() + "銷燬了!!");
19
20 }
21
22 @Override
23 public void requestInitialized(ServletRequestEvent sre) {
24 System.out.println(sre.getServletRequest() + "建立了!!");
25 }
26 }

2、在web.xml檔案中註冊監聽器

1 <!--註冊針對ServletRequest物件進行監聽的監聽器-->
2 <listener>
3 <description>ServletRequestListener監聽器</description>
4 <listener-class>me.gacl.web.listener.MyServletRequestListener</listener-class>
5 </listener>

使用者每一次訪問都會建立request物件,當訪問結束後,request物件就會銷燬。