• 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

  • 相关阅读:
    MVC4中Ajax.BeginForm OnSuccess 不执行以及控制器返回JsonResult 提示下载的原因
    string.Equals 比较2个字符串是否相同忽略大小写
    [转载]mvc使用JsonResult返回Json数据
    [转载]深入理解ASP.NET MVC之ActionResult
    [转载]自定义ASP.NET MVC Html辅助方法 TagBuilder
    [转载]AOP面向方面编程
    [转载]ASP.NET MVC 3的分部视图
    适配 iOS尺寸
    IOS Bug分析
    苹果一些乱七八糟流程整理
  • 原文地址:https://www.cnblogs.com/Li-Wei/p/5487043.html
Copyright © 2020-2023  润新知