JavaWeb监听器Listener

在监听器的对象作用领域中一般涉及监听主体(监听器)、监听客体(事件源)、监听事件(事件)。

在警察监听小偷中,警察是监听器,小偷是事件源,偷东西是时间。

JavaWeb中监听器的事件源(ServletContext、HttpSession、ServletRequest、JavaBean)

1、ServletContext

  • 生命周期监听:ServletContextListener
  • 属性监听:ServletContextAttributeListener

2、HttpSession

  • 生命周期监听:HttpSessionListener
  • 属性监听:HttpSessionAttributeListener

3、ServletReques

  • 生命周期监听:ServletRequestListener
  • 属性监听:ServletRequestAttributeListener

4、JaveBean

  • 感知监听:HttpSessionBindingListener
  • 钝化活化监听:HttpSessionActivationListener
前3个都是域对象监听器,需要在web.xml中配置注册一下。其中ServletContxt域的监听器使用的最多。域对象监听器主要有两个作用:1、监听域对象的“创建”与“销毁”;2、监听域对象中属性的变幻(增、删、改);
第4个不是给session添加,而是给Bean添加。即让Bean类实现监听器接口,然后再把Bean对象添加到session域中。不需要在web.xml中注册。

事件源为域对象的监听器的实现:

  1. 写一个监听器类,必须实现某个监听器接口;
  2. 在web.xml中配置一下;
事件源为非域对象的监听器实现只需要写一个监听器类即可
域对象监听器的示例:
监听器类
public class MyServletContextListener implements
	ServletContextListener,HttpSessionListener,ServletRequestListener {
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("ServletContext创建了...");
	}
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("ServletContext销毁了...");
	}
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("HttpSession创建了...");
	}
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("HttpSession销毁了...");
	}
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("ServletRequest创建了...");
	}
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("ServletRequest销毁了...");
	}

}
配置web.xml
  <listener>
  	<listener-class>cn.edu.jxau.MyServletContextListener</listener-class>
  </listener>

非域对象的监听器示例:
HttpSessionBindingListener实现类
public class Student implements HttpSessionBindingListener {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println("Student对象保存到了Session中");
	}

	public void valueUnbound(HttpSessionBindingEvent event) {
		System.out.println("Student对象从Session中移除了");
	}
}
当Student加到seesion中时,服务器自动调用valueBound( )方法,
当Student对象从session移除时,服务器调用valueUnbound()方法。

活化和钝化
钝化:对象从内存中保存到硬盘
活化:钝化后的对象从硬盘调入内存
当有很多用户访问服务器,我们可以把长时间不活动的用户的session钝化到硬盘中。可以配置Tomcat中session需要钝化的时间间隔,把下面配置文件放到tomcat\conf\catalina\localhost目录下!文件名称为项目名称。

<Context>

    <Manager className="org.apache.catalina.session.PersistentManager"  maxIdleSwap="1" >

       <Store className="org.apache.catalina.session.FileStore"  directory="mysession" />

    </Manager>

</Context>

实现了HttpSessionActivationListener接口的javaBean对象能够感知自己被活化和钝化的事件。JavaBean对象会随着HttpSession对象一起活化钝化
HttpSessionActivationListener实现类:
public class User implements HttpSessionActivationListener,Serializable {

	public void sessionDidActivate(HttpSessionEvent arg0) {
		System.out.println("活化了.....从硬盘反序列化到内存");
	}

	public void sessionWillPassivate(HttpSessionEvent arg0) {
		System.out.println("钝化了.....序列化到硬盘");
	}
}
jsp
<%
    	Object user = session.getAttribute("user");
    	
    	if(user==null){
    		user = new User();
    		session.setAttribute("user", user);
			out.println("创建了一个User对象:"+user+",并放入session当中");    	
    		
    	}else{
    		out.println("从session中取出了User对象:"+user);
    	}
  %>
往session中放了User对象之后,关闭服务器时,会调用监听器的sessionWillPassivate()方法序列化到硬盘。出现如下图所示,表示成功钝化:

所有的session都保存在该文件中,保存在session中的信息都必须实现Serialization接口(String类也实现了该接口)
当我们再次打开服务器的时候该文件会消失,则活化了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。