日期:2014-05-19  浏览次数:20637 次

J2EE监听器和过滤器基础

Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。

监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。

?

  • ServletContex监听器
ServletContex又叫application,存在范围是整个Servlet容器生命周期,当系统启动时就会创建,系统关闭时会销毁,该对象通常存放一些非常通用的数据,但是不推荐存放太多,否则长期占据内存空间会影响服务器性能。
基于ServletContex的监听器可以继承两个接口并实现接口中相应的方法:
ServletContextListener接口定义了两个方法contextInitialized和contextDestroyed,分别在ServletContex创建和销毁时触发;
ServletContextAttributeListener接口定义了三个方法attributeAdded,attributeRemoved和attributeReplaced,分别在给ServletContex添加属性值,删除属性值和替换属性值时触发。
下面创建了一个基于Application的监听器:
 /**
 * Application监听器,Servlet中的Application即ServletContext
 * @author Administrator
 */
public class ApplicationListener implements ServletContextListener,
		ServletContextAttributeListener {
	
	/**
	 * application销毁时触发的事件
	 */
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("Application销毁:"+arg0.getServletContext());
	}
	
	/**
	 * application初始化时触发的方法
	 */
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("Application创建:"+arg0.getServletContext());
	}
	
	/**
	 * application中添加属性值时触发的方法
	 */
	@Override
	public void attributeAdded(ServletContextAttributeEvent arg0) {
		System.out.println("Application添加新属性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application中删除属性值时触发的方法
	 */
	@Override
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
		System.out.println("Application移除属性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application中替换属性值时触发的方法
	 */
	@Override
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
		System.out.println("Application替换属性:key="+arg0.getName()+"  value="+arg0.getValue());
	}

}

?

最后在web.xml需要注册监听器,注册方式非常简单,注意标签<description>和<display-name>不是必须的

?

  <listener>
  	<description>application listener</description>
  	<display-name>application_listener</display-name>
  	<listener-class>com.bless.listener.application.ApplicationListener</listener-class>
  </listener>

随后启动java web项目,监听器就会运行。

?

?

?

  • Session监听器
Session对于做web项目的人来说应该非常熟悉了,Session的生命周期是一个用户的一次会话,简单的说当一个用户进入某个网站,在该网站服务器就已经为用户创建了一个Session对象,用户在网站内的任何操作都是在session周期内。
误区:某些人认为我进入某网站,随后关闭浏览器,我的session就已经销毁了。其实不然,因为session存储在服务器端,服务器并不能主动捕获到浏览器关闭的事件,即使关闭浏览器,Session对象依然存在服务器中。所以如果编写web应用时一定要考虑session什么时候销毁,销毁session对象的方式有两种:一种是调用session的invalidate方法,另一种是在web.xml中定义session失效时间session-timeout。
Session监听器也有两个接口,其功能与前面介绍的ServletContex类似:HttpSessionListener用于监听Session创建和销毁的事件,HttpSessionAttributeListener用于监听Session属性赋值,删除和替换的事件:

/**
 * Session监听器
 * @author Administrator
 */
public class SessionListener implements HttpSessionListener,
		HttpSessionAttributeListener {
	Vector<HttpSession> listSession = null;
	
	/**
	 * 创建Session调用的方法
	 * 将session对象放入listSession集合中
	 */
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		synchronized (this) {
			if(listSession == null){
				listSession = new Vector<HttpSession>();
			}