1. 程式人生 > >JavaWeb學習 (二十六)————監聽器(Listener)學習(二)

JavaWeb學習 (二十六)————監聽器(Listener)學習(二)

一、監聽域物件中屬性的變更的監聽器

  域物件中屬性的變更的事件監聽器就是用來監聽 ServletContext, HttpSession, HttpServletRequest 這三個物件中的屬性變更資訊事件的監聽器。
  這三個監聽器介面分別是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,這三個介面中都定義了三個方法來處理被監聽物件中的屬性的增加,刪除和替換的事件,同一個事件在這三個介面中對應的方法名稱完全相同,只是接受的引數型別不同。

1.1、attributeAdded 方法

  當向被監聽物件中增加一個屬性時,web容器就呼叫事件監聽器的attributeAdded方法進行響應,這個方法接收一個事件型別的引數,監聽器可以通過這個引數來獲得正在增加屬性的域物件和被儲存到域中的屬性物件
  各個域屬性監聽器中的完整語法定義為:

1 public void attributeAdded(ServletContextAttributeEvent scae)
2 public void attributeReplaced(HttpSessionBindingEvent  hsbe)
3 public void attributeRmoved(ServletRequestAttributeEvent srae)

1.2、attributeRemoved 方法

  當刪除被監聽物件中的一個屬性時,web容器呼叫事件監聽器的attributeRemoved方法進行響應
  各個域屬性監聽器中的完整語法定義為:

1 public void attributeRemoved(ServletContextAttributeEvent scae)
2 public void attributeRemoved (HttpSessionBindingEvent  hsbe)
3 public void attributeRemoved (ServletRequestAttributeEvent srae)

1.3、attributeReplaced 方法

  當監聽器的域物件中的某個屬性被替換時,web容器呼叫事件監聽器的attributeReplaced方法進行響應
  各個域屬性監聽器中的完整語法定義為:

1 public void attributeReplaced(ServletContextAttributeEvent scae)
2 public void attributeReplaced (HttpSessionBindingEvent  hsbe)
3 public void attributeReplaced (ServletRequestAttributeEvent srae)

1.4、ServletContextAttributeListener監聽器範例:

  編寫ServletContextAttributeListener監聽器監聽ServletContext域物件的屬性值變化情況,程式碼如下:

複製程式碼
 1 package me.gacl.web.listener;
 2 
 3 import java.text.MessageFormat;
 4 
 5 import javax.servlet.ServletContextAttributeEvent;
 6 import javax.servlet.ServletContextAttributeListener;
 7 
 8 /**
 9 * @ClassName: MyServletContextAttributeListener
10 * @Description: ServletContext域物件中屬性的變更的事件監聽器
11 * @author: 孤傲蒼狼
12 * @date: 2014-9-11 下午10:53:04
13 *
14 */ 
15 public class MyServletContextAttributeListener implements
16         ServletContextAttributeListener {
17 
18     @Override
19     public void attributeAdded(ServletContextAttributeEvent scab) {
20         String str =MessageFormat.format(
21                 "ServletContext域物件中添加了屬性:{0},屬性值是:{1}"
22                 ,scab.getName()
23                 ,scab.getValue());
24         System.out.println(str);
25     }
26 
27     @Override
28     public void attributeRemoved(ServletContextAttributeEvent scab) {
29         String str =MessageFormat.format(
30                 "ServletContext域物件中刪除屬性:{0},屬性值是:{1}"
31                 ,scab.getName()
32                 ,scab.getValue());
33         System.out.println(str);
34     }
35 
36     @Override
37     public void attributeReplaced(ServletContextAttributeEvent scab) {
38         String str =MessageFormat.format(
39                 "ServletContext域物件中替換了屬性:{0}的值"
40                 ,scab.getName());
41         System.out.println(str);
42     }
43 }
複製程式碼

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

1  <listener>
2       <description>MyServletContextAttributeListener監聽器</description>
3       <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class>
4   </listener>

  編寫ServletContextAttributeListenerTest.jsp測試頁面

複製程式碼
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>ServletContextAttributeListener監聽器測試</title>
 6   </head>
 7   
 8   <body>
 9         <%
10            //往application域物件中新增屬性
11            application.setAttribute("name", "孤傲蒼狼");
12           //替換application域物件中name屬性的值
13            application.setAttribute("name", "gacl");
14            //移除application域物件中name屬性
15            application.removeAttribute("name");
16            %>
17   </body>
18 </html>
複製程式碼

執行結果如下:

  

  從執行結果中可以看到,ServletContextListener監聽器成功監聽到了ServletContext域物件(application)中的屬性值的變化情況。

1.5、ServletRequestAttributeListener和HttpSessionAttributeListener監聽器範例:

  編寫監聽器監聽HttpSession和HttpServletRequest域物件的屬性值變化情況,程式碼如下:

複製程式碼
 1 package me.gacl.web.listener;
 2 
 3 import java.text.MessageFormat;
 4 
 5 import javax.servlet.ServletRequestAttributeEvent;
 6 import javax.servlet.ServletRequestAttributeListener;
 7 import javax.servlet.http.HttpSessionAttributeListener;
 8 import javax.servlet.http.HttpSessionBindingEvent;
 9 
10 public class MyRequestAndSessionAttributeListener implements
11         HttpSessionAttributeListener, ServletRequestAttributeListener {
12 
13     @Override
14     public void attributeAdded(ServletRequestAttributeEvent srae) {
15         String str =MessageFormat.format(
16                 "ServletRequest域物件中添加了屬性:{0},屬性值是:{1}"
17                 ,srae.getName()
18                 ,srae.getValue());
19         System.out.println(str);
20     }
21 
22     @Override
23     public void attributeRemoved(ServletRequestAttributeEvent srae) {
24         String str =MessageFormat.format(
25                 "ServletRequest域物件中刪除屬性:{0},屬性值是:{1}"
26                 ,srae.getName()
27                 ,srae.getValue());
28         System.out.println(str);
29     }
30 
31     @Override
32     public void attributeReplaced(ServletRequestAttributeEvent srae) {
33         String str =MessageFormat.format(
34                 "ServletRequest域物件中替換了屬性:{0}的值"
35                 ,srae.getName());
36         System.out.println(str);
37     }
38 
39     @Override
40     public void attributeAdded(HttpSessionBindingEvent se) {
41         String str =MessageFormat.format(
42                 "HttpSession域物件中添加了屬性:{0},屬性值是:{1}"
43                 ,se.getName()
44                 ,se.getValue());
45         System.out.println(str);
46     }
47 
48     @Override
49     public void attributeRemoved(HttpSessionBindingEvent se) {
50         String str =MessageFormat.format(
51                 "HttpSession域物件中刪除屬性:{0},屬性值是:{1}"
52                 ,se.getName()
53                 ,se.getValue());
54         System.out.println(str);
55     }
56 
57     @Override
58     public void attributeReplaced(HttpSessionBindingEvent se) {
59         String str =MessageFormat.format(
60                 "HttpSession域物件中替換了屬性:{0}的值"
61                 ,se.getName());
62         System.out.println(str);
63     }
64 }
複製程式碼

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

1  <listener>
2       <description>MyRequestAndSessionAttributeListener監聽器</description>
3       <listener-class>me.gacl.web.listener.MyRequestAndSessionAttributeListener</listener-class>
4   </listener>

  編寫RequestAndSessionAttributeListenerTest.jsp測試頁面

複製程式碼
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>RequestAndSessionAttributeListener監聽器測試</title>
 6   </head>
 7   
 8   <body>
 9     <%
10            //往session域物件中新增屬性
11            session.setAttribute("aa", "bb");
12           //替換session域物件中aa屬性的值
13            session.setAttribute("aa", "xx");
14            //移除session域物件中aa屬性
15            session.removeAttribute("aa");
16            
17            //往request域物件中新增屬性
18            request.setAttribute("aa", "bb");
19           //替換request域物件中aa屬性的值
20            request.setAttribute("aa", "xx");
21            //移除request域物件中aa屬性
22            request.removeAttribute("aa");
23     %>
24   </body>
25 </html>
複製程式碼

  執行結果如下:

  

  從執行結果中可以看到,HttpSessionAttributeListener監聽器和ServletRequestAttributeListener成功監聽到了HttpSession域物件和HttpServletRequest域物件的屬性值變化情況。

二、感知Session繫結的事件監聽器

  儲存在Session域中的物件可以有多種狀態:繫結(session.setAttribute("bean",Object))到Session中;從 Session域中解除(session.removeAttribute("bean"))繫結;隨Session物件持久化到一個儲存裝置中;隨Session物件從一個儲存裝置中恢復
  Servlet 規範中定義了兩個特殊的監聽器介面"HttpSessionBindingListener和HttpSessionActivationListener"來幫助JavaBean 物件瞭解自己在Session域中的這些狀態: ,實現這兩個介面的類不需要 web.xml 檔案中進行註冊

2.1、HttpSessionBindingListener介面

  實現了HttpSessionBindingListener介面的JavaBean物件可以感知自己被繫結到Session中和 Session中刪除的事件
  當物件被繫結到HttpSession物件中時,web伺服器呼叫該物件的void valueBound(HttpSessionBindingEvent event)方法
  當物件從HttpSession物件中解除繫結時,web伺服器呼叫該物件的void valueUnbound(HttpSessionBindingEvent event)方法

範例:

複製程式碼
 1 package me.gacl.domain;
 2 
 3 import javax.servlet.http.HttpSessionBindingEvent;
 4 import javax.servlet.http.HttpSessionBindingListener;
 5 
 6 /**
 7 * @ClassName: JavaBeanDemo1
 8 * @Description: 
 9 *   實現了HttpSessionBindingListener介面的 JavaBean物件可以感知自己被繫結到 Session中和從Session中刪除的事件
10     當物件被繫結到 HttpSession 物件中時,web 伺服器呼叫該物件的  void valueBound(HttpSessionBindingEvent event) 方法
11     當物件從 HttpSession 物件中解除繫結時,web 伺服器呼叫該物件的 void valueUnbound(HttpSessionBindingEvent event)方法
12 
13 * @author: 孤傲蒼狼
14 * @date: 2014-9-11 下午11:14:54
15 *
16 */ 
17 public class JavaBeanDemo1 implements HttpSessionBindingListener {
18 
19     private String name;
20     
21     @Override
22     public void valueBound(HttpSessionBindingEvent event) {
23         System.out.println(name+"被加到session中了");
24     }
25 
26     @Override
27     public void valueUnbound(HttpSessionBindingEvent event) {
28         System.out.println(name+"被session踢出來了");
29     }
30 
31     public String getName() {
32         return name;
33     }
34 
35     public void setName(String name) {
36         this.name = name;
37     }
38 
39     public JavaBeanDemo1(String name) {
40         this.name = name;
41     }
42 }
複製程式碼

  上述的JavaBeanDemo1這個javabean實現了HttpSessionBindingListener介面,那麼這個JavaBean物件可以感知自己被繫結到Session中和從Session中刪除的這兩個操作,測試程式碼如下:

複製程式碼
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <%@page import=" me.gacl.domain.JavaBeanDemo1"%>
 3 <!DOCTYPE HTML>
 4 <html>
 5   <head>
 6     <title></title>
 7   </head>
 8   
 9   <body>
10     <% 
11         //將javabean物件繫結到Session中
12         session.setAttribute("bean",new JavaBeanDemo1("孤傲蒼狼"));
13         //從Session中刪除javabean物件
14         session.removeAttribute("bean");
15     %>
16   </body>
17 </html>
複製程式碼

  執行結果如下:

  

2.2、HttpSessionActivationListener介面

  實現了HttpSessionActivationListener介面的JavaBean物件可以感知自己被活化(反序列化)和鈍化(序列化)的事件
  當繫結到HttpSession物件中的javabean物件將要隨HttpSession物件被鈍化(序列化)之前,web伺服器呼叫該javabean物件的void sessionWillPassivate(HttpSessionEvent event) 方法。這樣javabean物件就可以知道自己將要和HttpSession物件一起被序列化(鈍化)到硬碟中.
  當繫結到HttpSession物件中的javabean物件將要隨HttpSession物件被活化(反序列化)之後,web伺服器呼叫該javabean物件的void sessionDidActive(HttpSessionEvent event)方法。這樣javabean物件就可以知道自己將要和 HttpSession物件一起被反序列化(活化)回到記憶體中

範例:

複製程式碼
 1 package me.gacl.domain;
 2 
 3 import java.io.Serializable;
 4 
 5 import javax.servlet.http.HttpSessionActivationListener;
 6 import javax.servlet.http.HttpSessionEvent;
 7 
 8 /**
 9 * @ClassName: JavaBeanDemo2
10 * @Description: 
11     實現了HttpSessionActivationListener介面的 JavaBean 物件可以感知自己被活化和鈍化的事件
12     活化:javabean物件和Session一起被反序列化(活化)到記憶體中。
13     鈍化:javabean物件存在Session中,當伺服器把session序列化到硬碟上時,如果Session中的javabean物件實現了Serializable介面
14     那麼伺服器會把session中的javabean物件一起序列化到硬碟上,javabean物件和Session一起被序列化到硬碟中的這個操作稱之為鈍化
15     如果Session中的javabean物件沒有實現Serializable介面,那麼伺服器會先把Session中沒有實現Serializable介面的javabean物件移除
16     然後再把Session序列化(鈍化)到硬碟中
17     當繫結到 HttpSession物件中的javabean物件將要隨 HttpSession物件被鈍化之前,
18     web伺服器呼叫該javabean物件物件的 void sessionWillPassivate(HttpSessionEvent event)方法
19     這樣javabean物件就可以知道自己將要和 HttpSession物件一起被序列化(鈍化)到硬碟中
20     當繫結到HttpSession物件中的javabean物件將要隨 HttpSession物件被活化之後,
21     web伺服器呼叫該javabean物件的 void sessionDidActive(HttpSessionEvent event)方法
22     這樣javabean物件就可以知道自己將要和 HttpSession物件一起被反序列化(活化)回到記憶體中
23 * @author: 孤傲蒼狼
24 * @date: 2014-9-11 下午11:22:35
25 *
26 */ 
27 public class JavaBeanDemo2 implements HttpSessionActivationListener,
28         Serializable {
29 
30      
31     private static final long serialVersionUID = 7589841135210272124L;
32     private String name;
33     
34     @Override
35     public void sessionWillPassivate(HttpSessionEvent se) {
36         
37         System.out.println(name+"和session一起被序列化(鈍化)到硬碟了,session的id是:"+se.getSession().getId());
38     }
39 
40     @Override
41     public void sessionDidActivate(HttpSessionEvent se) {
42         System.out.println(name+"和session一起從硬碟反序列化(活化)回到記憶體了,session的id是:"+se.getSession().getId());
43     }
44 
45     public String getName() {
46         return name;
47     }
48 
49     public void setName(String name) {
50         this.name = name;
51     }
52 
53     public JavaBeanDemo2(String name) {
54         this.name = name;
55     }
56 }
複製程式碼

  為了觀察繫結到HttpSession物件中的javabean物件隨HttpSession物件一起被鈍化到硬碟上和從硬碟上重新活化回到記憶體中的的過程,我們需要藉助tomcat伺服器幫助我們完成HttpSession物件的鈍化和活化過程,具體做法如下:

  在WebRoot\META-INF資料夾下建立一個context.xml檔案,如下所示:

  

  context.xml檔案的內容如下:

1 <Context>
2     <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
3     <Store className="org.apache.catalina.session.FileStore" directory="gacl"/>
4     </Manager>
5 </Context>

  在context.xml檔案檔案中配置了1分鐘之後就將HttpSession物件鈍化到本地硬碟的一個gacl資料夾中

  jsp測試程式碼如下:

複製程式碼
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <%@page import="me.gacl.domain.JavaBeanDemo2"%>
 3 <!DOCTYPE HTML>
 4 <html>
 5   <head>
 6     <title></title>
 7   </head>
 8   
 9   <body>
10       一訪問JSP頁面,HttpSession就建立了,建立好的Session的Id是:${pageContext.session.id}
11        <hr/>
12    <% 
13         session.setAttribute("bean",new JavaBeanDemo2("孤傲蒼狼"));
14     %>
15   </body>
16 </html>
複製程式碼

  訪問這個jsp頁面,伺服器就會馬上建立一個HttpSession物件,然後將實現了HttpSessionActivationListener介面的JavaBean物件繫結到session物件中,這個jsp頁面在等待1分鐘之後沒有人再次訪問,那麼伺服器就會自動將這個HttpSession物件鈍化(序列化)到硬碟上,

  

  我們可以在tomcat伺服器的work\Catalina\localhost\JavaWeb_Listener_20140908\gacl資料夾下找到序列化到本地儲存的session,如下圖所示:

  

相關推薦

JavaWeb學習 ()————監聽器(Listener)學習()

一、監聽域物件中屬性的變更的監聽器   域物件中屬性的變更的事件監聽器就是用來監聽 ServletContext, HttpSession, HttpServletRequest 這三個物件中的屬性變更資訊事件的監聽器。  這三個監聽器介面分別是ServletContextAttributeL

JavaWeb學習 (五)————監聽器(Listener)

一、監聽器介紹 1.1、監聽器的概念      監聽器是一個專門用於對其他物件身上發生的事件或狀態改變進行監聽和相應處理的物件,當被監視的物件發生情況時,立即採取相應的行動。監聽器其實就是一個實現特定介面的普通java程式,這個程式專門用於監聽另一個java物件的方法呼叫或屬性改變,當被監聽物件發生上述

JavaWeb學習 (七)————監聽器(Listener)在開發中的應用

  監聽器在JavaWeb開發中用得比較多,下面說一下監聽器(Listener)在開發中的常見應用 一、統計當前線上人數   在JavaWeb應用開發中,有時候我們需要統計當前線上的使用者數,此時就可以使用監聽器技術來實現這個功能了。 1 package me.gacl.web.

Java基礎學習筆記 集合框架(

first 哈希 cat etag 基於 col 容器 處的 新元素 List List接口的特點: 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麽集合中,元素的存儲就是按照11、22、33的順序完成的。 它是一個帶有索引的集合,通過索引就

、python學習之前端(九):JQuery資料互動

一.juqery物件: js中的物件,就是python中的字典: 1定義方法: 定義方法1: var obj1 = {name:"張三", "age":18, "address":"三里屯"} 定義方法2: var obj2 = new Object(); ob

吳恩達機器學習)機器學習流水線、上限分析

目錄 0. 前言 1. 流水線 2. 上限分析(Ceiling analysis) 學習完吳恩達老師機器學習課程的照片OCR,簡單的做個筆記。文中部分描述屬於個人消化後的理解,僅供參考。 如果這篇文章對你有一點小小的幫助,請給個關注

Linux學習筆記()grep

grepgrepgrep [-cinvABC] ‘word‘ filename -c 行數-i 不區分大小寫-n 顯示行號-v 取反-r 遍歷所有子目錄-A 後面跟數字,過濾出符合要求的行以及下面n行-B 同上,過濾出符合要求的行以及上面n行-C 同上,同時過濾出符合要求的行以及上下各n行 mkdir /tm

馬哥教育第二四至學習總結

進程管理 計劃任務 shell進階1馬哥教育M28-24天、 1.使用nmcli創建bond, team ,bridgebondnmcli connection add con-name bond0 type bond ifname bond0 mode active-backupnmcli conn

Linux學習總結()防火墻規則之firewalld

firewalld iptables 一iptables 規則備份 service iptables save //會把規則保存到/etc/sysconfig/iptables把iptables規則備份到my.ipt文件中iptables-save > my.ipt恢復剛才備份的規則 iptab

Java學習總計()——JavaScript正則表達式,Js表單驗證,原生js+css頁面時鐘

text 先來 helloword 郵箱 用戶名 就是 lac round 外部 一.JavaScript正則表達式1.exec檢索字符串中指定的值,返回找到的值,並確定其位置2.test檢索字符串中指定的值,返回true或false3.正則表達式對象的創建:(1)方式一:

、python中json學習

十六 bank cbc bsp python文件 Coding pickle passwd strong 1.json序列介紹:提供4個關鍵字:dumps,dump,loads,load(與pickle用法完全相同)   語法:f.write(bytes(json.dump

ballerina 學習 專案docker 部署&& 執行(

ballerina 從釋出,到現在官方文件的更新也是很給力的,同時也有好多改進,越來越好用了 可以參考官方文件 https://ballerina.io/learn/by-guide/restful-service/ 專案初始化 專案結構 └── guide └──

JMeter學習)邏輯控制器

Meter中的Logic Controller用於為Test Plan中的節點新增邏輯控制器。 JMeter中的Logic Controller分為兩類:一類用來控制Test Plan執行過程中節點的邏輯執行順序,如:Loop Controller、If Controller等;另一類則與節點邏

Effective_STL 學習筆記() 儘量使用 iterator 代替 const_iterator,reverse_iterator和const_reverse_iterator

  每個標準容器類都提供四種迭代器型別,對於container<T>而言: 1 iterator          // 的作用相當於T*, 2 const_iterator       // 相當於 const T*(也可 T const*) 3

Python學習之旅(

Python基礎知識(25):常用內建模組 1、datetime:處理日期和時間 (1)獲取當前日期和時間 from datetime import datetime now = datetime.now() print(now) 結果: 2018-12-07 16:05:53.396953

opencv學習):超大影象值化

超大影象二值化的方法         1.可以採用分塊方法;2.先縮放處理就行二值化,然後還原大小。 一:分塊處理超大影象的二值化問題 #匯入cv模組 import cv2 as cv import numpy as np #超大影象二值化 de

opencv學習):影象的值化

影象二值化介紹:https://blog.csdn.net/qq_30490125/article/details/80458500                       &nbs

Django學習筆記():閱讀計數和優化計數(防重新整理)

閱讀計數主要就是記錄網頁被瀏覽的次數,防刷的方法就是記錄瀏覽的cookie,使每個cookie只能增加一次閱讀數, 當然,刪除cookie和關閉瀏覽器就可以重新增加閱讀數,更加優化的方法還在學習中,先分享這個我會的 models.py的程式碼 class Books(m

四、python學習之前端():JQuery進階

一、jquery特殊效果: 1.特殊動畫: 1.1 特殊動畫函式: a.無參直接隱藏/顯示/切換,帶參變成動畫 函式 功能 hide() 隱藏元素

javaweb學習總結()——Filter(過濾器)常見應用

一、統一全站字元編碼   通過配置引數charset指明使用何種字元編碼,以處理Html Form請求引數的中文問題 package me.gacl.web.filter; import java.io.IOException; import javax.servlet