Listener 监听器

来源:互联网 发布:搜狗输入法centos版 编辑:程序博客网 时间:2024/06/09 18:58

一、Listener监听器

Javaweb开发中的监听器,是用于监听web常见对象

监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。 

Listener是Servlet提供的扩展点,一般用于对特定对象的生命周期和特定事件进行响应处理。
如HttpSessionListener,可以用于追踪Session创建和销毁这两个生命周期。
如HttpSessionAttributeListener,用于追踪Session上的Attribute,添加移除替换这三种事件。

有了这些扩展点,我们做一些功能的时候就比较方便,如检测在线人数就可以使用HttpSessionListener,当Session创建时在线人数+1,Session销毁时在线人数-1,如果没有提供这个扩展点,我们要实现也不是不行,就是要麻烦一些了。

 

HttpServletRequest              HttpSession                           ServletContext

监听它们的创建与销毁            属性变化                          session绑定javaBean

 

1监听机制

   事件                                就是一个事情;比如点开始按钮,点我的电脑,会弹出一个相应的反馈,这就是事件

   事件源                            产生这个事情的源头

   监听器                            用于监听指定的事件的对象

   注册监听         要想让监听器可以监听到事件产生,必须对其进行注册。


2.1监听域对象的创建与销毁

(1)监听ServletContext创建与销毁   ServletContextListener

1:javax.servlet.ServletContextListener;

     ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的应用是

    1)Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。

    2)在程序启动的时候初始化配置文件,比如启动日志组件,IO组件等等。
    3)请求转发


     ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。

     我们使用缓存的思路大概是:

  1. 服务器启动时,ServletContextListener 的 contextInitialized()方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。

  2. 程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP,使用application.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。

  3. 服务器将要关闭时,ServletContextListener 的 contextDestroyed()方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。

import javax.servlet.ServletContext;import javax.servlet.ServletContextListener;public class MyContextListener implements ServletContextListener {private ServletContext context = null;public void contextInitialized(ServletContextEvent event) {System.out.println("servlet context created");}public void contextDestroyed(ServletContextEvent event) {System.out.println("servlet context destroy");}}


  (2)监听HttpSession创建与销毁   HttpSessionListener

  (3)监听HttpServletRequest创建与销毁  ServletRequestListener

2.2监听域对象的属性变化

  (1)监听ServletContext属性变化   ServletContextAttributeListener

  (2)监听HttpSession属性变化   HttpSessionAttributeListener

  (3)监听HttpServletRequest属性变化   ServletRequestAttributeListener

 

2.3监听session绑定javaBean

  (1)它是用于监听javaBean对象是否绑定到了session域   HttpSessionBindingListener

     (2)它是用于监听javaBean对象的活化与钝化  HttpSessionActivationListener




3.关于创建一个监听器的步骤

 1. 创建一个类,实现指定的监听器接口

 2. 重写接口中的方法

 

import javax.servlet.ServletContext;import javax.servlet.ServletContextListener;public class MyContextListener implements ServletContextListener {private ServletContext context = null;public void contextInitialized(ServletContextEvent event) {System.out.println("servlet context created");}public void contextDestroyed(ServletContextEvent event) {System.out.println("servlet context destroy");}}

 3. web.xml文件中对监听器进行注册。

    在web.xml中加这行代码

<listener>          <listener-class>test.MyServletListener</listener-class></listener>



案例 时器-定时销毁session 

 比如我们通过网络购买火车票时,如果一定时间不付款订单就会被取消。又比如双十一,有秒杀活动,一过零点就开启秒杀,一到时间就触发事件开启秒杀。

1. 首先我们把session都存到一个集合,然后定时查看集合里的session有没有过时,怎样可以将每一个创建的session全都保存起来?

  我们可以做一个HttpSessionListener,当session对象创建时,就将这个session对象装入到一个集合中.将集合List<HttpSession>保存到ServletContext域中。

2. 怎样可以判断session过期了?

      HttpSession中有一个方法public long getLastAccessedTime() ,它可以得到session对象最后使用的时间。可以使用invalidate方法销毁。我们上面的操作需要使用任务调度功能.java中有一个Timer定时器类




0 0
原创粉丝点击