ervlet
1、概念
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件,并自动根据不同情况,在后台调用相应的处理程序。
通过监听器,可以自动激发一些操作,比如监听在线人数,当增加一个HttpSession时就激发 sessionCreated(HttpSessionEvent)方法,这样就可以给在线人数加1。
2、监听器类型
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。
-
监听三个域对象创建和销毁的事件监听器
-
监听域对象中属性的增加和删除的事件监听器
-
监听绑定到 HttpSession 域中的某个对象的状态的事件监听器
二、监听三个域对象创建和销毁的事件监听器
1.ServletContext域对象
编写一个ServletContextListener_test类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁
package com.yx.servlet.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
- Application Lifecycle Listener implementation class ServletContextListener_test
- @Description:ServletContextListener_test实现了ServletContextListener接口,
-
因此可以对ServletContext对象的创建和销毁两个动作进行监听
/
@WebListener
public class ServletContextListener_test implements ServletContextListener {
/*
* Default constructor.
*/
public ServletContextListener_test() {
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建");
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁");
}
}
ServletContextEvent的主要方法:ServletContext getServletContext():取得当前的ServletContext对象
在web.xml中注册监听器:要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听。
com.yx.servlet.listener.ServletContextListener_test2、HttpSession域对象
package com.yx.servlet.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
-
Application Lifecycle Listener implementation class HttpSeeionListener_test
-
HttpSession的销毁时机需要在web.xml中进行配置
*/
@WebListener
public class HttpSeeionListener_test implements HttpSessionListener {/**
- Default constructor.
*/
public HttpSeeionListener_test() {
// TODO Auto-generated constructor stub
}
/**
- @see HttpSessionListener#sessionCreated(HttpSessionEvent)
/
public void sessionCreated(HttpSessionEvent hse) {
System.out.println(hse.getSession()+“创建了”);
}
/* - @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent hse) {
System.out.println(“session销毁了”);
}
- Default constructor.
}
HttpSessionEvent的主要方法:HttpSession getSession()
在web.xml中注册监听器:
com.yx.servlet.listener.HttpSeeionListener_test 1- ServletRequest域对象
public void requestInitialized(ServletRequestEvent sre) {
System.out.println(sre.getServletRequest()+“创建”);
}
/**
* @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
*/
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println(sre.getServletRequest()+“销毁”);
}
ServletRequestEvent实例中的方法:
getServletRequest():获取ServletRequest对象;
getServletContext(): 获取ServletContext对象。
三、监听域对象中属性的变更的监听器
1.ServletContextAttributeListener
用于监听Web应用属性改变的事件,包括增加、删除、修改属性。监听器类需要实现ServletContextAttributeListener接口。
ServletContextAttributeListener接口的主要方法:
(1)void attributeAdded(ServletContextAttributeEvent se):若有对象加入Application的范围,通知正在收听的对象。
(2)void attributeRemoved(ServletContextAttributeEvent se):若有对象从Application范围移除,通知正在收听的对象。
(3)void attributeReplaced(ServletContextAttributeEvent se):若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象
ServletContextAttributeEvent中的主要方法:
getName():返回属性名称
getValue():返回属性的值
2.HttpSessionAttributeListener:监听HttpSession中属性的操作
该接口的主要方法:
(1)void attributeAdded(HttpSessionBindingEvent se):监听Http会话中的属性添加
(2)void attributeRemoved(HttpSessionBindingEvent se):监听Http会话中的属性移除
(3)void attributeReplaced(HttpSessionBindingEvent se):监听Http会话中的属性更改操作
- ServletRequestAttributeListener:用于监听Web应用属性改变的事件,包括增加属性、删除属性、修改属性
接口方法:
(1)void attributeAdded(ServletRequestAttributeEvent e):向Request对象添加新属性
(2)void attributeRemoved(ServletRequestAttributeEvent e):从request对象中删除属性
(3)void attributeReplaced(ServletRequestAttributeEvent e):替换对象中现有属性值
ServletRequestAttributeEvent中的主要方法:
getName():返回Request增加、删除、或替换的属性名称
getValue():返回Request增加、删除、或替换的属性的值
注:以上均需要在web.xml中进行配置
四、监听绑定到 HttpSession 域中的某个对象的状态的事件监听器
1.HttpSessionBindingListener接口
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener
当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出
(即调用HttpSession对象的removeAttribute方法的时候或SessionTime out的时候)时,可以感知自己何时被绑/解绑HttpSession域中,容器分别会自动调用下列两个方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)
2.HttpSessionActivationListener接口:监听Http会话的active和passivate状态。接口中定义的回调方法有:
session对象被保存到磁盘时,激发 sessionWillPassivate(HttpSessionEvent)
session对象被调入内存时,激发 sessionDidActivate(HttpSessionEvent)
Activate与Passivate是用于置换session对象的动作,当Web服务器因为资源利用或负载平衡等原因要将内存中的 session对象暂时储存至硬盘或其它储存器时(通过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加 载到JVM中时所采的动作称之为Activate。sessionDidActivate()方法与 sessionWillPassivate()方法分别于Activeate后与Passivate前被调用。
主要有以下三类:
1、ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
public void contextInitialized(ServletContextEvent sce);//上下文初始化
public void contextDestroyed(ServletContextEvent sce);//上下文销毁
public ServletContext getServletContext();//ServletContextEvent事件:取得一个ServletContext(application)对象
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。
public void attributeAdded(ServletContextAttributeEvent scab);//增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除
public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性)
//ServletContextAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值
2、Session监听
Session属于http协议下的内容,接口位于javax.servlet.http.*包下。
HttpSessionListener接口:对Session的整体状态的监听。
public void sessionCreated(HttpSessionEvent se);//session创建
public void sessionDestroyed(HttpSessionEvent se);//session销毁
//HttpSessionEvent事件:
public HttpSession getSession();//取得当前操作的session
HttpSessionAttributeListener接口:对session的属性监听。
public void attributeAdded(HttpSessionBindingEvent se);//增加属性
public void attributeRemoved(HttpSessionBindingEvent se);//删除属性
public void attributeReplaced(HttpSessionBindingEvent se);//替换属性
//HttpSessionBindingEvent事件:
public String getName();//取得属性的名称
public Object getValue();//取得属性的值
public HttpSession getSession();//取得当前的session
session的销毁有两种情况:
1、session超时,web.xml配置:
120 2、手工使session失效
public void invalidate();//使session失效方法。session.invalidate();
3、Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requestDestroyed(ServletRequestEvent sre);//request销毁
//ServletRequestEvent事件:
public ServletRequest getServletRequest();//取得一个ServletRequest对象
public ServletContext getServletContext();//取得一个ServletContext(application)对象
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。
public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除
public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性)
//ServletRequestAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值
4、在web.xml中配置
Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,而销毁比Servlet和Filter都慢。
com.listener.class 3、Listener应用实例