http:%2F%2Fwww.clipartpanda.com%2Fcategories%2Flistener-20clipart
(圖片來源: http://www.clipartpanda.com/categories/listener-20clipart)

Servlet提供很多類型的傾聽器(Listener),


像是針對ServletContext有ServletContextListener、ServletContextAttributeListener等
分別用來傾聽ServletContext的創建/銷毀動作,以及當ServletContext的屬性有所變更時,抓取此動作以做相對應的處理
同樣地針對HttpSession跟HttpSevletRequest也都有提供相對應的Listener

這邊要筆記一個使用SessionListener來實現統計系統目前上線人數的功能,
首先,我們先實做一個SessionListener:

package bookprac.servlet.sessionlistenerdemo;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 *
 * @author allen0818
 */
@WebListener
public class OnlineUserCounter implements HttpSessionListener {
  private static int onlineUser;
  
  public static int GetOnlineUser() {
    return onlineUser;
  }
  
  @Override
  public void sessionCreated(HttpSessionEvent se) {
    onlineUser++;
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    onlineUser--;
  }
}

這邊有幾個需要注意的地方:
1. 必須在類別前標註 @WebListener 讓Web容器認得並將其註冊給應用程式(或是在web.xml中設定屬性)
2. 記得實作特定類型的Listener介面,這邊以HttpSessionListener為例
這邊可以看到,我們藉由一個靜態變數來存放目前系統上存在的session數量

接下來我們來實作使用者登入後的歡迎頁面,在這個頁面中同時會顯示目前系統的上線人數
以下只列出重要的程式碼片段

@WebServlet(name = "WelcomeServlet", urlPatterns = {"/welcome.view"})
public class WelcomeServlet extends HttpServlet {

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
      /* TODO output your page here. You may use following sample code. */
      out.println("<!DOCTYPE html>");
      out.println("<html>");
      out.println("<head>");
      out.println("<title>歡迎</title>");      
      out.println("</head>");
      out.println("<body>");
      out.println("<h1>目前線上人數: " + OnlineUserCounter.GetOnlineUser() + " 人</h1>");
      
      HttpSession session = request.getSession(false);
      if(session != null) {
        String user = (String) session.getAttribute("user");
        out.println("<h1>歡迎: " + user + "</h1>");
        out.println("<a href='logout.do'>登出</a>");
      }
      
      out.println("</body>");
      out.println("</html>");
    }
  }

由於當使用者關閉瀏覽器,存放該使用者登入資訊的Session也會自動銷毀
因此可以透過SessionListener中所記錄的onlineUser變數值來得知系統目前的上線人數

 

參考資料:
1. 「Servlet&JSP教學手冊 第二版」

 

arrow
arrow
    文章標籤
    JSP Servlet SessionListener
    全站熱搜
    創作者介紹
    創作者 allen0818 的頭像
    allen0818

    allen0818 的部落格

    allen0818 發表在 痞客邦 留言(0) 人氣()