(圖片來源: 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教學手冊 第二版」