JavaWeb基礎(chǔ)之Listener基本用法

用來監(jiān)聽特定對象的創(chuàng)建或銷毀耿导、屬性的變化

1.監(jiān)聽器接口的分類

1.1、監(jiān)聽對象創(chuàng)建/銷毀的監(jiān)聽器接口

Interface ServletRequestListener     監(jiān)聽request對象的創(chuàng)建或銷毀
Interface HttpSessionListener        監(jiān)聽session對象的創(chuàng)建或銷毀
Interface ServletContextListener     監(jiān)聽servletContext對象的創(chuàng)建或銷毀

1.2、監(jiān)聽對象屬性的變化

Interface ServletRequestAttributeListener 監(jiān)聽request對象屬性變化: 添加抵卫、移除、修改
Interface HttpSessionAttributeListener    監(jiān)聽session對象屬性變化: 添加殖氏、移除姻采、修改

Interface ServletContextAttributeListener 監(jiān)聽servletContext對象屬性變化

1.3、session相關(guān)監(jiān)聽器

Interface HttpSessionBindingListener   監(jiān)聽對象綁定到session上的事件   
Interface HttpSessionActivationListener(了解) 監(jiān)聽session序列化及反序列化的事件

2.監(jiān)聽器的開發(fā)

2.1 步驟:

2.1.1.寫一個普通java類慨亲,實現(xiàn)相關(guān)接口;
2.1.2.配置(web.xml)

2.2 實例

A.監(jiān)聽request對象的創(chuàng)建或銷毀

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener{

    // 對象銷毀
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // 獲取request中存放的數(shù)據(jù)
        Object obj = sre.getServletRequest().getAttribute("cn");
        System.out.println(obj);
        System.out.println("MyRequestListener.requestDestroyed()");
    }

    // 對象創(chuàng)建
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("MyRequestListener.requestInitialized()");
    }
}
<!-- 監(jiān)聽request對象創(chuàng)建巴刻、銷毀 -->
    <listener>
        <listener-class>cn.acamy.a_life.MyRequestListener</listener-class>
    </listener>

B. 監(jiān)聽ServletContext對象創(chuàng)建或銷毀

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("MyServletContextListener.contextDestroyed()");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("1..........MyServletContextListener.contextInitialized()");
    }

}
<!-- 監(jiān)聽servletContext對象創(chuàng)建胡陪、銷毀 -->
    <listener>
        <listener-class>cn.acamy.a_life.MyServletContextListener</listener-class>
    </listener>

C.監(jiān)聽Session對象創(chuàng)建碍舍、銷毀

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener{

    // 創(chuàng)建
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("MySessionListener.sessionCreated()");
    }

    // 銷毀
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("MySessionListener.sessionDestroyed()");
    }

}
<!-- 監(jiān)聽session對象創(chuàng)建、銷毀 -->
    <listener>
        <listener-class>cn.itcast.a_life.MySessionListener</listener-class>
    </listener>

D.監(jiān)聽session對象屬性的變化

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class MySessionAttrListener implements HttpSessionAttributeListener {

    // 屬性添加
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        // 先獲取session對象
        HttpSession session = se.getSession();
        // 獲取添加的屬性
        Object obj = session.getAttribute("userName");
        // 測試
        System.out.println("添加的屬性:" + obj);
    }

    // 屬性移除
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("屬性移除");
    }

    // 屬性被替換
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        // 獲取sesison對象
        HttpSession session = se.getSession();
        
        // 獲取替換前的值
        Object old = se.getValue();
        System.out.println("原來的值:" + old);
        
        // 獲取新值
        Object obj_new = session.getAttribute("userName");
        System.out.println("新值:" + obj_new);
        
    }

}

E.監(jiān)聽此對象綁定到session上的過程

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class Admin implements HttpSessionBindingListener {

    private int id;
    private String name;
    
    public Admin() {
        super();
    }
    public Admin(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    
    // 構(gòu)造函數(shù)
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    // 對象放入session
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("Admin對象已經(jīng)放入session");
    }
    // 對象從session中移除
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("Admin對象從session中移除!");
    }
    
}

注意:
因為監(jiān)聽的對象是自己創(chuàng)建的對象捧书,不是服務(wù)器對象,所以不用再進(jìn)行web.xml配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳄厌,一起剝皮案震驚了整個濱河市荞胡,隨后出現(xiàn)的幾起案子了嚎,更是在濱河造成了極大的恐慌泪漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件露筒,死亡現(xiàn)場離奇詭異敌卓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趟径,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蜗巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幕屹,你說我怎么就攤上這事⊥希” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵沧烈,是天一觀的道長像云。 經(jīng)常有香客問我,道長腋逆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任惩歉,我火速辦了婚禮俏蛮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘争涌。我一直安慰自己,他們只是感情好亮垫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燃异,像睡著了一般继蜡。 火紅的嫁衣襯著肌膚如雪回俐。 梳的紋絲不亂的頭發(fā)上稀并,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天稻轨,我揣著相機(jī)與錄音灵莲,去河邊找鬼雕凹。 笑死,一個胖子當(dāng)著我的面吹牛线欲,可吹牛的內(nèi)容都是我干的汽摹。 我是一名探鬼主播李丰,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼校赤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗜憔?” 一聲冷哼從身側(cè)響起氏仗,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呐舔,沒想到半個月后慷蠕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珊拼,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杆麸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昔头。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡莱革,死狀恐怖讹开,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旦万,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布赏半,位于F島的核電站淆两,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秋冰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一埃撵、第九天 我趴在偏房一處隱蔽的房頂上張望虽另。 院中可真熱鬧暂刘,春花似錦洲赵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辅鲸。三九已至腹殿,卻和暖如春例书,著一層夾襖步出監(jiān)牢的瞬間刻炒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工树瞭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晒喷。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓访敌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寺旺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

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

  • 本文包括:1废赞、Listener簡介2叮姑、Servlet監(jiān)聽器3据悔、監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4、監(jiān)聽三個域?qū)?..
    廖少少閱讀 6,051評論 6 28
  • 從三月份找實習(xí)到現(xiàn)在极颓,面了一些公司,掛了不少兵琳,但最終還是拿到小米、百度躯肌、阿里、京東清女、新浪晰筛、CVTE嫡丙、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,218評論 11 349
  • 監(jiān)聽器(listener) 監(jiān)聽器簡介 :監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序曙博,這個程序?qū)iT用于監(jiān)聽另一個...
    奮斗的老王閱讀 2,500評論 0 53
  • 陪你見證每一步的成長 你還以為美術(shù)課就只是培養(yǎng)兒童學(xué)習(xí)技能技巧的一門課嗎? 或者美術(shù)教育就是以培養(yǎng)藝術(shù)家為唯一目的...
    我陪你成長_你陪我變老閱讀 218評論 0 0
  • 這是一個生不如死的時代泰佳,或者說這是一個生死界限很模糊的年代尘吗。 然而不管何時逝她,人性總是主宰著這個由人組成的社會睬捶。 盛...
    搔首問青天閱讀 398評論 0 0