servlet就实如今线用户表

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

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

  既然保存在缓存中,那么在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()方法了;在这里面咱们能够写咱们想写的代码了;session

 

 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中的信息;app

因为application是jsp的内置对象,因此咱们无需获取吗,直接使用就能够了;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

相关文章
相关标签/搜索