第七章 监听器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 ? "&nbsp;" : 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 于马甸桥东
        
 
 
 
 
 

转载于:https://www.cnblogs.com/CaiBaoZi/archive/2013/06/09/3129598.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现在线用户统计,可以使用Listener监听器来监控用户的会话(session)状态。具体实现步骤如下: 1. 创建一个实现了HttpSessionListener接口的监听器类,例如OnlineUserListener。 2. 在该类中实现sessionCreated方法和sessionDestroyed方法。 3. 在sessionCreated方法中,获取当前创建的会话(session),并将该会话添加到一个集合中,表示该用户已经在线。 4. 在sessionDestroyed方法中,获取当前销毁的会话(session),并将该会话从集合中移除,表示该用户已经下线。 5. 在web.xml中配置该监听器。 6. 在需要统计在线用户数的地方,可以通过访问OnlineUserListener中的集合来获取在线用户数。 示例代码: // OnlineUserListener.java import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import java.util.ArrayList; import java.util.List; public class OnlineUserListener implements HttpSessionListener { // 存储在线用户的集合 private static List<HttpSession> sessions = new ArrayList<HttpSession>(); // session创建时调用 public void sessionCreated(HttpSessionEvent se) { // 将创建的session添加到集合中 HttpSession session = se.getSession(); sessions.add(session); } // session销毁时调用 public void sessionDestroyed(HttpSessionEvent se) { // 将销毁的session从集合中移除 HttpSession session = se.getSession(); sessions.remove(session); } // 获取在线用户数 public static int getOnlineUserCount() { return sessions.size(); } } // web.xml中配置OnlineUserListener <listener> <listener-class>OnlineUserListener</listener-class> </listener> // 在需要统计在线用户数的地方调用OnlineUserListener.getOnlineUserCount()方法 int onlineUserCount = OnlineUserListener.getOnlineUserCount();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值