<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    vickzhu

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks

    概述:
    Servlet監聽器用于監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生后可以做一些必要的處理。
    接口:
    目前Servlet2.4和JSP2.0總共有8個監聽器接口和6個Event類,其中HttpSessionAttributeListener與
    HttpSessionBindingListener 皆使用HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener則都使用HttpSessionEvent;其余Listener對應的Event如下所 示:

    Listener接口

    Event

    ServletContextListener

    ServletContextEvent

    ServletContextAttributeListener

    ServletContextAttributeEvent

    HttpSessionListener

    HttpSessionEvent

    HttpSessionActivationListener

    HttpSessionAttributeListener

    HttpSessionBindingEvent

    HttpSessionBindingListener

    ServletRequestListener

    ServletRequestEvent

    ServletRequestAttributeListener

    ServletRequestAttributeEvent

    分別介紹:
    一 ServletContext相關監聽接口
    補充知識:
    通過ServletContext 的實例可以存取應用程序的全局對象以及初始化階段的變量。
    在JSP文件中,application 是 ServletContext 的實例,由JSP容器默認創建。Servlet 中調用 getServletContext()方法得到 ServletContext 的實例。
    注意:
    全局對象即Application范圍對象,初始化階段的變量指在web.xml中,經由<context-param>元素所設定的變量,它的范圍也是Application范圍,例如:

    <context-param>
    <param-name>Name</param-name>
    <param-value>browser</param-value>
    </context-param>
    當容器啟動時,會建立一個Application范圍的對象,若要在JSP網頁中取得此變量時:
    String name = (String)application.getInitParameter("Name");
    或者使用EL時:
    ${initPara.name}
    若是在Servlet中,取得Name的值方法:
    String name = (String)ServletContext.getInitParameter("Name");


    1.ServletContextListener:
    用于監聽WEB 應用啟動和銷毀的事件,監聽器類需要實現javax.servlet.ServletContextListener 接口。
    ServletContextListener 是 ServletContext 的監聽者,如果 ServletContext 發生變化,如服務器啟動時 ServletContext 被創建,服務器關閉時 ServletContext 將要被銷毀。

    ServletContextListener接口的方法:
    void contextInitialized(ServletContextEvent sce)
    通知正在接受的對象,應用程序已經被加載及初始化。
    void contextDestroyed(ServletContextEvent sce)
    通知正在接受的對象,應用程序已經被載出。

    ServletContextEvent中的方法:
    ServletContext getServletContext()
    取得ServletContext對象


    2.ServletContextAttributeListener:用于監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener接口。

    ServletContextAttributeListener接口方法:
    void attributeAdded(ServletContextAttributeEvent scab)
    若有對象加入Application的范圍,通知正在收聽的對象
    void attributeRemoved(ServletContextAttributeEvent scab)
    若有對象從Application的范圍移除,通知正在收聽的對象
    void attributeReplaced(ServletContextAttributeEvent scab)
    若在Application的范圍中,有對象取代另一個對象時,通知正在收聽的對象


    ServletContextAttributeEvent中的方法:
    java.lang.String getName()
    回傳屬性的名稱
    java.lang.Object getValue()
    回傳屬性的值

    二、HttpSession相關監聽接口
    1.HttpSessionBindingListener接口
    注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設定的Listener

    當我們的類實現了HttpSessionBindingListener接口后,只要對象加入Session范圍 (即調用HttpSession對象的setAttribute方法的時候)或從Session范圍中移出(即調用HttpSession對象的 removeAttribute方法的時候或Session Time out的時候)時,容器分別會自動調用下列兩個方法:
    void valueBound(HttpSessionBindingEvent event)
    void valueUnbound(HttpSessionBindingEvent event)

    思考:如何實現記錄網站的客戶登錄日志, 統計在線人數?

    2.HttpSessionAttributeListener接口
    HttpSessionAttributeListener監聽HttpSession中的屬性的操作。
    當 在Session增加一個屬性時,激發attributeAdded(HttpSessionBindingEvent se) 方法;當在Session刪除一個屬性時,激發attributeRemoved(HttpSessionBindingEvent se)方法;當在Session屬性被重新設置時,激發attributeReplaced(HttpSessionBindingEvent se) 方法。這和ServletContextAttributeListener比較類似。

    3.HttpSessionListener接口
    HttpSessionListener監聽 HttpSession的操作。當創建一個Session時,激發session Created(HttpSessionEvent se)方法;當銷毀一個Session時,激發sessionDestroyed (HttpSessionEvent se)方法。

    4.HttpSessionActivationListener接口
    主要用于同一個Session轉移至不同的JVM的情形。

    請注意HttpSessionAttributeListener與HttpSessionBindingListener的區別:
    1.前者是需要在web.xml中進行描述的,后者不需要。
    2.前者是在任何session的屬生變化時都會觸發執行其方法中的代碼,而后者只是在實現它的對象被綁定到會話屬性或被從會話屬生中解除綁定時,才會觸發執行那個對象的valueBound和valueUnboundy這兩個方法的代碼。比如說有兩個對象A和B都實現了HttpSessionBindingListener接口,當A被綁定到會話屬性中時,只是A的valueBound()方法被觸發執行。


    三、ServletRequest監聽接口
    1.ServletRequestListener接口
    和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest
    2.ServletRequestAttributeListener接口
    和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest

      下面說明如何在web.xml中布署事件監聽器以實現對事件的處理,格式如下:
    <listener>
      <listener-class> 
        fey.servlet.listener.CustomServletContextListener 
      </listener-class >  
    </listener>
      其中fey.servlet.listener.CustomServletContextListener是實現上述各事件監聽器接口的類名。當然,你需要將這些類放入Web容器的Web應用的classes或lib目錄下以讓Web容器可以找到。
      另外說明一點,一個類可以一個或多個監聽器接口。

    有的listener可用于統計網站在線人數及訪問量。 如下:

    服務器啟動時(實現ServletContextListener監聽器contextInitialized方法),讀取數據庫,并將其用一個計數變量保存在application范圍內

    session創建時(實現HttpSessionListener監聽器sessionCreated方法),讀取計數變量加1并重新保存

    服務器關閉時(實現ServletContextListener監聽器contextDestroyed方法),更新數據庫

    簡例一

    監聽用戶上線與退出,顯示在線用戶

    1、登陸頁面 Login.jsp

    <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
    <%
    session=request.getSession(false);
    if(session!=null)session.invalidate();
    %>
    <html>
    <head><title></title></head>
    <body>
    <form action="isOnline.jsp" method="post">
    用戶名:<input type="text" name="uName"/>
    <input type="submit" value="上線">
    </form>
    </body>
    </html>

    2、控制頁面(只是為了說明監聽器問題,所以簡單了點...) isOnline.jsp

    <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
    <html>
    <head><title></title></head>
    <body>
    <%
    session=request.getSession();
    session.setAttribute("userName",request.getParameter("uName"));
    response.sendRedirect("showOnline.jsp");
    %>
    </body>
    </html>


    3、顯示頁面 showOnline.jsp

    <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
    <html>
    <head><title></title></head>
    <body>
    <%
    ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
    out.print("在線人數 "+showList.size()+"<br>");
    for(int i=0;i<showList.size();i++){
    out.print(showList.get(i)+"在線"+"<br>");
    }
    %>
    <br>
    <a href="Login.jsp">退出</a>
    </body>
    </html>

    4、配置頁面 web.xml

    <?xml version="1.0" encoding="gb2312"?>
    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "
    http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    <listener>
        <listener-class>org.xiosu.listener.onlineListener</listener-class>
    </listener>
    </web-app>

    5、監聽器 onlineListener.java

    package org.xiosu.listener;

    import java.util.ArrayList;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    public class onlineListener implements HttpSessionListener,
    HttpSessionAttributeListener {
    // 參數
    ServletContext sc;
    ArrayList list = new ArrayList();
    // 新建一個session時觸發此操作
    public void sessionCreated(HttpSessionEvent se) {
    sc=se.getSession().getServletContext();
    System.out.println("新建一個session");
    }
    // 銷毀一個session時觸發此操作
    public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("銷毀一個session");
    if (!list.isEmpty()) {
       list.remove((String) se.getSession().getAttribute("userName"));
       sc.setAttribute("list", list);
    }
    }
    // 在session中添加對象時觸發此操作,在list中添加一個對象
    public void attributeAdded(HttpSessionBindingEvent sbe) {
    list.add((String) sbe.getValue());
    sc.setAttribute("list", list);
    }
    // 修改、刪除session中添加對象時觸發此操作
    public void attributeRemoved(HttpSessionBindingEvent arg0) {
    }
    public void attributeReplaced(HttpSessionBindingEvent arg0) {
    }
    }

    在Web開發中關于監聽器的應用
    首先,也要在web.xml配置文件中進行聲明:
            在web.xml文件中的聲明如下:(聲明片斷)    要放在filter過濾器聲明和filter-mapping聲明后面
       
       <listener>
            <listener-class>markchen.web.listener.MySessionListener</listener-class>
        </listener>
        <listener>
             <listener-class>markchen.web.listener.MyServletContextListener</listener-class>
        </listener>


    //這兩個java類的內容都和簡單,僅僅是為了演示說明而已

    //MySessionListener.java文件的內容如下
         //Web應用程序中會話的生命周期監聽器實現   
    package markchen.web.listener;

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

    public class MySessionListener implements HttpSessionListener {
       
        //在會話一創建時該方法被調用,可以在此處編寫自己需要做特殊處理的程序代碼
         public void sessionCreated(HttpSessionEvent event) {
                   
                      HttpSession session = event.getSession();       
                      String sessionId=session.getId();
                      System.out.println("Session::::::"+sessionId+"******Created******");
            }
           
         //在會話即將銷毀時該方法被調用,可以在此處編寫自己需要做特殊處理的程序代碼
         public void sessionDestroyed(HttpSessionEvent event) {
                   
                     HttpSession session = event.getSession();       
                     String sessionId=session.getId();
                     System.out.println("Session::::::"+sessionId+"******Destroyed******");
           
                    }       
    }
        
          注意:在sessionDestroyed()方法中一定不要再調用session.invalidate()方法了
                因為每調用一次session.invalidate()方法都會觸發sessionDestroyed()方法的調用
                 進而形成死循環,最終使Web應用程序意外終止

          //MyServletContextListener.java
                //Web應用程序的生命周期監聽器實現
    package markchen.web.listener;

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

    public class MyServletContextListener implements ServletContextListener {
           
             //在Web應用程序初始化后該方法被調用
             public void contextInitialized(ServletContextEvent event) {
                  
                  System.out.println("******Application started******");               
             }
           
             //在Web應用程序銷毀時該方法被調用
           public void contextDestroyed(ServletContextEvent event) {

                     System.out.println("******Application ended******");               
            }
    }

    posted on 2009-04-08 10:07 筱 筱 閱讀(1565) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲免费观看视频| 亚洲国产日韩在线成人蜜芽| 中文字字幕在线高清免费电影| 亚洲精选在线观看| 大陆一级毛片免费视频观看| 有色视频在线观看免费高清在线直播 | 亚洲伊人成无码综合网| 日韩免费在线视频| 亚洲日本成本人观看| 久久亚洲中文字幕精品一区| 国产成人福利免费视频| 日本特黄特色AAA大片免费| 亚洲视频在线播放| 亚洲?V无码乱码国产精品| 91香焦国产线观看看免费| 免费无码一区二区| 亚洲av乱码一区二区三区| 久久久久亚洲精品男人的天堂| 国产乱码免费卡1卡二卡3卡| a色毛片免费视频| 亚洲JLZZJLZZ少妇| 97se亚洲综合在线| 国产亚洲精久久久久久无码AV| 成年丰满熟妇午夜免费视频| 亚洲精品免费视频| 一区二区三区免费精品视频| 亚洲国产成a人v在线观看| 久久噜噜噜久久亚洲va久| 免费又黄又硬又爽大片| 好爽又高潮了毛片免费下载| 一级毛片在线观看免费| a级毛片免费观看网站| 自拍偷自拍亚洲精品播放| 亚洲一区二区三区在线网站 | 亚洲日产2021三区在线| 在线精品亚洲一区二区小说| 国产免费观看黄AV片| 国产1024精品视频专区免费| 91av免费观看| 日本免费中文字幕| 美女被免费网站91色|