监听器(8个监听4个事件)
在serlvet中定义了多种类型的监听器,它们用于监听的事件源分别为serlvetContext,HttpSession和ServletRequest这三个对象
servlet规范针对这三个域对象(ServletContext,session,request)上的操作,又把这多种类型的监听器划分为三种类型:
监听三个域对象创建和销毁的事件监听器
监听域对象中的属性的增加和删除的事件监听器
监听绑定到HttpSession域中的某个对象的状态的时间监听器
每个域对象的监听器中传入的ServletContextEvent类型的参数都可以得到当前的域对象,比如session的监听器可以通过传入的参数获取到当前的session域对象。监听域对象属性(映射关系)的事件监听器还可以通过传入参数的getName和getValue方法获取当前操作属性(映射关系)的key和value
servletContext监听器
servletContext对象的创建,当web应用被发布时创建,当卸载web应用时销毁,并会被实现了ServletContextListener接口的监听器所监听到
//监听servletContext域对象创建和销毁的监听器
public class MyServletContextListener implements ServletContextListener{
//当servletContext域对象销毁时此方法会被执行
@Override
public void contextDestroyed(ServletContextEvent event) {
// TODO Auto-generated method stub
System.out.println("servletContext域对象被销毁了");
}
//当servletContext域对象创建时此方法会被执行
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generatedmethod stub
System.out.println("servletContext域对象被创建了");
}
}
//监听servletContext域对象的属性的监听器(当对sevletContext对象域中的映射关系进行增,删,改时,都会被实现了ServletContextAttributeListener接口的监听器所监听到)
public class MyServletContextAttributeListener implementsServletContextAttributeListener{
//当servletContext域对象中添加了新的映射关系就调用此方法
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
// TODO Auto-generatedmethod stub
System.out.println("servletContext域中增加了此映射关系:"+event.getName()+"="+event.getValue());
}
//当servletContext域对象中删除了映射关系就调用此方法
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
// TODO Auto-generatedmethod stub
System.out.println("servletContext域中删除了此映射关系:"+event.getName()+"="+event.getValue());
}
//当servletContext域对象中修改了映射关系的值,就调用此方法
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
// TODO Auto-generatedmethod stub
System.out.println("servletContext域中修改了此映射关系:"+event.getName()+"="+event.getValue());
}
}
<!—在web.xml配置文件中注册监听器 -->
<listener>
<listener-class>cn.listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>cn.listener.MyServletContextAttributeListener</listener-class>
</listener>
session域对象和erquest对象的监听器和上面的方法都一样,不过需要实现的接口不同
监听session对象的创建和销毁需要实现HttpSessionListener接口,监听此域中属性的监听器需要实现HttpSessionAttribteListener接口
session对象的创建,当第一次调用request.getSession()方法时创建session对象;
session对象的销毁,手动调用session对象的invalidate()方法和超时(session对象默认不操作情况下存活30分钟)session对象会被销毁,并会被实现了HttpSessionListener接口的监听器所监听到;
当对session对象域中的映射关系进行 增,删,改时,都会被实现了HttpSessionAttribteListener接口的监听器所监听到
监听request对象的创建和销毁需要实现ServletRequestListener接口,监听此域中属性的监听器需要实现ServletRequestAttributeListener接口
request对象的创建和销毁,当用户每发送一次请求时,request对象就被创建一次,当服务器返回了response对象后此request对象将被销毁,并会被实现了ServletRequestListener接口的监听器所监听到;
当对request对象域中的映射关系进行 增,删,改 时,都会被实现了ServletRequestAttributeListener接口的监听器所监听到
监听绑定到HttpSession域中的某个对象的状态的时间监听器
感知型监听器,谁实现了这个些接口,就可以获取在session域对象中的状态,这两种监听器不需要注册
HttpSessionActivationListener实现了此接口就可以感知自己何时随着HttpSession对象钝化和活化(钝化和活化的意思是当在服务器中暂停了当前的web应用,那么此web应用中的所有域和域中的对象就钝化了。如果继续当前web应用,那么此web应用中的所有域和域中的对象就活化了)
sessionDidActivate(HttpSessionEvent event);当此对象和session域对象一起活化了时就会调用此方法
sessionWillPassivate(HttpSessionEvent event) ;当此对象和session域对象一起钝化了时就会调用此方法
HttpSessionBindingListener实现了此接口就可以感知自己何时被添加到了session对象,和被session对象删除了
valueBound(HttpSessionBindingEventevent);当自己被添加到了session域中时就会调用此方法
valueUnbound(HttpSessionBindingEventevent);当自己被session域对象移除时就会调用此方法