在学习servlet的过程中,学习了如何用servlet实现在线用户表。

  只有服务器处于开机状态才会有在线用户表的存在,在服务器关机的情况下自然就不存在在线用户表的说法;所以,楼主认为在线用户表的信息肯定是不用进行持久化处理的,直接保存在服务器的缓存就好了。

  既然保存在缓存中,那么在java web中共有四个作用域,让我们用来存东西:pageContext, request, session,application;既然我们的在线用户表示给大家看的,那自然是应该存在大家都能看到的作用域application中了,所以在服务器开机的时候就应该有一个在线用户表存在application中了,之后都是对这个表的修改。

  

 public void contextInitialized(ServletContextEvent arg0)  {
// TODO Auto-generated method stub
HashMap<String, Visitor> onlineMap=new HashMap<String, Visitor>();//建立在线用户表
ServletContext application= arg0.getServletContext();//获取application
application.setAttribute("online", onlineMap);//将在线用户表存入application
}

  明确了这个东西,就可以按照用户到达网站之后的一系列流程来考虑了。首先用户到达网站,服务器后台处理;接着来前台就可以在“在线用户表”上看到新增了一个在线用户;再接着就是用户离开了,服务器后台处理;最后前台就可以看到“在线用户表”上减少了一个在线用户。这么做到了,也就是实现了在线用户表了。基本流程有了,接下来就是分析实现了:

1.用户到达

(1)根据以上的分析,用户到达了我们必须把用户的相关信息存入application中以方便使用;那么怎么判断用户到了呢?用户既然进了网站,那服务器肯定会分配给他一个session的空间,知道了这点就好办了;我们可以建一个session的listener来监听session的创建也就是 sessionCreated()方法了;在这里面我们可以写我们想写的代码了;

 public void sessionCreated(HttpSessionEvent arg0)  {

          // TODO Auto-generated method stub

    HttpSession session=arg0.getSession();

      session.setMaxInactiveInterval(1*60);//为方便看到session失效的结果,设置 session过期时间为60秒,默认情况为30分钟

      Visitor v=new Visitor(); //新建一个访客对象,保存游客信息

      v.setIp(request.getRemoteAddr());//获取访客IP

      v.setComeFrom(request.getHeader("Referer"));//获取访客来的URL

      v.setVisitTime(new Date());//记录访客访问时间

      ServletContext application= arg0.getSession().getServletContext();//获得 application

      @SuppressWarnings("unchecked")

    HashMap<String,Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");//将在线用户表从application中取出

      onlinMap.put(session.getId(), v);//将新到的访客信息放入在线用户表中

      application.setAttribute("online", onlinMap);//将更新后的在线用户表存入 application中

     }

(2)前台还要能够读取到application中的信息;

由于application是jsp的内置对象,所以我们无需获取吗,直接使用就可以了;

 <table>

 <!-- 表头-->

     <tr>

      <th>用户名</th>

         <th>访问时间</th>

         <th>用户IP</th>

         <th>来自页面</th>

     </tr>

 <%

     @SuppressWarnings("unchecked")

    HashMap<String, Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");//取出在线用户表

     Set<String> key=onlinMap.keySet();//取出在线用户表的键集合

     Iterator<String> it=key.iterator();//将键集合中的键一一取出放入Iterator对象中

     while(it.hasNext()) //通过遍历在线用户表中所有的键来一一打出在线用户表

     {

      String id=it.next();

      Visitor v=onlinMap.get(id);

 %>

  <tr>

      <td><%=v.getId() %></td>

         <td><%=v.getVisitTime() %></td>

         <td><%=v.getIp() %></td>

         <td><%=v.getComeFrom() %></td>

     </tr>

 <%

     }

 %>    

 </table>

2.用户离开

(1)我们必须得把用户的信息从application中移除

一般我们无法判断用户离开的准确时间,但是我们知道只要session过期了,用户就一定离开了,所以我们可以利用session的listener来监听session的过期,也就是 sessionDestroyed()方法。

  public void sessionDestroyed(HttpSessionEvent arg0)  {

          // TODO Auto-generated method stub

      ServletContext application= arg0.getSession().getServletContext();

      @SuppressWarnings("unchecked")

    HashMap<String, Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");

    String id=arg0.getSession().getId(); //获得失效session的id                                              

      Visitor v=onlinMap.get(id);

      v.setLeftTime(new Date());//记录session失效(用户离开)的时间

      onlinMap.remove(id);//从在线用户表中移除离开的用户

      //由于复合类型用“=”赋值是通过改变指针实现的,所以后面更改的map其实是直接更改了application里面原本存的map,所以就不需要application.setAttribute("online", onlinMap);这条语句了

     }

  就这样用servlet就实现在线用户表了。

补充:

  1.Visitor实体类

    Visitor实体类根据数据库中Visitor表建就好了,就是一个javaBean;

  2.关于request的获取

    可以建一个request的监听器通过request=(HttpServletRequest) arg0.getServletRequest();来获得request;如果你想全  局使用,只需要将request定义为类的属性就好了,但是要注意request是HttpServletRequest类的实例化不是ServletRequest;

servlet就实现在线用户表的更多相关文章

  1. Servlet监听器及在线用户

    Servlet中的监听器分为三种类型Ⅰ 监听ServletContext.Request.Session作用域的创建和销毁 (1)ServletContextListener (2)HttpSessi ...

  2. 第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表

    第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表.验证码表.轮播图表 创建Django项目 项目 settings.py ...

  3. mysql在线修改表结构大数据表的风险与解决办法归纳

    整理这篇文章的缘由: 互联网应用会频繁加功能,修改需求.那么表结构也会经常修改,加字段,加索引.在线直接在生产环境的表中修改表结构,对用户使用网站是有影响. 以前我一直为这个问题头痛.当然那个时候不需 ...

  4. 使用Servlet和jdbc创建用户登录验证

    首先创建一个用户表,用来保存用户名 密码,并插入几条数据 mysql> desc user;+----------+-------------+------+-----+---------+-- ...

  5. 基于Redis的在线用户列表解决方案

    前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案可以采用SessionListener来完成 ...

  6. [项目回顾]基于Redis的在线用户列表解决方案

    迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...

  7. 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)(转)

    1.写在前面 1.1.引言 如果在没有太多经验可借鉴的情况下,要设计一套完整可用的移动端IM架构,难度是相当大的.原因在于,IM系统(尤其是移动端IM系统)是多种技术和领域知识的横向应用综合体:网络编 ...

  8. MySQL在线大表DDL操作

    在线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 b.500\502错误异常捕捉 c.检查备库的second behind master是否 ...

  9. MySQL在线大表DDL操作 (转)

    http://www.cnblogs.com/janehoo/p/5382474.html 线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 ...

随机推荐

  1. Jquery EasyUI tabs处理

    一 获取选中的 Tab 1.   // 获取选中的 tab panel 和它的 tab 对象 2.  var pp = $('#tt').tabs('getSelected'); 3.  var ta ...

  2. DAS,NAS,SAN在数据库存储上的应用

    DAS,NAS,SAN在数据库存储上的应用 一. 硬盘接口类型1. 并行接口还是串行接口(1) 并行接口,指的是并行传输的接口,比如有0~9十个数字,用10条传输线,那么每根线只需要传输一位数字,即可 ...

  3. 对象转Json序列化

    C#--对象转Json序列化 前言 最近在研究Android项目,其中涉及到Android中解析Json数据的问题,需要模拟网络中传递Json数据的模式,因为以前是.net的工程师,所以想着从.net ...

  4. 机器学习的Spark与Scala开发简介

     一.机器学习常用开发软件:Spark.Scala 1. Spark简介: MLlib包含的库文件有: 分类 降维 回归 聚类 推荐系统 自然语言处理 在线学习 统计学习方法:偏向理论性,数理统计的方 ...

  5. 方法输出C++输出斐波那契数列的几种方法

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, ...

  6. [ios2]ios系统中各种设置项的url链接

    在代码中调用如下代码:(ps: ios 5.0 以后不可用)NSURL*url=[NSURL URLWithString:@"prefs:root=WIFI"];[[UIAppli ...

  7. Ueditor1.4.3实现跨域上传到独立文件服务器,完美解决单文件和多文件上传!

    再写配置方法之前先吐槽一下网上的各种教程,TM没一个有卵用,一群傻屌不会写就别写,写了就要负责. 百度google搜了半天,全是配置什么document.domain,根域名什么的,我只想对你说: 好 ...

  8. HDU 1272 小希的迷宫(乱搞||并查集)

    小希的迷宫 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有 ...

  9. [转载]We Recommend a Singular Value Decomposition

    原文:http://www.ams.org/samplings/feature-column/fcarc-svd Introduction The topic of this article, the ...

  10. hibernate事务控制

    在使用ssh中将事务委托给spring时老是出现事务不可用 经过检查,原因如下: 是因为在hibernate.cfg.xml文件中忘记进行了如下设置: hibernate.current_sessio ...