Jsp統計線上人數和線上註冊人數

Mindy_Lou發表於2016-08-28
一、統計線上人數
1.監聽器
Java程式碼  收藏程式碼
  1. package com.logcd.listener;  
  2.   
  3. import javax.servlet.ServletContext;   
  4. import javax.servlet.http.HttpSessionEvent;   
  5. import javax.servlet.http.HttpSessionListener;   
  6.   
  7. public class SessionCounter implements HttpSessionListener {   
  8.     public void sessionCreated(HttpSessionEvent event) {   
  9.         ServletContext ctx = event.getSession( ).getServletContext( );   
  10.         Integer numSessions = (Integer) ctx.getAttribute("numSessions");   
  11.         if (numSessions == null) {   
  12.             numSessions = new Integer(1);   
  13.         }else {   
  14.             int count = numSessions.intValue( );   
  15.             numSessions = new Integer(count + 1);   
  16.         }   
  17.         ctx.setAttribute("numSessions", numSessions);   
  18.     }   
  19.     public void sessionDestroyed(HttpSessionEvent event) {   
  20.         ServletContext ctx = event.getSession( ).getServletContext( );   
  21.         Integer numSessions = (Integer) ctx.getAttribute("numSessions");   
  22.         if (numSessions == null) {   
  23.             numSessions = new Integer(0);   
  24.         }   
  25.         else {   
  26.             int count = numSessions.intValue( );   
  27.             numSessions = new Integer(count - 1);   
  28.         }   
  29.         ctx.setAttribute("numSessions", numSessions);   
  30.     }   
  31. }   

說明:實現了HttpSessionListener定義的兩個方法:sessionCreated()和sessionDestroyed()。這兩個方法可以監聽到當前應用中session的建立和銷燬情況。
以下兩種情況下就會發生sessionDestoryed(會話銷燬)事件:
(1)執行session.invalidate()方法時。
(2)如果使用者長時間沒有訪問伺服器,超過了會話最大超時時間,伺服器就會自動銷燬超時的session。
Xml程式碼  收藏程式碼
  1. <session-config>  
  2.     <session-timeout>1</session-timeout>  
  3. </session-config>  
時間單位是一分鐘,並且只能是整數,如果是零或負數,那麼會話就永遠不會超時。
2.web.xml中配置
Xml程式碼  收藏程式碼
  1. <listener>   
  2.      <listener-class>com.logcd.listener.SessionCounter</listener-class>   
  3. </listener>   

3.jsp呼叫
Html程式碼  收藏程式碼
  1. 目前共有<span class="salient"> <%=application.getAttribute("numSessions")%> </span>人線上  

二、統計註冊人數
1.監聽器
Java程式碼  收藏程式碼
  1. package com.logcd.listener;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.ServletContext;  
  7. import javax.servlet.http.HttpSession;  
  8. import javax.servlet.http.HttpSessionBindingEvent;  
  9. import javax.servlet.http.HttpSessionBindingListener;  
  10.   
  11. public class OnlineUserBindingListener implements HttpSessionBindingListener{  
  12.   
  13.     private String userId;  
  14.     private String userName;  
  15.       
  16.     public OnlineUserBindingListener(String userId,String username){  
  17.         this.setUserId(userId);  
  18.         this.setUserName(userName);  
  19.     }  
  20.       
  21.     @SuppressWarnings("unchecked")  
  22.     public void valueBound(HttpSessionBindingEvent event) {  
  23.         HttpSession session = event.getSession();  
  24.         ServletContext application = session.getServletContext();  
  25.   
  26.         // 把使用者放入線上列表  
  27.         Map onlineUserList = (Map) application.getAttribute("onlineUserList");  
  28.         // 第一次使用前,需要初始化  
  29.         if (onlineUserList == null) {  
  30.             onlineUserList = new HashMap();  
  31.             application.setAttribute("onlineUserList", onlineUserList);  
  32.         }  
  33.         onlineUserList.put(this.userId, this.userName);  
  34.           
  35.     }  
  36.   
  37.     public void valueUnbound(HttpSessionBindingEvent event) {  
  38.         HttpSession session = event.getSession();  
  39.         ServletContext application = session.getServletContext();  
  40.   
  41.         // 從線上列表中刪除使用者  
  42.         Map onlineUserList = (Map) application.getAttribute("onlineUserList");  
  43.         onlineUserList.remove(this.userId);  
  44.           
  45.     }  
  46.   
  47.   
  48.     public String getUserId() {  
  49.         return userId;  
  50.     }  
  51.   
  52.     public void setUserId(String userId) {  
  53.         this.userId = userId;  
  54.     }  
  55.   
  56.     public String getUserName() {  
  57.         return userName;  
  58.     }  
  59.   
  60.     public void setUserName(String userName) {  
  61.         this.userName = userName;  
  62.     }  
  63.   
  64. }  

說明:實現了HttpSessionBindingListener介面,介面中共定義了兩個方法:valueBound()和valueUnbound(),分別對應資料繫結,和取消繫結兩個事件。
所謂對session進行資料繫結,就是呼叫session.setAttribute()把HttpSessionBindingListener儲存進session中。
HttpSessionListener只需要設定到web.xml中就可以監聽整個應用中的所有session。HttpSessionBindingListener必須例項化後放入某一個session中,才可以進行監聽。

從監聽範圍上比較,HttpSessionListener設定一次就可以監聽所有session,HttpSessionBindingListener通常都是一對一的。

valueUnbound的觸發條件是以下三種情況:
(1)執行session.invalidate()時。
(2)session超時,自動銷燬時。
(3)執行session.setAttribute("onlineUserListener", "其他物件");或session.removeAttribute("onlineUserListener");將listener從session中刪除時。
因此,只要不將listener從session中刪除,就可以監聽到session的銷燬。

2.jsp呼叫
(1)login.jsp
Java程式碼  收藏程式碼
  1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
  2. <%@ page import="com.logcd.listener.OnlineUserBindingListener"%>  
  3. <%  
  4.     String path = request.getContextPath();  
  5.     String basePath = request.getScheme() + "://"  
  6.             + request.getServerName() + ":" + request.getServerPort()  
  7.             + path + "/";  
  8.     String userId = "2000090603";  
  9.     String userName = "LogCN";  
  10.     session.setAttribute(userId,userName);  
  11.     session.setAttribute("onlineUserBindingListener"new OnlineUserBindingListener(userId,userName));  
  12.     response.sendRedirect("counter.jsp");  
  13. %>  

(2)counter.jsp
Java程式碼  收藏程式碼
  1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
  2. 註冊使用者<span class="salient"><%=((Map)application.getAttribute("onlineUserList")).size()%> </span> 人  

三、RequestDispatcher
     RequestDispatcher是一個Web資源的包裝器,可以用來把當前request傳遞到該資源,或者把新的資源包括到當前響應中。RequestDispatcher介面中定義了兩個方法:include/forward。
      由於<jsp:include>只能指定固定的jsp檔名,不能動態指定jsp檔名。需要把<jsp:include>翻譯為Java code – RequestDispatcher.include();
用法:
<% request.getRequestDispatcher(filename).include(request, response); />
     RequestDispatcher.forward()方法將當前的request和response重定向到該RequestDispacher指定的資源。只有在尚未向客戶端輸出響應時才可以呼叫forward()方法,如果頁面快取不為空,在重定向前將自動清除快取。否則將丟擲一個IllegalStateException異常。
      JSP中的三種頁面跳轉方式:
1. response.sendRedirect();
2. response.setHeader("location","");
3. <jsp:forward page="" />

相關文章