JavaWeb三大組件之監(jiān)聽器(Listener)

?監(jiān)聽器是一個(gè)專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽和相應(yīng)處理的對(duì)象,當(dāng)被監(jiān)視的對(duì)象發(fā)生情況時(shí)这揣,立即采取相應(yīng)的行動(dòng)攻柠。監(jiān)聽器其實(shí)就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序赃磨,這個(gè)程序?qū)iT用于監(jiān)聽另一個(gè)java對(duì)象的方法調(diào)用或?qū)傩愿淖儯?dāng)被監(jiān)聽對(duì)象發(fā)生上述事件后轧钓,監(jiān)聽器某個(gè)方法立即被執(zhí)行序厉。
上述概念設(shè)計(jì)到3個(gè)名詞概念:

1.事件源:即誰產(chǎn)生的事件
2.事件對(duì)象:即產(chǎn)生了什么事件
3.監(jiān)聽器:監(jiān)聽事件源的動(dòng)作

?由于事件源可以產(chǎn)生多個(gè)動(dòng)作(即產(chǎn)生多個(gè)事件),而監(jiān)聽器中的每一個(gè)方法監(jiān)聽一個(gè)動(dòng)作毕箍,故每個(gè)監(jiān)聽器中都有很多方法弛房。

1.JavaWeb中的監(jiān)聽器

1.1概念

?JavaWeb中的監(jiān)聽器是Servlet規(guī)范中定義的一種特殊類,它用于監(jiān)聽web應(yīng)用程序中的ServletContext而柑、HttpSession和 ServletRequest這三大域?qū)ο蟮膭?chuàng)建文捶、銷毀事件以及監(jiān)聽這些域?qū)ο笾械膶傩园l(fā)生修改的事件。

1.2JavaWeb中監(jiān)聽器的分類

?在Servlet規(guī)范中定義了多種類型的監(jiān)聽器(一共8個(gè)監(jiān)聽器)媒咳,它們用于監(jiān)聽的事件源分別為ServletContext粹排,HttpSession和ServletRequest這三個(gè)域?qū)ο蟆ervlet規(guī)范針對(duì)這三個(gè)對(duì)象上的操作涩澡,又把多種類型的監(jiān)聽器劃分為三種類型:

1.域?qū)ο蟮纳芷诒O(jiān)聽:監(jiān)聽域?qū)ο笞陨淼膭?chuàng)建和銷毀顽耳。這個(gè)監(jiān)聽器需要實(shí)現(xiàn)相應(yīng)的監(jiān)聽器接口:ServletContextListener、HttpSessionListener、ServletRequestListener射富。

2.域?qū)ο蟮膶傩员O(jiān)聽:監(jiān)聽域?qū)ο笾袑傩缘脑黾雍蛣h除膝迎。這個(gè)監(jiān)聽器需要實(shí)現(xiàn)的監(jiān)聽器接口為:ServletContextAttributeListener、HttpSessionAttributeListener胰耗、ServletRequestAttributeListener

3.感知監(jiān)聽(都與HttpSession域?qū)ο笥嘘P(guān)):監(jiān)聽綁定到HttpSession域中的某個(gè)JavaBean對(duì)象的狀態(tài)的監(jiān)聽器弄抬。這個(gè)監(jiān)聽器需要實(shí)現(xiàn)的監(jiān)聽器接口:HttpSessionBindingListener、HttpSessionActiveationListener.

1.3第一類:域?qū)ο蟮纳芷诒O(jiān)聽

?事件源為:三大域事件對(duì)象為:創(chuàng)建與銷毀監(jiān)聽器為:實(shí)現(xiàn)了ServletContextListener宪郊、HttpSessionListener、ServletRequestListener這三個(gè)接口的監(jiān)聽器

1.3.1ServletContext的生命周期監(jiān)聽
public class AListener implements ServletContextListener{    
    //在項(xiàng)目啟動(dòng)時(shí)調(diào)用    
    public void contextInitialized(ServletContextEvent sce) {   
    }    
    //在項(xiàng)目關(guān)閉時(shí)調(diào)用    
    public void contextDestroyed(ServletContextEvent sce) {      
    }
}

在web.xml文件中對(duì)該監(jiān)聽器進(jìn)行配置:

<listener>    
<listener-class>listener.AListener</listener-class>
</listener>
1.3.2HttpSession的生命周期監(jiān)聽

代碼同上述基本一致:

public class AListener implements HttpSessionListener{  
    //在會(huì)話產(chǎn)生時(shí)調(diào)用      
    public void sessionCreated(HttpSessionEvent sce) {      
    }   
     //在會(huì)話關(guān)閉時(shí)調(diào)用    
     public void sessionDestroyed(HttpSessionEvent sce) {      
    }
}

同樣需要在web.xml文件中進(jìn)行配置:

<listener>    
<listener-class>listener.AListener</listener-class>
</listener>
1.3.3對(duì)各個(gè)監(jiān)聽器接口的方法中出現(xiàn)的類介紹

?ServletContextEvent類:類中有一個(gè)方法getServletContext(),該方法返回ServletContext對(duì)象拖陆。
?HttpSessionEvent類:類中有一個(gè)方法getSession()弛槐,該方法返回一個(gè)HttpSession對(duì)象。
?ServletRequestEvent類:類中有兩個(gè)方法依啰,getServletContext()用于返回一個(gè)ServletContext對(duì)象乎串,getServletRequest()用于返回一個(gè)ServletRequest對(duì)象。

1.4第二類:域?qū)ο蟮膶傩员O(jiān)聽

事件源:三大域事件對(duì)象:屬性的增加與刪除監(jiān)聽器:實(shí)現(xiàn)了ServletContextAttributeListener速警、HttpSessionAttributeListener叹誉、ServletRequestAttributeListener接口的監(jiān)聽器

1.4.1ServletContext的屬性監(jiān)聽
public class AListener implements ServletContextAttributeListener{    

    //給ServletContext對(duì)象添加屬性時(shí)調(diào)用    
    public void attributeAdded(ServletcontextAttribute scab){      
    }    
    //給ServletContext對(duì)象刪除屬性時(shí)調(diào)用   
    public void attributeRemoved(ServletContextAttributeEvent scab){    
    }    
    //給ServletContext對(duì)象替換屬性值時(shí)調(diào)用    
    public void attributeReplaced(ServletContextAttributeEvent scab){    
    }
}

同樣需要在web.xml文件中對(duì)AListener進(jìn)行配置。

1.4.2HttpSession的屬性監(jiān)聽
public class AListener implements HttpSessionAttributeListener{   
//給HttpSession對(duì)象添加屬性時(shí)調(diào)用     
public void attributeAdded(HttpSessionAttribute scab){      
}    
//給HttpSession對(duì)象刪除屬性時(shí)調(diào)用    
public void attributeRemoved(HttpSessionAttributeEvent scab){    
}        
//給HttpSession對(duì)象替換屬性值時(shí)調(diào)用    
public void attributeReplaced(HttpSessionAttributeEvent scab){    
}
}

同樣需要在web.xml中對(duì)AListener進(jìn)行配置闷旧。

1.4.3ServletRequest的屬性監(jiān)聽
public class AListener implements ServletRequestAttributeListener{    
//給ServletRequest對(duì)象添加屬性時(shí)調(diào)用    
public void attributeAdded(ServletRequestAttribute scab){      
}    
//給ServletRequest對(duì)象刪除屬性時(shí)調(diào)用    
public void attributeRemoved(ServletRequestAttributeEvent scab){    
}    
//給ServletRequest對(duì)象替換屬性值時(shí)調(diào)用    
public void attributeReplaced(ServletRequestAttributeEvent scab){    
}
}

同樣需要在web.xml中對(duì)AListener進(jìn)行配置长豁。

1.4.4對(duì)各個(gè)監(jiān)聽器接口的方法中出現(xiàn)的類介紹

ServletContextAttributeEvent類:該類對(duì)象有三個(gè)方法,getSevletContext()用于返回一個(gè)ServletContext忙灼,getName()用于返回屬性名匠襟,getValue()用于返回屬性值。
HttpSessionBindingEvent類:該類對(duì)象有兩個(gè)方法该园,getName()用于獲取屬性名酸舍,getValue()用于獲取屬性值。
ServletRequestAttributeEvent類:該類對(duì)象有兩個(gè)方法里初,getName()用于獲取屬性名啃勉,getValue()用于獲取屬性值。

1.5感知監(jiān)聽器

保存在Session域中的對(duì)象可以有多種狀態(tài):綁定(session.setAttribute(“bean”,Object))到Session中,隨Session對(duì)象持久化到一個(gè)存儲(chǔ)設(shè)備中双妨;從Session域中解除(session.removeAttribute(“bean”))綁定,隨Session對(duì)象從一個(gè)存儲(chǔ)設(shè)備中恢復(fù)淮阐。
Servlet 規(guī)范中定義了兩個(gè)特殊的監(jiān)聽器接口”HttpSessionBindingListener和HttpSessionActivationListener”來幫助JavaBean 對(duì)象了解自己在Session域中的這些狀態(tài),實(shí)現(xiàn)這兩個(gè)接口的類不需要 web.xml 文件中進(jìn)行注冊(cè)斥难。

1.5.1HttpSessionBindingListener接口

實(shí)現(xiàn)了HttpSessionBindingListener接口的JavaBean對(duì)象可以感知自己被綁定到Session中和 Session中刪除的事件枝嘶。
當(dāng)對(duì)象被綁定到HttpSession對(duì)象中時(shí),web服務(wù)器調(diào)用該對(duì)象的void valueBound(HttpSessionBindingEvent event)方法哑诊。
當(dāng)對(duì)象從HttpSession對(duì)象中解除綁定時(shí)群扶,web服務(wù)器調(diào)用該對(duì)象的void valueUnbound(HttpSessionBindingEvent event)方法。

public class JavaBeanDemo1 implements HttpSessionBindingListener {      
private String name;          
@Override     
public void valueBound(HttpSessionBindingEvent event) {         
System.out.println(name+"被加到session中了");     }      
@Override     
public void valueUnbound(HttpSessionBindingEvent event) {         
System.out.println(name+"被session踢出來了");     
}      
public String getName() {         
return name;     
}      
public void setName(String name) {         
this.name = name;     
}      
public JavaBeanDemo1(String name) {         
this.name = name;     
} 
}

上述的JavaBeanDemo1這個(gè)javabean實(shí)現(xiàn)了HttpSessionBindingListener接口,那么這個(gè)JavaBean對(duì)象可以感知自己被綁定到Session中和從Session中刪除的這兩個(gè)操作竞阐。

1.5.2HttpSessionActivationListener接口

實(shí)現(xiàn)了HttpSessionActivationListener接口的JavaBean對(duì)象可以感知自己被活化(反序列化)和鈍化(序列化)的事件缴饭。
當(dāng)綁定到HttpSession對(duì)象中的javabean對(duì)象將要隨HttpSession對(duì)象被鈍化(序列化)之前,web服務(wù)器調(diào)用該javabean對(duì)象的void sessionWillPassivate(HttpSessionEvent event) 方法骆莹。這樣javabean對(duì)象就可以知道自己將要和HttpSession對(duì)象一起被序列化(鈍化)到硬盤中颗搂。
當(dāng)綁定到HttpSession對(duì)象中的javabean對(duì)象將要隨HttpSession對(duì)象被活化(反序列化)之后,web服務(wù)器調(diào)用該javabean對(duì)象的void sessionDidActive(HttpSessionEvent event)方法幕垦。這樣javabean對(duì)象就可以知道自己將要和 HttpSession對(duì)象一起被反序列化(活化)回到內(nèi)存中丢氢。(javabean隨著HttpSession對(duì)象一起被活化的前提是該javabean對(duì)象除了實(shí)現(xiàn)該接口外還應(yīng)該實(shí)現(xiàn)Serialize接口)。

public class JavaBeanDemo2 implements HttpSessionActivationListener, Serializable {            
    private static final long serialVersionUID = 7589841135210272124L;    
    private String name; 
         
    @Override     
    public void sessionWillPassivate(HttpSessionEvent se) {                  
        System.out.println(name+"和session一起被序列化(鈍化)到硬盤了先改,session的id是:"+se.getSession().getId());     
    }      
    @Override     
    public void sessionDidActivate(HttpSessionEvent se) {         
        System.out.println(name+"和session一起從硬盤反序列化(活化)回到內(nèi)存了疚察,session的id是:"+se.getSession().getId());     
    }     
    public String getName() {         
        return name;     
    }     
    public void setName(String name) {         
        this.name = name;     
    }      
    public JavaBeanDemo2(String name) {        
        this.name = name;     
    } 
}

既然這里談到了session的序列化(鈍化),反序列化(活化)那我們就來具體聊聊仇奶。

2.session序列化(鈍化)

在session上線時(shí)貌嫡,會(huì)在tomcat/work/Catalina/localhost/項(xiàng)目名/
下生成一個(gè)sessions.ser文件,里面存放了所有session的信息该溯,當(dāng)你正在訪問某個(gè)網(wǎng)頁時(shí)若此時(shí)服務(wù)器關(guān)閉(關(guān)閉時(shí)才生成這個(gè)文件)又打開(打開后這個(gè)文件會(huì)消失)岛抄,你依舊能正常訪問該網(wǎng)頁。(故說session有重生的效果)狈茉。若想廢掉session的序列化,需要在tomcat/conf/context.xml中添加

<Manager pathname=“”/>

3.session的鈍化與活化

Tomcat會(huì)在session一段時(shí)間內(nèi)不被使用時(shí)鈍化session對(duì)象夫椭,所謂鈍化session,就是把session通過序列化的方法保存到硬盤文件中论皆。當(dāng)用戶再使用session時(shí)益楼,Tomcat還會(huì)把鈍化的對(duì)象再活化session,所謂活化就是把硬盤文件中的session在反序列化中放回內(nèi)存点晴。當(dāng)session被tomcat鈍化時(shí)感凤,sesseion中存儲(chǔ)的對(duì)象也被鈍化,當(dāng)session被活化時(shí)粒督,也會(huì)把session中存儲(chǔ)的對(duì)象(javabean對(duì)象)活化陪竿。如果某個(gè)類(javabean對(duì)象)實(shí)現(xiàn)了HttpSessionActiveationListener接口后,當(dāng)對(duì)象隨著session被鈍化和活化時(shí)屠橄,下面兩個(gè)方法就會(huì)被調(diào)用:
public void sessionWillPassivate(HttpSessionEvent se):當(dāng)對(duì)象感知被活化時(shí)調(diào)用本方法族跛。 public void sessionDidActivate(HttpSessionEvent se):當(dāng)對(duì)象感知被鈍化時(shí)調(diào)用本方法。
鈍化時(shí)會(huì)在tomcat/work/Catalina/localhost/項(xiàng)目/mysession/
文件下生成一個(gè)后綴為.session的文件锐墙,網(wǎng)頁中一個(gè)被鈍化的session就對(duì)應(yīng)一個(gè).session文件(而上面的序列化是一個(gè).ser文件存在所有的session)礁哄,在活化時(shí)此文件也不會(huì)消失(不同于上述的.ser文件消失)。當(dāng)然要看到上述效果溪北,應(yīng)該先配置tomcat鈍化session的參數(shù)桐绒,在tomcat/conf/catalina/localhost
目錄下夺脾,添加以下配置內(nèi)容:
(google一下吧)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茉继,一起剝皮案震驚了整個(gè)濱河市咧叭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烁竭,老刑警劉巖菲茬,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異派撕,居然都是意外死亡婉弹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門终吼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來马胧,“玉大人,你說我怎么就攤上這事衔峰。” “怎么了蛙粘?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵垫卤,是天一觀的道長。 經(jīng)常有香客問我出牧,道長穴肘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任舔痕,我火速辦了婚禮评抚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伯复。我一直安慰自己慨代,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布啸如。 她就那樣靜靜地躺著侍匙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叮雳。 梳的紋絲不亂的頭發(fā)上想暗,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音帘不,去河邊找鬼说莫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寞焙,可吹牛的內(nèi)容都是我干的储狭。 我是一名探鬼主播互婿,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晶密!你這毒婦竟也來了擒悬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤稻艰,失蹤者是張志新(化名)和其女友劉穎懂牧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尊勿,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僧凤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了元扔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躯保。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澎语,靈堂內(nèi)的尸體忽然破棺而出途事,到底是詐尸還是另有隱情,我是刑警寧澤擅羞,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布尸变,位于F島的核電站,受9級(jí)特大地震影響减俏,放射性物質(zhì)發(fā)生泄漏召烂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一娃承、第九天 我趴在偏房一處隱蔽的房頂上張望奏夫。 院中可真熱鬧,春花似錦历筝、人聲如沸酗昼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仔雷。三九已至,卻和暖如春舔示,著一層夾襖步出監(jiān)牢的瞬間碟婆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工惕稻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竖共,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓俺祠,卻偏偏與公主長得像公给,于是被迫代替她去往敵國和親借帘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 監(jiān)聽器是一個(gè)專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽和相應(yīng)處理的對(duì)象淌铐,當(dāng)被監(jiān)視的對(duì)象發(fā)生情況時(shí)肺然,立即采取...
    joshul閱讀 267評(píng)論 0 1
  • 本文包括:1、Listener簡介2腿准、Servlet監(jiān)聽器3际起、監(jiān)聽三個(gè)域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4、監(jiān)聽三個(gè)域?qū)?..
    廖少少閱讀 6,084評(píng)論 6 28
  • 一吐葱、監(jiān)聽器的概覽 監(jiān)聽器是指專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)的改變進(jìn)行監(jiān)聽和相應(yīng)處理的對(duì)象街望,當(dāng)被監(jiān)視的對(duì)象發(fā)...
    不知名的蛋撻閱讀 1,373評(píng)論 0 3
  • 監(jiān)聽器(listener) 監(jiān)聽器簡介 :監(jiān)聽器就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序,這個(gè)程序?qū)iT用于監(jiān)聽另一個(gè)...
    奮斗的老王閱讀 2,517評(píng)論 0 53
  • 西方傳來的節(jié)日弟跑,火遍東方灾前。可見愛情之永恒魔力孟辑。 年年花相似哎甲, 歲歲寄深恩! 手拈香一朵, 送與有情人饲嗽。
    花屋主人蕭寒閱讀 319評(píng)論 0 1