天天看點

監聽器Listener總結筆記web開發事件程式設計 ServletContextListenerHttpSessionAttributeLisener

web開發事件程式設計

web開發事件程式設計三要素:

          事件源: ServletContext 、ServletRequest、HttpSession

           事件:

              (監聽以上三個對象的 建立,銷毀和 操作屬性的行為,來觸發方法)

             對象建立或銷毀:ServletContextEvent、ServletRequestEvent、 HttpSessionEvent

               操作屬性: ServletContextAttributeEvent、ServletRequestAttributeEvent、                                               HttpSessionBindingEvent

                事件監聽器:  ServletContextListener 、 ServletRequestListener......

web開發監聽器: 開發者在web開發的過程中,會頻繁使用到三個對象。ServletContext、ServletRequest、HttpSession。在建立或銷毀這些對象時,或者對這些對象進行屬性操作時,觸發一些事件,就可以使用web監聽器去監聽這些事件。

事件源 web事件對象 web事件監聽器
ServletContext對象

ServletContextEvent

建立或銷毀對象時觸發

ServletContextListener
ServletContext屬性

ServletContextAttributeEvent

屬性操作(增加屬性,修改屬性,删除屬性)

ServletContextAttributeListener
ServletRequest對象

ServletRequestEvent

建立或銷毀對象時觸發

ServletRequestListener
ServletRequest屬性

ServletRequestAttributeEvent

屬性操作(增加屬性,修改屬性,删除屬性)

ServletRequestAttributeListener
HttpSession對象

HttpSessionEvent

建立或銷毀對象時觸發

HttpSessionListener
HttpSession屬性

HttpSessionBindingEvent

屬性操作(增加屬性,修改屬性,删除屬性)

HttpSessionAttributeLisener

 ServletContextListener

         ServletContextListener主要用于監聽ServetContext對象的建立和銷毀。

                                               ServletContext對象:代表整個web應用。

                                               建立:web應用加載

                                               銷毀:web應用重新加載或web服務停止。

                            步驟:

                                     1)建立java類,實作ServletContextListener接口,實作其中的方法

                                     2)監聽器要交給tomcat伺服器運作。

                                      需要在web.xml檔案中進行配置

             <!-- 注冊監聽器 -->

    <listener>

       <!-- 監聽器程式全名 -->

       <listener-class>com.joinlabs.a_context.MyContextListener</listener-class>

    </listener>

 ServletContextAttributeListener

ServletContextAttributeListener用于監聽ServletContext對象的屬性操作(增加屬性,修改屬性,删除屬性)

                                               增加屬性: setAttribute(name,Object);  第一次就是增加屬性

                                                修改屬性: setAttribute(name,Object);  如果前面有增加了同名的屬性,則修改。

                                                删除屬性: removeAttribute(name); 

public class MyContextListener implements ServletContextListener,ServletContextAttributeListener{

         StudentDao stuDao = new StudentDao();

         public void contextInitialized(ServletContextEvent sce) {

                   System.out.println("ServletContext對象建立了");

                   //建立學生表

                   stuDao.initTable();

System.out.println("表建立成功!");

         }

         public void contextDestroyed(ServletContextEvent sce) {

                   System.out.println("ServletContext對象銷毀了");

                   //删除學生表

                   stuDao.dropTable();

                   System.out.println("表删除成功!");

         }   

         public void attributeAdded(ServletContextAttributeEvent scab) {

                   //1.得到屬性名稱

                   String name = scab.getName();

                   //2.得到屬性值

                   Object value = scab.getValue();

                   System.out.println("屬性添加:"+name+"="+value);

         }

         public void attributeReplaced(ServletContextAttributeEvent scab) {

                   //1.得到屬性名稱

                   String name = scab.getName();

                   //2.得到修改前的屬性值

                   //Object value = scab.getValue();

                   //2.得到修改後的屬性值

                   ServletContext context = scab.getServletContext();

                   Object value = context.getAttribute(name);

                   System.out.println("屬性修改:"+name+"="+value);

         }

         public void attributeRemoved(ServletContextAttributeEvent scab) {

                   //1.得到屬性名稱

                   String name = scab.getName();

                   //2.得到屬性值

                   Object value = scab.getValue();

                   System.out.println("屬性删除:"+name+"="+value);

         }

      }

ServletRequestListener

         ServletRequestListener用于監聽ServletRequest對象的建立和銷毀。

                            ServletRequest對象:封裝請求資訊

                                     建立:每次送出請求時

                                     銷毀:請求完畢後

 ServletRequestAttributeListener

         ServletRequestAttributeListener用于監聽ServletRequest屬性操作

                                 增加屬性: setAttribute(name,Object);  第一次就是增加屬性

                                修改屬性: setAttribute(name,Object);  如果前面有增加了同名的屬性,則修改。

                                删除屬性: removeAttribute(name); 

public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{

         public void requestInitialized(ServletRequestEvent sre) {

                   System.out.println("request對象建立了"+sre.getServletRequest());

                           //得到客戶的IP位址

                   HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();

                   String ip = request.getRemoteHost();

                   //把ip位址放入到session域中

                   HttpSession session = request.getSession();

                   session.setAttribute("ip", ip);

         }

          *

          *

         public void requestDestroyed(ServletRequestEvent sre) {

                   System.out.println("request對象銷毀了"+sre.getServletRequest());

         }

         public void attributeAdded(ServletRequestAttributeEvent srae) {

                   String name = srae.getName();

                   Object value = srae.getValue();

                   System.out.println("屬性增加: "+name+"="+value);

         }

         public void attributeReplaced(ServletRequestAttributeEvent srae) {

                   String name = srae.getName();

                   //修改後的值

                   ServletRequest request = srae.getServletRequest();

                   Object value = request.getAttribute(name);

                   System.out.println("屬性修改: "+name+"="+value);

         }

         public void attributeRemoved(ServletRequestAttributeEvent srae) {

                   String name = srae.getName();

                   Object value = srae.getValue();

                   System.out.println("屬性删除: "+name+"="+value);

         }

}

HttpSessionListener

HttpSessionListener用于監聽HttpSession對象的建立和銷毀

                         HttpSession對象:

                                                        建立:調用request.getSession()方法

                                                        銷毀:

                                                                   1)預設情況下,30分鐘伺服器自動回收

                                                                   2)設定有效時長: setMaxActiveInterval(秒);

                                                                   3)web.xml配置全局的過期時間

                                                                                    <session-config>

                                                                                             <session-timeout>分鐘</session-timeout>

                                                                                    </session-config>   

                                                                   4)手動銷毀: invalidate()方法     

案例: 粗略統計線上訪客人數

public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{

         int count = 0;

         public void sessionCreated(HttpSessionEvent se) {

                   System.out.println("session對象建立了"+se.getSession());

                   synchronized (MySessionListener.class) {

                            count++;

                            System.out.println("目前訪客人數:"+count);

                            //儲存到context域中

                            ServletContext context = se.getSession().getServletContext();

                            context.setAttribute("visit", count);

                   }        

         }

         public void sessionDestroyed(HttpSessionEvent se) {

                   System.out.println("session對象銷毀了"+se.getSession());

                   synchronized (MySessionListener.class) {

                            count--;

                            //儲存到context域中

                            ServletContext context = se.getSession().getServletContext();

                            context.setAttribute("visit", count);

                   }

         }

         public void attributeAdded(HttpSessionBindingEvent se) {

                   String name = se.getName();

                   Object value = se.getValue();

                   System.out.println("屬性增加: "+name+"="+value);

         }

         public void attributeReplaced(HttpSessionBindingEvent se) {

                   String name = se.getName();

                   //得到修改後的值

                   HttpSession session = se.getSession();

                   Object value = session.getAttribute(name);

                   System.out.println("屬性修改: "+name+"="+value);

         }

         public void attributeRemoved(HttpSessionBindingEvent se) {

                   String name = se.getName();

                   Object value = se.getValue();

                   System.out.println("屬性删除: "+name+"="+value);

         }

}

HttpSessionAttributeLisener

HttpSessionAttributeLisener用于監聽HttpSession的屬性操作

                            增加屬性: setAttribute(name,Object);  第一次就是增加屬性

                            修改屬性: setAttribute(name,Object);  如果前面有增加了同名的屬性,則修改。

                            删除屬性: removeAttribute(name); 

                   案例:顯示目前網站的登入使用者資訊

                   需求:

                                     1)提供使用者登入的功能,提供登出功能。      

                                     2)顯示目前網站的所有登入使用者資訊

                                     3)管理者可以踢除指定的登入用