web 監聽器是Servlet 中一種的特殊的類,能幫助開發者監聽 web 中的特定事件, 好比 ServletContext,HttpSession,ServletRequest 的建立和銷燬;變量的建立、銷燬和修改等。 能夠在某些動做先後增長處理,實現監控。例如能夠用來統計在線人數等。html
監聽器有三類8種:java
⑴ 監聽生命週期:web
ServletRequestListenersession
HttpSessionListener app
ServletContextListeneride
⑵ 監聽值的變化:測試
ServletRequestAttributeListener.net
HttpSessionAttributeListenercode
ServletContextAttributeListener htm
⑶ 針對 session 中的對象:
監聽 session 中的 java 對象(javaBean) ,是 javaBean 直接實現監聽器 的接口。
作一個對在線人數的監控。
實現步驟:
Step1:建立一個監聽器,須要實現某種接口,根據需求選取 HttpSessionListener
Step2:經過@WebListener註解配置該監聽器
建立一個類,並實現 HttpSessionListener 接口,用來檢測 Session 的建立和銷燬。
1.在類中定義一個成員變量用來存儲當前的 session 個數。(OnlineListener.java)
/** * 在線人數統計 * 當有新的session對象被建立,則在線人數+1; * 有session對象被銷燬,在線人數-1; * @author Lisa Li * */ @WebListener public class OnlineListener implements HttpSessionListener { // 默認在線人數 private Integer onlineNumber = 0; /** * 當有新的session對象被建立,則在線人數+1; */ @Override public void sessionCreated(HttpSessionEvent se) { // 人數+1 onlineNumber++; // 將人數存到session做用域中 // se.getSession().setAttribute("onlineNumber", onlineNumber); // 將人數存到application做用域中 se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber); } /** * 有session對象被銷燬,在線人數-1; */ @Override public void sessionDestroyed(HttpSessionEvent se) { // 人數-1 onlineNumber--; // 將人數存到session做用域中 // se.getSession().setAttribute("onlineNumber", onlineNumber); // 將人數存到application做用域中 se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber); } }
2.作一個測試的 Servlet 用來登陸,和顯示當前在線人數。(OnlineServlet.java)
/** * 在線人數統計 */ public class OnlineServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲得參數 String key = request.getParameter("key"); // 判斷是否爲空 (不爲空,且值爲logout則爲退出操做) if (key != null && "logout".equals(key)) { // 傳遞了參數,表示要作用戶退出操做 request.getSession().invalidate(); return; } // 建立session對象 HttpSession session = request.getSession(); // 獲取sessio做用域中的在線人數 Integer onlineNumber = (Integer) session.getServletContext().getAttribute("onlineNumber"); // 輸出 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h2>在線人數:"+onlineNumber+"</h2><h4><a href='online?key=logout'>退出</a><h4>"); } }