zoukankan      html  css  js  c++  java
  • servlet就实现在线用户表

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

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

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

      

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

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

    1.用户到达

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

     1 public void sessionCreated(HttpSessionEvent arg0)  {
     2 
     3          // TODO Auto-generated method stub
     4 
     5    HttpSession session=arg0.getSession();
     6 
     7      session.setMaxInactiveInterval(1*60);//为方便看到session失效的结果,设置 session过期时间为60秒,默认情况为30分钟
     8 
     9      Visitor v=new Visitor(); //新建一个访客对象,保存游客信息
    10 
    11      v.setIp(request.getRemoteAddr());//获取访客IP
    12 
    13      v.setComeFrom(request.getHeader("Referer"));//获取访客来的URL
    14 
    15      v.setVisitTime(new Date());//记录访客访问时间
    16 
    17      ServletContext application= arg0.getSession().getServletContext();//获得 application
    18 
    19      @SuppressWarnings("unchecked")
    20 
    21    HashMap<String,Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");//将在线用户表从application中取出
    22 
    23      onlinMap.put(session.getId(), v);//将新到的访客信息放入在线用户表中
    24 
    25      application.setAttribute("online", onlinMap);//将更新后的在线用户表存入 application中
    26 
    27     }

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

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

     1 <table>
     2 
     3 <!-- 表头-->
     4 
     5     <tr>
     6 
     7      <th>用户名</th>
     8 
     9         <th>访问时间</th>
    10 
    11         <th>用户IP</th>
    12 
    13         <th>来自页面</th>
    14 
    15     </tr>
    16 
    17 <%
    18 
    19     @SuppressWarnings("unchecked")
    20 
    21    HashMap<String, Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");//取出在线用户表
    22 
    23     Set<String> key=onlinMap.keySet();//取出在线用户表的键集合
    24 
    25     Iterator<String> it=key.iterator();//将键集合中的键一一取出放入Iterator对象中
    26 
    27     while(it.hasNext()) //通过遍历在线用户表中所有的键来一一打出在线用户表
    28 
    29     {
    30 
    31      String id=it.next();
    32 
    33      Visitor v=onlinMap.get(id);
    34 
    35 %>
    36 
    37  <tr>
    38 
    39      <td><%=v.getId() %></td>
    40 
    41         <td><%=v.getVisitTime() %></td>
    42 
    43         <td><%=v.getIp() %></td>
    44 
    45         <td><%=v.getComeFrom() %></td>
    46 
    47     </tr>
    48 
    49 <%
    50 
    51     }
    52 
    53 %>    
    54 
    55 </table>
    56 
    57  

    2.用户离开

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

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

     1  public void sessionDestroyed(HttpSessionEvent arg0)  {
     2 
     3          // TODO Auto-generated method stub
     4 
     5      ServletContext application= arg0.getSession().getServletContext();
     6 
     7      @SuppressWarnings("unchecked")
     8 
     9    HashMap<String, Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");
    10 
    11    String id=arg0.getSession().getId(); //获得失效session的id                                              
    12 
    13      Visitor v=onlinMap.get(id);
    14 
    15      v.setLeftTime(new Date());//记录session失效(用户离开)的时间
    16 
    17      onlinMap.remove(id);//从在线用户表中移除离开的用户
    18 
    19      //由于复合类型用“=”赋值是通过改变指针实现的,所以后面更改的map其实是直接更改了application里面原本存的map,所以就不需要application.setAttribute("online", onlinMap);这条语句了
    20 
    21     }
    22 
    23  

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

    补充:

      1.Visitor实体类

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

      2.关于request的获取

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

  • 相关阅读:
    sqlhelper使用指南
    大三学长带我学习JAVA。作业1. 第1讲.Java.SE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行 大三学长带我学习JAVA。作业1.
    pku1201 Intervals
    hdu 1364 king
    pku 3268 Silver Cow Party
    pku 3169 Layout
    hdu 2680 Choose the best route
    hdu 2983
    pku 1716 Integer Intervals
    pku 2387 Til the Cows Come Home
  • 原文地址:https://www.cnblogs.com/Li-Wei/p/5487043.html
Copyright © 2011-2022 走看看