监听器Listener总结笔记

本文详细介绍了web开发中的事件编程,重点讲解了ServletContextListener、ServletRequestListener和HttpSessionListener的作用和使用场景。通过监听这三个对象的创建、销毁及属性操作,实现如在线访客人数统计等实用功能。同时,还涵盖了事件监听器的配置和不同事件的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web开发事件编程

web开发事件编程三要素:

          事件源: ServletContext 、ServletRequest、HttpSession

           事件:

              (监听以上三个对象的 创建,销毁和 操作属性的行为,来触发方法)

             对象创建或销毁:ServletContextEvent、ServletRequestEvent、 HttpSessionEvent

               操作属性: ServletContextAttributeEvent、ServletRequestAttributeEvent、                                               HttpSessionBindingEvent

                事件监听器:  ServletContextListener 、 ServletRequestListener......

web开发监听器: 开发者在web开发的过程中,会频繁使用到三个对象。ServletContextServletRequestHttpSession。在创建销毁这些对象时,或者对这些对象进行属性操作时,触发一些事件,就可以使用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); 

/**

 * ServletContext对象

* 应用: 项目需要初始化工作和清理工作

 * 需求: 在项目启动时,创建学生表;项目停止时,把学生表删除。

 *

 */

public class MyContextListener implements ServletContextListener,ServletContextAttributeListener{

         StudentDao stuDao = new StudentDao();

         /**

          * 用于监听ServletContext对象的创建。ServletContext对象创建时调用次方法

          */

         public void contextInitialized(ServletContextEvent sce) {

                   System.out.println("ServletContext对象创建了");

                  

                   //创建学生表

                   stuDao.initTable();

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

         }

            /**

          * 用于监听ServletContext对象的销毁。ServletContext对象销毁时调用次方法

          */

         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); 

/**

 * ServletRequest对象

* 应用: 得到请求相关信息

 */

public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{

                 /**

          * 用于监听ServletRequest对象的创建。ServletRequest对象创建时调用次方法

          */

         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);

         }

          *

          * /**

          * 用于监听ServletRequest对象的销毁。ServletRequest对象销毁时调用次方法

          */

         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()方法     

案例: 粗略统计在线访客人数

/**

 * HttpSession对象

 */

public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{

         int count = 0;

         /**

          * 监听HttpSession对象的创建。

          */

         public void sessionCreated(HttpSessionEvent se) {

                   System.out.println("session对象创建了"+se.getSession());

                            /**

                    * 使用代码锁避免线程并发问题

                    */

                   synchronized (MySessionListener.class) {

                            /**

                             * 访客人数+1

                             */

                            count++;

                            System.out.println("当前访客人数:"+count);

                            //保存到context域中

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

                            context.setAttribute("visit", count);

                   }        

         }

         /**

          * 监听HttpSession对象的销毁

          */

         public void sessionDestroyed(HttpSessionEvent se) {

                   System.out.println("session对象销毁了"+se.getSession());

                  

                   synchronized (MySessionListener.class) {

                            /**

                             * 访客人数-1

                             */

                            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)管理员可以踢除指定的登录用

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值