Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:
ServletContextListener监听ServletContext。当创建ServletContext时,激发 contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。
ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
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) 方法。
下面我们开发一个具体的例子,这个监听器能够统计在线的人数。
程序源代码:
package com.dr.web.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
publicclass UserCountListener implements ServletContextListener,
HttpSessionListener {
//每个web应用都有且仅有一个ServletContext对象,这个对象在所有的Servlet都可以使用。
/**
* 因为一个web应用就一个ServletContext 对象,因此可以使用ServletContext 来做一些全局性的属性设置等。
* 比如网站访问计数器等等
*
*
* ServletContext 是一个应用程序与Web容器(tomcat之类)交互的接口,同时它也是管理应用程序资源的对象,
通过它可以读取web.xml中一些配置,如<context-param>中的信息,读取应用中的资源等。
Session 是一个会话对象,也就是说当客户端访问服务器页面时,它才产生,
原理是服务器对每个客户端产生一个sessionid值,并把它也保存在客户端,
每次请求时验证这个sessionid是否是创建了sessionid的客户端,在服务器端对应这个sessionid会创建一个缓存区,
存储一些相关信息,程序员可以操作,如被用于购物车,存储用户信息等,这个区域只有对特定用户有访问权限,对其他客户是拒绝访问的,这就是一个会话。
Request 是一个请求对象,也就是说它的生命很短暂,只在一个请求中存在,如一个页面到另一个页面,
一个页面到servlet或action,一个servlet或action到jsp页面等,你可以用它的setAttribute方法传递需要的信息(对象),验证请求方的信息,获得请求方发过来的文件内容等。
*/
private ServletContext sc;
publicvoid contextDestroyed(ServletContextEvent arg0) {
}
publicvoid contextInitialized(ServletContextEvent event) {
ServletContext sc = event.getServletContext();
sc.setAttribute("Users", new Integer(0));
this.sc = sc;
}
publicvoid sessionCreated(HttpSessionEvent event) {//在线
System.out.println("new user login our web site");
Integer users = (Integer)sc.getAttribute("Users");
sc.setAttribute("Users", ++users);
}
publicvoid sessionDestroyed(HttpSessionEvent event) {
Integer users = (Integer)sc.getAttribute("Users");
sc.setAttribute("Users", --users);
}
}
Web.xml中配置如下:
<listener>
<listener-class>com.dr.web.listener.UserCountListener</listener-class>
</listener>
在UserCountListener里,用users代表当前在线的人数,UserCountListener将在Web服务器启动时自动执行。当UserCountListener构造好后,把users设置为 0。每增加一个Session,UserCountListener会自动调用sessionCreated(HttpSessionEvent event)方法;每销毁一个Session,UserCountListener会自动调用 sessionDestroyed(HttpSessionEvent se)方法。当调用sessionCreated(HttpSessionEvent event)方法时,说明又有一个客户在请求,此时使在线的人数(users)加1,并且把user写到ServletContext中。 ServletContext的信息是所有客户端共享的,这样,每个客户端都可以读取到当前在线的人数。
运行结果: