监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应。
例1 应用Servlet监听器统计在线人数。
(1)创建UserInfoList.java类文件,主要是用来存储在线用户和对在线用户进行具体操作。该文件的完整代码如下:
package com.cn.gao;import java.util.Vector;public class UserInfoList { private static UserInfoList user = new UserInfoList(); private Vector vector = null; /* * 利用private调用构造函数,防止被外界产生新的instance对象 */ public UserInfoList(){ this.vector = new Vector(); } //外界使用的instance对象 public static UserInfoList getInstance(){ return user; } //增加用户 public boolean addUserInfo(String user){ if(user!=null){ this.vector.add(user); return true; }else{ return false; } } //获取用户列表 public Vector getList(){ return vector; } //移除用户 public void removeUserInfo(String user){ if(user!=null){ vector.removeElement(user); } }}
(2)创建UserInfoTrace.java类文件,主要实现valueBound(HttpSessionBindingEvent arg0)和valueUnbound(HttpSessionBindingEvent arg0)两个方法。当有对象加入session时,valueBound()方法会自动被执行;当有对象从session中移除时,valueUnbound()方法会被自动执行,在valueBound()和valueUnbound()方法中都加入了输出信息的功能,可使用户在控制台中更清楚地了解执行过程。该文件的完整代码如下:
package com.cn.gao;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class UserInfoTrace implements HttpSessionBindingListener { private String user; private UserInfoList container = UserInfoList.getInstance(); public UserInfoTrace(){ user = ""; } //设置在线监听人员 public void setUser(String user){ this.user = user; } //获取在线监听 public String getUser(){ return this.user; } public void valueBound(HttpSessionBindingEvent arg0) { System.out.println("上线"+this.user); } public void valueUnbound(HttpSessionBindingEvent arg0) { System.out.println("下线"+this.user); if(user!=""){ container.removeUserInfo(user); } }}
(3)创建index2.jsp页面文件,用于用户登录,该页面的关键代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>My JSP 'index2.jsp' starting page
(3)创建showUser.jsp页面文件,在页面中设置session的setMaxInactiveInterval()为10秒,这样可以缩短session的生命周期。该页面的关键代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%><%@ page import="com.cn.gao.*" %><%UserInfoList list = UserInfoList.getInstance();UserInfoTrace ut = new UserInfoTrace();String name=request.getParameter("user");ut.setUser(name);session.setAttribute("list",ut);list.addUserInfo(ut.getUser());session.setMaxInactiveInterval(10);%>My JSP 'showUser.jsp' starting page
当用户单击“登录”按钮,就会进入到统计在线人数的界面。