在Servlet容器中,可通过定义监听器对象对事件进行监听和产生反应。例如监听ServletContext对象的生命周期变化情况及ServletContext对象中属性的变化情况,也可以监听HttpSession对象的生命周期变化情况及HttpSession对象中属性的变化情况,然后分别做出反应(如在线人数统计等)。
在定义监听器类时只需实现相应的监听器接口即可。例如实现了ServletContextListener接口和ServletContextAttributeListener的类就可以监听到ServletContext对象的生命周期变化情况及ServletContext对象中属性的变化情况,实现了HttpSessionListener接口和Http SessionAttributeListener接口的类就可以监听到HttpSession对象的生命周期变化情况及HttpSession对象中属性的变化情况。
当某个事件发生时,Servlet容器将自动去调用监听器类的与之对应的方法。下面列出了常见的事件与监听器接口方法的对应关系。
ServletContextListener接口监听ServletContextEvent事件见表5-1。
表5-1 ServletContextListener接口中的方法
ServletContextAttributeListener接口监听ServletContextAttributeEvent事件见表5-2。
表5-2 ServletContextAttributeListener接口中的方法
HttpSessionListener接口监听HttpSessionEvent事件见表5-3。
表5-3 HttpSessionListener接口中的方法
HttpSessionAttributeListener接口监听HttpSessionBindingEvent事件见表5-4。
表5-4 HttpSessionAttributeListener接口中的方法
在Java Web应用中使用监听器的一般步骤如下。
(1)编写一个实现某个Listener接口的监听器类,如:
(2)实现监听器类中相应的方法,针对监听到的事件做出反应,如:
(3)将监听器类配置到web.xml文件中,如:
(4)正常使用。
在本实例中共创建两个Listener实例分别用于监听ServletContext、HttpSession对象生命周期及ServletContext、HttpSession对象中属性变化情况。
首先创建一个用于监听ServletContext对象生命周期及ServletContext对象中属性变化情况的监听器MyContextListener(见例程5-6),MyContextListener分别实现了ServletContextListener接口和ServletContextAttributeListener接口。
然后再创建一个用于监听HttpSession对象生命周期及HttpSession对象中属性变化情况的监听器MySessionListener(见例程5-7),MySessionListener分别实现了HttpSessionListener接口和HttpSessionAttributeListener接口。
接下来,在web.xml(见例程5-8)中配置MyContextListener和MySessionListener,使之生效。
最后创建两个测试用的JSP页面index.jsp(见例程5-9)与logout.jsp(见例程5-10),在JSP页面中通过对ServletContext、HttpSession对象中属性的新增与调整来激发相应的过滤器。
例程5-6 MyContextListener.java
例程5-7 MySessionListener.java
例程5-8 web.xml
例程5-9 测试用JSP页面index.jsp
例程5-10 测试用JSP页面logout.jsp
运行效果如图5-3 和图5-4所示。
图5-3 监听器在控制台上输出的信息
图5-4 index.jsp与logout.jsp运行效果
本实例的完整源代码请参考配套光盘的“源代码”部分。