JavaWeb--Listener

一、基本概念

JavaWeb里面的listener是通過(guò)觀察者設(shè)計(jì)模式進(jìn)行實(shí)現(xiàn)的吭净。對(duì)于觀察者模式,這里不做過(guò)多介紹,大概講一下什么意思役电。

觀察者模式又叫發(fā)布訂閱模式或者監(jiān)聽(tīng)器模式庶柿。在該模式中有兩個(gè)角色:觀察者和被觀察者(通常也叫做主題)浮庐。觀察者在主題里面注冊(cè)自己感興趣的事件审残,當(dāng)這個(gè)事件發(fā)生時(shí)搅轿,主題會(huì)通過(guò)回調(diào)接口的方式通知觀察者璧坟。

舉個(gè)生活中的例子:訂閱報(bào)紙。任何一個(gè)家庭或個(gè)人都可以向報(bào)社訂閱報(bào)紙铲敛。這里報(bào)社就是“主題”会钝,家庭就是“觀察者”迁酸。比如家庭需要訂閱明天早晨的報(bào)紙奸鬓,這個(gè)就是“事件”串远。到了第二天早晨,報(bào)紙生產(chǎn)出來(lái)了伸但,這個(gè)就是“事件發(fā)生”留搔。當(dāng)事件發(fā)生時(shí)隔显,送報(bào)員將報(bào)紙送到家庭的信箱里面括眠,這里的信箱就是“回調(diào)接口”捐下。

主題和觀察者

對(duì)于JavaWeb里面的監(jiān)聽(tīng)器坷襟,Servlet規(guī)范定義了一些列的Listener接口類婴程,通過(guò)接口類的方式將事件暴露給應(yīng)用程序档叔,應(yīng)用程序如果想監(jiān)聽(tīng)其感興趣的事件衙四,那么不必去直接注冊(cè)對(duì)應(yīng)的事件铃肯,而是編寫自己的listener實(shí)現(xiàn)相應(yīng)的接口類,并將自己的listener注冊(cè)到servlet容器传蹈。當(dāng)程序關(guān)心的事件發(fā)生時(shí)押逼,servlet容器會(huì)通知listener,回調(diào)listener里面的方法惦界。這里自定義的listener就是觀察者挑格,servlet容器就是主題。

監(jiān)聽(tīng)者模式

二沾歪、樣例分析

上面說(shuō)了漂彤,servlet容器是通過(guò)Listener接口類將事件暴露給應(yīng)用程序的。所以我們與其說(shuō)是注冊(cè)事件士骤,不如說(shuō)是注冊(cè)監(jiān)聽(tīng)器旨巷。對(duì)應(yīng)到編程步驟就是:1.編寫自己的listener,實(shí)現(xiàn)特定的Listener接口。2.在web.xml里面注冊(cè)自己的listener(也可以通過(guò)注解的方式煤率,道理是一樣的)。這里以最簡(jiǎn)單的監(jiān)聽(tīng)器接口ServletContextListener舉例:

1.TestListener.java

public class TestListener implements ServletContextListener {

    public TestListener() {}

    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextListener.contextInitialized");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContextListener.contextDestroyed");
    }
}

2.web.xml

<listener>
    <listener-class>com.nantang.listener.TestListener</listener-class>
</listener>

當(dāng)容器啟動(dòng)時(shí)會(huì)向日志中輸出"ServletContextListener.contextInitialized",當(dāng)容器關(guān)閉時(shí)會(huì)輸出"ServletContextListener.contextDestroyed"。詳細(xì)的解釋后面會(huì)進(jìn)一步分析担锤。

這里需要注意是团赁,如果在IDE(Eclipse熬丧、STS等)演示上面的例子绿淋,當(dāng)啟動(dòng)服務(wù)器時(shí),在控制臺(tái)可以看到"ServletContextListener.contextInitialized"殿漠,當(dāng)關(guān)閉服務(wù)器時(shí)一忱,是看不到"ServletContextListener.contextDestroyed"的票渠。這不是沒(méi)有執(zhí)行contextDestroyed方法,而是IDE實(shí)現(xiàn)的不夠完美械蹋。要想驗(yàn)證確實(shí)調(diào)用了contextDestroyed荷科,可以在contextDestroyed里面寫一段代碼邏輯往文件輸出內(nèi)容而不要輸出到控制臺(tái)。

三蜀涨、源碼分析

現(xiàn)在我們分析下沐兵,servlet規(guī)范為我們定義了哪些事件。更準(zhǔn)確的說(shuō)是定義了哪些監(jiān)聽(tīng)接口。下面的介紹都是以servlet3.0規(guī)范為準(zhǔn)螟左。

servlet3.0為我們提供了8個(gè)監(jiān)聽(tīng)器接口,按照它們的作用域來(lái)劃分的話可以分為三類:

1.servlet上下文相關(guān)監(jiān)聽(tīng)接口廷粒,包括:ServletContextListener和ServletContextAttributeListener。

2.http session相關(guān)監(jiān)聽(tīng)接口思喊,包括:HttpSessionListener岳服、HttpSessionActivationListener、HttpSessionAttributeListener和HttpSessionBindingListener。

3.servlet request相關(guān)監(jiān)聽(tīng)接口,包括:ServletRequestListener和ServletRequestAttributeListener籍铁。

其實(shí)從接口的命名增显,各位看官應(yīng)該能猜出其基本功能炸站。下面我們按分類來(lái)解釋阀坏。

1.servlet上下文相關(guān)監(jiān)聽(tīng)接口

之前在介紹Servlet的時(shí)候,我們解釋過(guò)一個(gè)web應(yīng)用對(duì)應(yīng)一個(gè)servlet上下文。所以ServletContextListener和ServletContextAttributeListener監(jiān)聽(tīng)的事件的生命范圍是貫穿整個(gè)web應(yīng)用的登淘。下面是這兩個(gè)接口的類圖層級(jí)關(guān)系流妻。

類圖層級(jí)

1.1 EventListener

EventListener是一個(gè)標(biāo)記接口匆篓,所有的事件監(jiān)聽(tīng)器都必須繼承這個(gè)接口窗市,這就是servlet規(guī)范扎拣,沒(méi)什么好解釋的。

1.2 EventObject

和EventListener類似,EventObject是個(gè)事件頂級(jí)類牡借,所有具體的事件類都必須繼承EventObject炬藤。

public class EventObject implements java.io.Serializable {
    
    protected transient Object  source;

    public EventObject(Object source) {
        if (source == null)
            throw new IllegalArgumentException("null source");

        this.source = source;
    }

    public Object getSource() {
        return source;
    }

    public String toString() {
        return getClass().getName() + "[source=" + source + "]";
    }
}

這個(gè)類很簡(jiǎn)單帝火,其本質(zhì)就一個(gè)東西:source。通過(guò)類名EventObject和屬性名source,就能看出這個(gè)類就干了一件事图贸,持有“事件源對(duì)象”撒汉。

1.3 ServletContextEvent

public class ServletContextEvent extends java.util.EventObject { 

    public ServletContextEvent(ServletContext source) {
        super(source);
    }

    public ServletContext getServletContext () { 
        return (ServletContext) super.getSource();
    }
}

servlet上下文事件,這個(gè)事件類就是對(duì)EventObject的簡(jiǎn)單繼承增拥。構(gòu)造方法中提供ServletContext實(shí)例作為事件源。因?yàn)槭录词莝ervlet上下文弟晚,所以提供個(gè)getServletContext獲取ServletContext實(shí)例瑟押。

在我們后續(xù)講解其他事件類的時(shí)候,都是一個(gè)模子维蒙,每個(gè)事件類都提供相應(yīng)的構(gòu)造方法,傳入相應(yīng)的事件源對(duì)象燎猛,并提供額外的獲取事件源方法膜毁。所以EventObject就是個(gè)事件源的基類败玉,所有事件子類的本質(zhì)就干了一件事沦补,確定具體的事件源對(duì)象音榜。

所以我們后面講解事件的地方庞瘸,一帶而過(guò)。

1.4 ServletContextListener

public interface ServletContextListener extends EventListener {

    public void contextInitialized ( ServletContextEvent sce );
    
    public void contextDestroyed ( ServletContextEvent sce );
}

servlet上下文監(jiān)聽(tīng)器接口赠叼,對(duì)應(yīng)著兩個(gè)事件:servlet上下文初始化事件和servlet上下文即將關(guān)閉事件擦囊。

當(dāng)web應(yīng)用初始化的時(shí)候违霞,servlet容器會(huì)構(gòu)造ServletContextEven實(shí)例,并回調(diào)contextInitialize方法瞬场。

當(dāng)servlet上下文即將關(guān)閉時(shí)买鸽,一般是關(guān)閉服務(wù)器之前,servlet容器會(huì)構(gòu)造ServletContextEven實(shí)例贯被,并回調(diào)contextDestroyed方法眼五。這里需要注意的是,contextDestroyed方法的執(zhí)行會(huì)在所有的servlet和filter執(zhí)行完destroy方法之后彤灶。

所以如果我們想在應(yīng)用啟動(dòng)或關(guān)閉時(shí)需要做些事情的話看幼,就編寫自己的listener實(shí)現(xiàn)該接口。

所有的事件監(jiān)聽(tīng)器也是一個(gè)模子幌陕,按照servlet規(guī)范定義相應(yīng)的事件回調(diào)接口方法诵姜,方法的入?yún)⒕褪窍鄳?yīng)的事件源實(shí)例。所以我們后面講解監(jiān)聽(tīng)器的地方也一帶而過(guò)搏熄。

1.5 ServletContextAttributeEvent

public class ServletContextAttributeEvent extends ServletContextEvent { 
    private String name;
    private Object value;

    public ServletContextAttributeEvent(ServletContext source, String name, Object value) {
        super(source);
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return this.name;
    }
    
    public Object getValue() {
        return this.value;   
    }
}

ServletContextAttributeEvent表示servlet上下文屬性相關(guān)事件棚唆,一般當(dāng)屬性發(fā)生改變時(shí)會(huì)觸發(fā)該事件。這個(gè)類繼承ServletContextEven心例,事件源也是ServletContext實(shí)例瑟俭。額外提供屬性名和屬性值的獲取方法。

1.6 ServletContextAttributeListener

public interface ServletContextAttributeListener extends EventListener {
    
    public void attributeAdded(ServletContextAttributeEvent scab);
    
    public void attributeRemoved(ServletContextAttributeEvent scab);
    
    public void attributeReplaced(ServletContextAttributeEvent scab);
}

當(dāng)servlet上文屬性發(fā)生增契邀、刪摆寄、改的時(shí)候,servlet容器構(gòu)造ServletContextAttributeEvent事件對(duì)象坯门,分別回調(diào)attributeAdded微饥、attributeRemoved、attributeReplaced方法古戴。

這里需要注意的是attributeReplaced方法欠橘,當(dāng)屬性的值被替換的時(shí)候回調(diào)。這個(gè)時(shí)候如果調(diào)用ServletContextAttributeEvent.getValue()方法返回的是替換之前的屬性值现恼。

2 http session相關(guān)監(jiān)聽(tīng)接口

類層級(jí)

2.1 HttpSessionEvent

public class HttpSessionEvent extends java.util.EventObject {

     public HttpSessionEvent(HttpSession source) {
        super(source);
    }

    public HttpSession getSession () { 
        return (HttpSession) super.getSource();
    }
}

http session相關(guān)事件肃续,當(dāng)session發(fā)生變化時(shí)會(huì)觸發(fā)該事件。事件源是HttpSession實(shí)例叉袍,并提供額外的HttpSession獲取方法始锚。

2.2 HttpSessionListener

public interface HttpSessionListener extends EventListener {
    
    public void sessionCreated ( HttpSessionEvent se );

    public void sessionDestroyed ( HttpSessionEvent se );
}

當(dāng)session被創(chuàng)建和銷毀的時(shí)候,servlet容器構(gòu)造HttpSessionEvent事件對(duì)象喳逛,并回調(diào)sessionCreated和sessionDestroyed方法瞧捌。

2.3 HttpSessionActivationListener

public interface HttpSessionActivationListener extends EventListener { 

    public void sessionWillPassivate(HttpSessionEvent se); 

    public void sessionDidActivate(HttpSessionEvent se);
}

當(dāng)session將要鈍化或已被激活時(shí),servlet容器構(gòu)造HttpSessionEvent事件對(duì)象,回調(diào)sessionWillPassivate和sessionDidActivate方法姐呐。

這里解釋下鈍化和激活:鈍化是指服務(wù)器內(nèi)存不夠了或者session的活動(dòng)超時(shí)時(shí)間到了殿怜,把最近不活動(dòng)的session序列化到磁盤。激活是指某個(gè)鈍化的session又被訪問(wèn)了曙砂,從磁盤將session反序列化到內(nèi)存头谜。

這里可以看出要想鈍化和激活,首先session得可序列化和反序列化鸠澈。同時(shí)我們?cè)诰幊踢^(guò)程中柱告,session盡量用String、Integer等簡(jiǎn)單的對(duì)象款侵,盡量不要用list、map等集合侧纯。

2.4 HttpSessionBindingEvent

public class HttpSessionBindingEvent extends HttpSessionEvent {

    private String name;
    private Object value;
    
    public HttpSessionBindingEvent(HttpSession session, String name) {
        super(session);
        this.name = name;
    }
   
    public HttpSessionBindingEvent(HttpSession session, String name, Object value) {
        super(session);
        this.name = name;
        this.value = value;
    }
        
    public HttpSession getSession () { 
        return super.getSession();
    }

    public String getName() {
        return name;
    }
    
    public Object getValue() {
        return this.value;   
    }
}

http session的屬性相關(guān)事件新锈,當(dāng)session屬性發(fā)生變化時(shí)會(huì)觸發(fā)該事件。事件源是HttpSession實(shí)例眶熬,并提供額外的獲取HttpSession妹笆、屬性名、屬性值的方法娜氏。

2.5 HttpSessionAttributeListener

public interface HttpSessionAttributeListener extends EventListener {
    
    public void attributeAdded ( HttpSessionBindingEvent se );
    
    public void attributeRemoved ( HttpSessionBindingEvent se );
    
    public void attributeReplaced ( HttpSessionBindingEvent se );
}

當(dāng)session屬性發(fā)生增拳缠、刪、改的時(shí)候贸弥,servlet容器構(gòu)造HttpSessionBindingEvent事件對(duì)象窟坐,分別回調(diào)attributeAdded、attributeRemoved绵疲、attributeReplaced方法哲鸳。

這里需要注意的是attributeReplaced方法,當(dāng)屬性的值被替換的時(shí)候回調(diào)盔憨。這個(gè)時(shí)候如果調(diào)用ServletContextAttributeEvent.getValue()方法返回的是替換之前的屬性值徙菠。

當(dāng)調(diào)用session的invalidate方法或者session失效時(shí),也會(huì)回調(diào)attributeRemoved方法郁岩。

2.6 HttpSessionBindingListener

public interface HttpSessionBindingListener extends EventListener {

    public void valueBound(HttpSessionBindingEvent event);
    
    public void valueUnbound(HttpSessionBindingEvent event);
}

這個(gè)監(jiān)聽(tīng)器也是監(jiān)聽(tīng)session的屬性變化婿奔。當(dāng)session屬性發(fā)生增和刪,也就是屬性值綁定和屬性值解綁的時(shí)候问慎,servlet容器構(gòu)造HttpSessionBindingEvent事件對(duì)象萍摊,分別回調(diào)valueBound、valueUnbound方法如叼。

這么一看和HttpSessionAttributeListener沒(méi)什么區(qū)別记餐,其實(shí)不是這樣。兩者有個(gè)本質(zhì)的區(qū)別就是事件觸發(fā)的條件薇正。

當(dāng)session的屬性有任何的變化片酝,servlet容器都會(huì)通知HttpSessionAttributeListener囚衔。但是對(duì)于HttpSessionBindingListener,只有當(dāng)綁定或解綁的屬性值是監(jiān)聽(tīng)器的實(shí)例時(shí)雕沿,servlet容器才會(huì)通知练湿。舉例來(lái)說(shuō):

public class TestListener implements HttpSessionBindingListener{
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("HttpSessionBindingListener.valueBound");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("HttpSessionBindingListener.valueUnbound");
    }
}

我們自定義監(jiān)聽(tīng)器TestListener實(shí)現(xiàn)HttpSessionBindingListener,下面我們?cè)诖a中設(shè)置如下session屬性:

HttpSession session = request.getSession();
TestListener testListener=new TestListener();
session.setAttribute("listener", testListener);
session.removeAttribute("listener");

這里session的屬性值是我們的監(jiān)聽(tīng)器TestListener實(shí)例审轮。所以這段代碼執(zhí)行時(shí)肥哎,servlet容器會(huì)通知TestListener并回調(diào)valueBound和valueUnbound方法。

這里需要注意的是疾渣,當(dāng)調(diào)用session的invalidate方法或者session失效時(shí)篡诽,也會(huì)回調(diào)valueUnbound方法。

3 servlet request相關(guān)監(jiān)聽(tīng)接口

類層級(jí)

3.1 ServletRequestEvent

public class ServletRequestEvent extends java.util.EventObject { 
    private ServletRequest request;

    public ServletRequestEvent(ServletContext sc, ServletRequest request) {
        super(sc);
        this.request = request;
    }

    public ServletRequest getServletRequest () { 
        return this.request;
    }

    public ServletContext getServletContext () { 
        return (ServletContext) super.getSource();
    }
}

servlet請(qǐng)求的相關(guān)事件榴捡,當(dāng)request發(fā)生變化時(shí)會(huì)觸發(fā)該事件杈女。事件源是ServletContext實(shí)例,并提供額外的獲取ServletContext和ServletRequest方法吊圾。

3.2 ServletRequestListener

public interface ServletRequestListener extends EventListener {

    public void requestDestroyed ( ServletRequestEvent sre );

    public void requestInitialized ( ServletRequestEvent sre );
}

當(dāng)請(qǐng)求初始化或者銷毀時(shí)达椰,即客戶端請(qǐng)求進(jìn)入web應(yīng)用(進(jìn)入servlet或者第一個(gè)filter)或web應(yīng)用返回響應(yīng)給客戶端(退出servlet或者第一個(gè)filter)。servlet容器構(gòu)造ServletRequestEvent實(shí)例项乒,回調(diào)requestInitialized和requestDestroyed方法啰劲。

3.3 ServletRequestAttributeEvent

public class ServletRequestAttributeEvent extends ServletRequestEvent { 
    private String name;
    private Object value;

    public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value) {
        super(sc, request);
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return this.name;
    }

    public Object getValue() {
        return this.value;   
    }
}

servlet請(qǐng)求屬性的相關(guān)事件,當(dāng)請(qǐng)求屬性發(fā)生變化時(shí)會(huì)觸發(fā)該事件檀何。事件源是ServletContext實(shí)例蝇裤,并提供額外的獲取屬性名和屬性值的方法。

3.4 ServletRequestAttributeListener

public interface ServletRequestAttributeListener extends EventListener {

    public void attributeAdded(ServletRequestAttributeEvent srae);

    public void attributeRemoved(ServletRequestAttributeEvent srae);

    public void attributeReplaced(ServletRequestAttributeEvent srae);
}

當(dāng)請(qǐng)求的屬性發(fā)生增频鉴、刪猖辫、改的時(shí)候,servlet容器構(gòu)造ServletRequestAttributeEvent事件對(duì)象砚殿,分別回調(diào)attributeAdded啃憎、attributeRemoved、attributeReplaced方法似炎。

這里需要注意的是attributeReplaced方法辛萍,當(dāng)屬性的值被替換的時(shí)候回調(diào)。這個(gè)時(shí)候如果調(diào)用ServletRequestAttributeEvent.getValue()方法返回的是替換之前的屬性值羡藐。

四贩毕、總結(jié)

至此,listener講完了仆嗦。我們可以發(fā)現(xiàn)listener和servlet辉阶、filter有個(gè)共同點(diǎn),都是由容器進(jìn)行調(diào)度。我們只需要編寫自己的listener去實(shí)現(xiàn)我們關(guān)心的監(jiān)聽(tīng)器接口并注冊(cè)谆甜,剩下來(lái)的工作就是在我們自己的listener里面編寫業(yè)務(wù)邏輯垃僚。

這邊博文介紹的listener是servlet3.0規(guī)范制定的。3.1已經(jīng)增加了一些事件監(jiān)聽(tīng)器接口规辱,道理都是類似的谆棺,讀者可以自行去了解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罕袋,一起剝皮案震驚了整個(gè)濱河市改淑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浴讯,老刑警劉巖朵夏,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異榆纽,居然都是意外死亡仰猖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門掠河,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亮元,“玉大人猛计,你說(shuō)我怎么就攤上這事唠摹。” “怎么了奉瘤?”我有些...
    開(kāi)封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵勾拉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盗温,道長(zhǎng)藕赞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任卖局,我火速辦了婚禮斧蜕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砚偶。我一直安慰自己批销,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布染坯。 她就那樣靜靜地躺著均芽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪单鹿。 梳的紋絲不亂的頭發(fā)上掀宋,一...
    開(kāi)封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼劲妙。 笑死湃鹊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的是趴。 我是一名探鬼主播涛舍,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唆途!你這毒婦竟也來(lái)了富雅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肛搬,失蹤者是張志新(化名)和其女友劉穎没佑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體温赔,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛤奢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陶贼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啤贩。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拜秧,靈堂內(nèi)的尸體忽然破棺而出痹屹,到底是詐尸還是另有隱情,我是刑警寧澤枉氮,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布志衍,位于F島的核電站,受9級(jí)特大地震影響聊替,放射性物質(zhì)發(fā)生泄漏楼肪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一惹悄、第九天 我趴在偏房一處隱蔽的房頂上張望春叫。 院中可真熱鬧,春花似錦泣港、人聲如沸暂殖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)央星。三九已至,卻和暖如春惫东,著一層夾襖步出監(jiān)牢的瞬間莉给,已是汗流浹背毙石。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颓遏,地道東北人徐矩。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叁幢,于是被迫代替她去往敵國(guó)和親滤灯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 本文包括:1曼玩、Listener簡(jiǎn)介2鳞骤、Servlet監(jiān)聽(tīng)器3、監(jiān)聽(tīng)三個(gè)域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽(tīng)器4黍判、監(jiān)聽(tīng)三個(gè)域?qū)?..
    廖少少閱讀 6,079評(píng)論 6 28
  • Based on Java? Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8閱讀 1,319評(píng)論 0 7
  • 從三月份找實(shí)習(xí)到現(xiàn)在豫尽,面了一些公司,掛了不少顷帖,但最終還是拿到小米美旧、百度、阿里贬墩、京東榴嗅、新浪、CVTE陶舞、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,253評(píng)論 11 349
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 這個(gè)周末吊说,去大明湖畔參加了一個(gè)傳說(shuō)中很好玩的人生游戲论咏。 原本沒(méi)有打算去的优炬,可是和朋友聊天的時(shí)候颁井,她的一句“我中間選...
    整理師小王子閱讀 230評(píng)論 0 0