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

相關文章
相關標籤/搜索