所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生情况时,立即调用相应的方法进行处理。
Servlet 监听器的分类
按监听的对象划分
1.用于监听应用程序环境对象(ServletContext)的事件监听器
2.用于监听用户会话对象(HttpSession)的事件监听器
3.用于监听请求消息对象(ServletRequest)的事件监听器
按监听的事件类项划分
1.用于监听域对象自身的创建和销毁的事件监听器
2.用于监听域对象中的属性的增加和删除的事件监听器
3.用于监听绑定到HttpSession域中的某个对象的状态的事件监听器
编写 Servlet 监听器
1)要实现监听对象对应的接口
2)监听器创建以后要在web.xml中注册
3)servlet事件监听器的注册和调用过程都是由web容器自动完成
4)监听器是线程不安全的
监听域对象的创建和销毁
对象创建和销毁的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。
1 、ServletContext 域
* 创建:是在 Web 服务器启动并加载某个 Web 应用程序时创建相应的ServletContext 对象,
* 销毁:是在 Web 服务器关闭或卸载时为每个 Web 应用程序销毁相应的ServletContext 对象。
java文件中的实现
/**
* 用于监听 ServletContextListener 对象的创建和销毁的事件监听器
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 当ServletContext对象创建时,调用该方法
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 被创建了");
//所有对象共享的
ServletContext sc=sce.getServletContext();
Map<String,String> map=new HashMap<String,String>();
map.put("yxkong", "鱼翔空");
sc.setAttribute("map", map);
}
/**
* 当ServletContext对象销毁时,调用该方法
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextEvent 对象销毁了");
}
}
web.xml文件中的配置
<!-- 注册监听器 -->
<listener>
<listener-class>com.yxkong.listener.MyServletContextListener</listener-class>
</listener>
2 、HttpSession域
* 创建:是在浏览器开始与服务器会话时创建,
* 销毁:是在调用HttpSession.invalidate();超过了Sessiond的最大有效时间间隔,服务器进程被停止的时候。
/**
* HttpSessionListener:用于监听session对象的创建和销毁
*/
public class MyHttpSessionListener implements HttpSessionListener {
/**
* 当session对象创建时,调用该方法
*/
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session 对象被创建了");
HttpSession sessison=se.getSession();
System.out.println("sessison "+sessison);
ServletContext sc=sessison.getServletContext();
Map<String,String> map=(Map<String,String>)sc.getAttribute("map");
System.out.println(map.get("yxkong"));
}
/**
* 当session对象销毁时,调用该方法
*/
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session 对象被销毁时");
}
}
<!-- 注册监听器 -->
<listener>
<listener-class>com.yxkong.listener.MyHttpSessionListener</listener-class>
</listener>
3 、ServletRequest 域
* 创建:每次请求开始时创建,
* 销毁: 每次访问结束后销毁
/**
* 用于监听ServletRequestListener对象的创建和销毁的监听器
*/
public class MyServletRequestListener implements ServletRequestListener {
/**
* 当request对象创建时,调用该方法
*/
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("HttpServletRequest对象创建");
//获取ServletContext对象
ServletContext sc=sre.getServletContext();
//获取HttpServletRequest对象
HttpServletRequest request=(HttpServletRequest)sre.getServletRequest();
HttpSession session=request.getSession();
ServletContext sc1=session.getServletContext();
Map<String,String> map=(Map<String,String>)sc.getAttribute("map");
System.out.println("MyServletRequestListener "+map.get("yxkong"));
}
/**
* 当request对象销往时,调用该方法
*/
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("HttpServletRequest被销毁时");
}
}
<!-- 注册监听器 -->
<listener>
<listener-class>com.yxkong.listener.MyServletRequestListener</listener-class>
</listener>
域对象中属性的变更的事件监听器(不需要往xml中注册)
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener
各个域属性监听器中的完整语法定义为:
public void attributeAdded(ServletContextAttributeEvent scae)
public void attributeReplaced(HttpSessionAttributeEvent hsbe)
public void attributeRmoved(ServletRequestAttributeEvent srae)
/**
* 往session中增加属性 替换属性 删除属性时,调用该监听器
*/
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
/**
* 当session中增加属性时,调用该方法
*/
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("MyHttpSessionAttributeListener attributeAdded");
String name=se.getName();
Object value=se.getValue();
System.out.println(name + "----------" + value);
}
/**
* 当session中替换属性时,调用该方法,获取的值是被替换的值
*/
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("MyHttpSessionAttributeListener attributeReplaced");
String name=se.getName();
Object value=se.getValue();
System.out.println(name + "----------" + value);
}
/**
* 当session中删除属性时,调用该方法,获取的值是删除的值
*/
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("MyHttpSessionAttributeListener attributeRemoved");
String name=se.getName();
Object value=se.getValue();
System.out.println(name + "----------" + value);
}
}
监听javaBean在session中的状态
保存在 Session 域中的对象可以有多种状态:绑定到 Session 中;从 Session 域中解除绑定;随 Session 对象持久化到一个存储设备中;随 Session 对象从一个存储设备中恢复
Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的这些状态:
HttpSessionBindingListener接口
HttpSessionActivationListener接口 ,
注:实现这两个接口的类不需要 web.xml 文件中进行注册
public class User implements HttpSessionBindingListener,HttpSessionActivationListener,java.io.Serializable {
private String name;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
//对象被绑定到 HttpSession 对象中时
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("valueBound "+this);
String name=event.getName();
User user=(User)event.getValue();
if(user!=null){
System.out.println("valueBound "+name +"------"+user.getName());
}
}
//对象从 HttpSession 对象中解除绑定时
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("valueUnbound ");
String name=event.getName();
User user=(User)event.getValue();
if(user!=null){
System.out.println("valueUnbound "+name +"------"+user.getName());
}
}
//当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("活化 对象随session从存储设备上恢复");
}
//当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("钝化 对象随session持久化到存储设备中");
}
}