3、Listener功能
它是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener
Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:
ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。
HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。
下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。
要获得以上的功能,监听器必须实现以下3个接口:
HttpSessionListener
ServletContextListener
ServletContextAttributeListener
jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>主页</title>
- </head>
- <body>
- <h4>你好!</h4>
- 在线人数:<h1><%=request.getSession().getAttribute("onlineUserCount") %></h1>
- </body>
- </html>
Web.xml
- <listener>
- <listener-class>com.ee.listener.OnlineUserListener</listener-class>
- </listener>
/**
- *
- */
- package com.ee.listener;
- import javax.servlet.ServletContextAttributeEvent;
- import javax.servlet.ServletContextAttributeListener;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- /**
- * @author Administrator
- *
- */
- public class OnlineUserListener implements HttpSessionListener,
- ServletContextListener, ServletContextAttributeListener {
- private long onlineUserCount = 0;
- public long getOnlineUserCount() {
- return onlineUserCount;
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent)
- */
- @Override
- public void attributeAdded(ServletContextAttributeEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent)
- */
- @Override
- public void attributeRemoved(ServletContextAttributeEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent)
- */
- @Override
- public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {
- System.err.println("...attributeReplaced...");
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
- */
- @Override
- public void contextDestroyed(ServletContextEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
- */
- @Override
- public void contextInitialized(ServletContextEvent arg0) {
- }
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
- */
- @Override
- public void sessionCreated(HttpSessionEvent httpSessionEvent) {
- onlineUserCount ++;
- toUpdateCount(httpSessionEvent);
- }
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
- */
- @Override
- public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
- onlineUserCount --;
- toUpdateCount(httpSessionEvent);
- }
- private void toUpdateCount(HttpSessionEvent httpSessionEvent){
- httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
- }
- }