在學習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的空間,知道了這點就好辦了;咱們能夠建一個session的listener來監聽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過時了,用戶就必定離開了,因此咱們能夠利用session的listener來監聽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;