天天看點

Servlet中的監聽器及監聽線上人數執行個體

servlet api提供了基本的應用程式事件監聽器接口。程式設計者可以通過實作這些接口來使用管理事件的功能。servlet2.4以後提供了對以下對象的事件監聽:servletcontext,httpsession,servletrequest。監聽servletcontext可以使web程式得知整個應用程式載入和解除安裝等運作情況。監聽httpsession可以web程式了解應用程式會期間的狀況并作出響應。監聽servletrequest可以使

web程式控制web請求的生命周期。下面結合javaservetapi官方文檔對各個事件監聽器接中進行說明。 

一、 servletcontextlistener 

所在包:javax.servlet 

接口聲明:public interface servletcontextlistener extends java.util.eventlistener 

方法: 

1.void contextdestroyed(servletcontextevent sce) 

當應用被解除安裝後觸發執行該方法中的代碼。 

2.void contextinitialized(servletcontextevent sce) 

當應用在初始化時觸發執行該方法中的代碼。 

這裡需要對servletcontentevent說明一下,它是一個servletcontext對象的事件,其類的聲明如下: 

public class servletcontentevent extends java.util.eventobject 

包含方法:servletcontext getservletcontext(),傳回事件的servlet上下文,即産生事件的目前應用程式。 

二、 servletcontextattributelistener 

接口聲明:public interface servletcontextattributelistener 

extends java.util.eventlistener 

1. void attributeadded(servletcontextattributeevent scab) 

當一個新的屬性加入到servlet的上下文中後觸發該方法中的代碼。 

2.void attributeremoved(servletcontextattributeevent scab) 

當一個屬性被從servlet的上下文中移走後觸發該方法中的代碼。 

3.void attributereplaced(servletcontextattributeevent scab) 

當servlet上下文中的一個屬性的值被替換後觸發該方法中的代碼。 

servletcontextattributeevent是servlet上下文裡的屬性的事件,其類聲明如下: 

public class servletcontextattributeevent 

extends servletcontextevent 

包含方法:string getname(),傳回産生事件的屬性名稱;object getvalue(),傳回産生事件的屬性的值。 

三、httpsessionlistener 

接口聲明:public interface httpsessionlistener 

1.void sessioncreated(httpsessionevent se) 

當一個會話被建立後觸發執行該方法中的代碼。 

2.void sessiondestroyed(httpsessionevent se) 

當一個會話被釋放後觸發執行該方法中的代碼。 

httpsessionevent 是會話事件類,其聲明如下: 

public class httpsessionevent 

extends java.util.eventobject 

包含方法:httpsession getsession(),傳回産生事件的session對象。 

四、 httpsessionactivationlistener 

接口聲明:public interface httpsessionactivationlistener 

1.void sessiondidactivate(httpsessionevent se) 

2.void sessionwillpassivate(httpsessionevent se) 

activate與passivate是用于置換對象的動作,當session對象為了資源利用或負載平衡等原因而必須暫時儲存至硬碟或其它儲存器時(透過對象序列化),所作的動作稱之為passivate,而硬碟或儲存器上的session對象重新加載jvm時所采的動作稱之為activate。 

五、httpsessionattributelistener 

所在包:javax.servlet 

接口聲明:public interface httpsessionattributelistener 

1.void attributeadded(httpsessionbindingevent se) 

2.void attributereplaced(httpsessionbindingevent se) 

3.void attributeremoved(httpsessionbindingevent se) 

以上三個方法分别在會話屬性被加入、會話屬性值被修改和會話屬性被移除時觸發執行。 

httpsessionbindingevent 是一個會話事件對象類,其聲明如下: 

public interface httpsessionbindinglistener 

包含方法:string getname(),傳回産生目前事件的會話的屬性名。object getvalue(),傳回産生目前事件的會話的屬性值。httpsession getsession(),傳回産生目前事件的會話對象。 

六、 httpsessionbindinglistener 

接口聲明:public interface httpsessionbindinglistener 

1.void valuebound(httpsessionbindingevent event) 

當實作 httpsessionbindinglistener接口的對象被綁定到session attribute中,該對象的此方法被執行。 

2.void valueunbound(httpsessionbindingevent event) 

當實作 httpsessionbindinglistener接口的對象被從session attribute解除綁定,該對象的此方法被執行。 

請注意 httpsessionattributelistener與httpsessionbindinglistener的差別: 

1.前者是需要在web.xml中進行描述的,後者不需要。 

2.前者是在任何session的屬生變化時都會觸發執行其方法中的代碼,而後者隻是在實作它的對象被綁定到會話屬性或被從會話屬生中解除綁定時,才會觸發執行那個對象的valuebound和valueunboundy這兩個方法的代碼。比如說有兩個對象a和b都實作了httpsessionbindinglistener接口,當a被綁定到會話屬性中時,隻是a的valuebound() 方法被觸發執行。 

七、 servletrequestlistener 

接口聲明:public interface servletrequestlistener 

1.void requestdestroyed(servletrequestevent evt) 

2.void requestinitialized(servletrequestevent evt) 

以上兩個方法分别在servetrequest對象初始化和清除時觸發執行。 

servletrequestevent 表示servletreuest事件類,其聲明如下: 

public class servletrequestevent 

包含方法:servletcontext getservletcontext(),獲得目前web應用程式的上下文對象。servletrequest getservletrequest(),獲得目前事件的主體,servletrequest對象。 

八、 servletrequestattributelistener 

接口聲明:public interface servletrequestattributelistener 

1.void attributeadded(servletrequestattributeevent e) 

當向servlvetrequest對象屬性中添加屬性後觸發執行該方法。 

2.void attributeremoved(servletrequestattributeevent e) 

當向servlvetrequest對象屬性中移除屬性後觸發執行該方法。 

3.void attributereplaced(servletrequestattributeevent e) 

當修改servlvetrequest對象屬性的屬生值後觸發執行該方法。 

servletrequestattributeevent 是servletrequest屬性事件類,其聲明如下: 

public class servletrequestattributeevent 

extends servletrequestevent 

包含方法:string getname(),獲得觸發事件的屬性的名稱。object getvalue(),獲得觸發事件的屬生的值。 

下面說明如何在web.xml中布署事件監聽器以實作對事件的處理,格式如下: 

<listener> 

  <listener-class> 

    packname.classname

  </listener-class >  

</listener> 

其中fey.servlet.listener.customservletcontextlistener是實作上述各事件監聽器接口的類名。當然需要将這些類放入web容器的web應用的classes或lib目錄下以讓web容器可以找到。外說明一點,一個類可以一個或多個監聽器接口。 

九、執行個體:session的2個監聽器接口監聽目前線上人數清單 

1、javax.servlet.http.httpsessionbindinglistener;

實作這個接口的類,每當被存放到session或從session中移除都會出發接口中相應的方法,進而實作監聽的效果。

2、javax.servlet.http.httpsessionlistener;

實作這個接口的類,本身就是1個監聽器,每當有session生成或消亡時,都觸發接口中相應的方法,進而實作監聽器的效果;

httpsessionlistener的實作類本身就是一個監聽器,要使用它需要在web.xml中啟動這個監聽器,例如

<listener>  

 <listener-class>packname.classname</listener-class>  

</listener>  

3、這2個監聽器是有差別的

前者的觸發取決于session中加入的屬性。

後者的觸發取決于session本身的産生和消亡。

4、與和上述之類似的還有對servletcontext的監聽和對request監聽。

線上人數清單是對所有人起作用,資料應放到application中即servletcontext對象。

onlinedemo.java   

import java.util.arraylist;   

import java.util.list;   

import javax.servlet.servletcontext;   

import javax.servlet.servletcontextevent;   

import javax.servlet.servletcontextlistener;   

import javax.servlet.http.httpsessionattributelistener;   

import javax.servlet.http.httpsessionbindingevent;   

import javax.servlet.http.httpsessionevent;   

import javax.servlet.http.httpsessionlistener;    

public class onlinedemo implements servletcontextlistener, httpsessionlistener, httpsessionattributelistener {   

    // 聲明一個servletcontext對象   

    private servletcontext application = null;   

    public void contextinitialized(servletcontextevent sce) {   

        // 容器初始化時,向application中存放一個空的容器   

        this.application = sce.getservletcontext();   

        this.application.setattribute("alluser", new arraylist());   

    }   

    public void contextdestroyed(servletcontextevent sce) {   

    public void sessioncreated(httpsessionevent se) {   

    public void sessiondestroyed(httpsessionevent se) {   

        // 将使用者名稱從清單中删除   

        list l = (list) this.application.getattribute("alluser");   

        string value = (string) se.getsession().getattribute("uname");   

        l.remove(value);   

        this.application.setattribute("alluser", l);   

    public void attributeadded(httpsessionbindingevent se) {   

        // 如果登陸成功,則将使用者名儲存在清單之中   

        l.add(se.getvalue());   

    public void attributeremoved(httpsessionbindingevent se) {   

    public void attributereplaced(httpsessionbindingevent se) {   

}  

online.jsp

<%@ page contenttype="text/html;charset=gb2312"%>  

<%@ page import="java.util.*"%>  

<form action="online.jsp" method="post">     

 <input type="text" name="name">  

 <input type="submit" value="登陸">  

 <a href="logout.jsp">登出</a>  

</form>  

<%   

    if(request.getparameter("name")!=null)   

        session.setattribute("uname",request.getparameter("name")) ;   

%>  

<h2>線上人員</h2>  

<hr>  

    list l = (list)application.getattribute("alluser");   

    for(object o : l)   

        out.println(o);   

%> 

logout.jsp

    session.invalidate() ;   

%>