第七章 监听器listener显示在线用户案例学习心得
前言:这个是我自己的学习笔记,用于加深自己对于java web 理解。
显示在线用户:这个案例主要是统计启动时间、累积访问人数、最大同时在线以及发生的时间、当前用户数以及当前登录的用户数。
这个案例和上一个案例基本类似,利用相关的listener可以实现。
统计信息的类代码如下所示。
1 package hellojava.listener.util; 2 import java.util.Date; 3 import java.util.HashMap; 4 import java.util.Map; 5 import javax.servlet.http.HttpSession; 6 public class ApplicationConstants 7 { 8 //所有的session 9 public static Map<String,HttpSession> SESSION_MAP= new HashMap<String, HttpSession>(); 10 //当前登录的用户总数 11 public static int CURRENT_LOGIN_COUNT=0; 12 //历史访客总数 13 public static int TOTAL_HISTORY_COUNT=0; 14 //服务器启动时间 15 public static Date START_DATE=new Date(); 16 //最高在线时间 17 public static Date MAX_ONLINE_COUNT_DATE=new Date(); 18 //最高在线人数 19 public static int MAX_ONLINE_COUNT=0; 20 }
里面有一个重要的数据结构为SESSION_MAP,保存所有用户的session。
JSP页面代码学习:
JSP页面效果图
图片是分别在三个浏览器上登录之后的效果,用户登录情况表格形式呈递的效果实现代码如下所示。
<% for (String id : ApplicationConstants.SESSION_MAP.keySet()) { HttpSession sess = ApplicationConstants.SESSION_MAP.get(id); PersonInfo personInfo = (PersonInfo)sess.getAttribute("personInfo"); %> <tr <%= session == sess ? "bgcolor=#DDDDDD" : "" %>> <td><%=id%></td> <td><%=personInfo==null ? " " : personInfo.getAccount()%></td> <td><%=DateFormat.getDateTimeInstance().format(sess.getCreationTime())%></td> <td><%=DateFormat.getDateTimeInstance().format( new Date(sess.getLastAccessedTime()))%></td> <td><%=sess.isNew()%></td> <td><%=sess.getAttribute("activeTimes")%></td> <td><%=sess.getAttribute("ip") %></td> </tr> <% } %>
for循环中的花括号{},中间有html内容,这样可以动态的输出表格。<tr <%= session == sess ? "bgcolor=#DDDDDD" : "" %>>这段代码可以设置你所对应的记录的背景颜色。
教训:
蓝色部分是书中的源代码,红色部分是我照着书中的代码重新写了一遍,书中的online.jsp页面我也重新写了一个,名字叫做MyOnline.jsp,MyOnline.jsp用到的是都是我自己的类代码,但是我没有在web.xml中添加相应的的Listener文件,导致我访问MyOnline.jsp中在线人数显示一直为空。在web.xml中配置相关文件后,问题解决。
虽然MyOnline.jsp和online.jsp使用的是不同的代码,但是他们使用的是相同session,第一章图片中,activeTimes那一列代表访问次数都是偶数,就是因为activeTimes这个属性存放在session中,两个功能相同的Listener都会执行对activeTimes执行++操作,因此每次访问就会执行两次++操作。(PersonInfo这个类我也是在不同的包实现了一次,在对session["personInfo"]的处理中,就会出现hellojava.listener.singleton.PersonInfo cannot be cast to com.helloweenvsfei.singleton.PersonInfo的异常。)因此在开发中,对于自定义的session属性,要实现定义好,避免属性名相同的情况。
经验:1web.xml文件很重要。2在实际开发中,session的自定义属性,要事先定义好,最好有一个文本化的表格。
菜包子
2013年6月9日17:33:17 于马甸桥东