监听器简介
监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和响应处理的对象, 当被监视的对象发生情况时立即采取相应的行动。
Servlet 监听器:Servlet规范中定义的一种特殊类,它用于监听 Web 应用程序中的ServletContext、HttpSession和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
监听器的分类
按监听器的事件类型 Servlet 监听器可分为三种:
- 监听域对象自身的创建和销毁的事件监听器(3个)
- 监听域对象中的属性的增加和删除的事件监听器(3个)
- 监听绑定到HttpSession 域中的某个对象的状态的事件监听器(2个)
ServletContextListener
- ServletContextListener是监听ServletContext对象被创建或销毁的Servlet监听器
如何使用?
1) 创建一个实现了ServletContextListener的类,并实现其中两个方法
2)在web.xml 文件中配置Listener<Listener> <listener-class><!-- 继承监听器接口的类的全类名 --><listener-class> </Listener>
ServletContextListener 是最常用的Listener,可以在当前WEB应用被加载时对当前WEB应用的相关资源进行初始化操作:
例如: 创建数据库连接池,创建Spring 的IOC 容器,读取当前WEB 应用的初始化参数….API:
//ServletContext 对象被创建(即,当前WEB应用被加载)时,Servlet容器调用该方法
public void contextInitialized(ServletContextEvent sce0);
//ServletContext 对象被销毁之前(即,当前WEB应用被卸载时),Servlet容器调用该方法
public void contextDestroyed(ServletContextEvent sce);ServletRequestListener 、HttpSessionListener 和ServletContextListener 类似
利用ServletRequestListener、HttpSessionListener以及 ServletContextListener 可以把request,session,application 的生命周期做进一步的了解
》request:是一个请求,当响应返回时即被销毁,当发送一个请求时被创建。注意:请求转发是一个request,重定向是两个request。
》Session:
session的创建:当第一次访问WEB 应用的一个Jsp 或 Servlet 时,且该Jsp 或 Servlet 中还需要创建一个session 对象,此时服务器会创建一个session 对象。
什么叫需要创建一个session对象? 例如:
在jsp页面中写了<%@page session="false" %>
, 且没写request.getHttpSession()或request.getHttpSession(true)
时,不会创建session;在jsp页面中写了
<%@page session="false" %>
, 但写了request.getHttpSession()或request.getHttpSession(true)
时,会创建一个session;session的销毁:session 过期、直接调用session的invalidate 方法、当前WEB 应用被卸载(session 可以持久化,此时不会被销毁)
关闭浏览器,并不意味着session 被销毁,还可以通过sessionid 找到服务器中的 session 对象。
例如:
我们打开一个浏览器,访问一个页面,此时创建了一个session,我们把该session 的 sessionid 复制下来,接下来把浏览器关闭再重写打开浏览器,在url后加上jsessionid=xxxxx 的方式再访问该页面,此时就不会再创建新的session,而是使用的服务器中 sessionid对应的那个session对象
》application :贯穿于当前WEB 应用的生命周期。当前web 应用被加载时创建 application 对象 ,当前 web应用被卸载时销毁application 对象。
XxxAttributeListener
1)是监听ServletContext,HttpSession,ServletRequest 中添加属性,替换属性,移除属性的事件监听器。
2)以ServletRequestAttributeListener 为例:
需要实现该接口三个方法,并在web.xml中注册 。
//添加属性时被调用
public void attributeAdded(ServletRequestAttributeEvent srae){
system.out.println("向request 中添加了一个属性" +
srae.getName() + ": " + srae.getValue());
}
//移除属性时被调用
public void attributeRemoved(ServletRequestAttributeEvent srae){
system.out.println("向request 中移除了一个属性" +
srae.getName() + ": " + srae.getValue());
}
//替换属性时被调用
public void attributeReplaced(ServletRequestAttributeEvent srae){
system.out.println("向request 中替换了一个属性" +
srae.getName() + ": " + srae.getValue());
}
ServletRequestAttributeEvent类中有两个方法:
getName(): 获取属性的名字
getValue(): 获取属性的值(若是替换,则为替换前的值)
3)ServletContextAttributeListener、HttpSessionAttributeListener和 ServletRequestAttributeListener 类似,这三个监听器较少被使用。(了解)
HttpSessionBindingListener
1)监听实现了该接口的Java 类的对象被绑定到 session 或 从session 中解除绑定的事件。
public class Customer implements HttpSessionBindingListener{
//当前对象绑定到session 时调用该方法
public void valueBound(HttpSessionBindingEvent event){
System.out.println("绑定到 session");
Object value = event.getValue();
System.out.println(this == value);//true
}
//当前对象从session 中解除绑定时调用该方法
public void valueUnbound(HttpSessionBindingEvent event){
System.out.println("从 session 中解除绑定");
}
}
2)该监听器不需要在 web.xml 文件中配置
3)HttpSessionBindingEvent有三个方法: getName(); getValue(); getSession()
4)该监听器较少被使用(了解)
HttpSessionActivationListener
1)是监听实现了该接口和Serializable 接口的Java 类的对象随session 钝化和活化事件 的监听器
- 活化:从磁盘中读取 session 对象
- 钝化:向侧盘中写入 session 对象
- session 对象存储在tomcat 服务器的 work\Catalina\localhost\contextPath 目录下. SESSION.SER
- 钝化前和活化后的对象为同一对象,但哈希值不一样。
2)该监听器不需要再web.xml 文件中进行配置
3)API:
//在活化之后被调用
public void sessionDidActivate(HttpSessionEvent se)
//在钝化之前被调用
public void sessionWillPassivate(HttpsessionEvent se)
HttpSessionEvent: getSession()
4)该监听器较少被使用 。(了解)