1. 什么是监听器以及监听器的作用?
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听的对象发生上述事件后,监听器的某个方法将被立即执行。
我们来看一下监听器的一些关系如下:
2. web监听器
监听器有好几种类型,但是我们在web的Servlet开发中,他们用于监听的事件源分别为:ServletContext、HttpSession和ServletRequest这三个域对象。
针对这三个域对象的监听器,我们按照功能类型不同,大概可以分为以下三种事件监听器:
<1>监听这三个域对象的创建与销毁
<2>监听域对象中属性的增加和删除
<3>监听绑到HttpSession域中的某个对象的状态
3. 创建监听器的步骤
第一步:
创建一个类,去实现指定的监听器接口。重写接口中的方法。
第二步:
在web.xml中使用<listener>
标签配置监听器,web容器会自动把监听器注册到事件源中。
例如以下配置:
//在web-app的标签下进行配置
<listener>
<listener-class>
XXX<!--这里的XXX是指监听器的全类名-->
</listener-class>
</listener>
注意:一个web.xml文件中可以配置多个Servlet事件监听器,web服务器按照它们在web.xml中的注册顺序来加载和注册这些Servlet事件监听器。
4. 监听三个域对象的创建与销毁
<1>ServletContext域
监听ServletContext对象的创建和销毁事件的接口是:ServletContextListener。ServletContext对象会在服务器开启的时候为当前应用创建一个ServletContext对象。在服务器关闭的时候会销毁该对象。
- 当ServletContext对象被创建的时候,会调用监听器的
contextInitialize(ServletContextEvent sce)
方法。 当ServletContext对象被销毁的时候,会调用监听器的
contextDestroyed(ServletContextEvent sce)
方法。<2>HttpSession域
监听HttpSeesion对象 的创建和销毁的接口是:HttpSessionListener。
- 创建一个Session对象的时候,会调用监听器的sessionCreated(HttpSessionEvent se)方法。
- 销毁一个Session对象的时候,会调用监听器的sessionDestroyed(HttpSessionEvent se)方法。
//session的创建
1.通过request.getSession()请求来获取session,如果请求头中没有jsessionid,那么
就创建一个session对象。
2.如果请求头中有jsessionid的值,如果在服务器端,有一个session的id值与其不一样,不
创建,直接使用。 如果在服务器端没有这个session的id值,那么就会创建session对象。
//session的销毁
<1>默认超时。
<2>设置session超时时间。`setMaxInactiveInterval(int interval)`
<3>invalidate()手动销毁。
<4>关闭服务器。
<3>Request域
监听ServletRequest对象的创建与销毁的接口是:ServletRequestListener。
- 当request对象被创建的时候,会调用监听器的requestInitialize方法。
- 当request对象被销毁的时候,会调用监听器的requestDestroyed方法。
用户每一次访问都会创建一个servletRequest对象,当服务器对其返回响应的时候,servletRequest对象就会被销毁。
5. 监听三个域对象属性变化
域名称 | 实现的接口 | 事件类型 |
---|---|---|
ServletContext | ServletContextAttributeListener | ServletContextAttributeEvent |
HttpSession | HttpSessionAttributeListener | HttpSessionBindingEvent |
HttpServletRequest | ServletRequestAttributeListener | ServletRequestAttributeEvent |
当向被监听对象中增加一个属性的时,web容器 就通过调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象。
//三个域对象的增加、修改、移除的方法是一样的,仅是类型参数不同(事件类型)
新增:public void attributeAdded(事件类型参数)
移除:public void attributeRemoved(事件类型参数)
修改:public void attributeReplaced(事件类型参数)