文章目錄
- 前言
- 一、 監聽器
-
-
- 1.概念
- 2.作用
- 3.分類
-
-
- 3.1 按監聽對象
- 3.2 按監聽事件
-
- 4.使用
-
- 二、統計網站線上人數示例
-
-
- 1.需求
- 2.示範
- 3.代碼
-
- 其他
-
-
- 最後
- 參考
- 相關
-
前言
在上一篇 Java EE基礎(21):過濾器概念 + 簡單使用(Filter) 中,我們學會了過濾器的簡單使用。
這一篇我們學習監聽器
一、 監聽器
1.概念
Servlet 事件監聽器是一個實作了特定接口的 Java 程式,這個程式專門用于監聽 Web 應用中 ServletContext、HttpSession 和 ServletRequest 等域對象的建立和銷毀過程、監聽這些域對象屬性的修改以及感覺綁定到 HttpSession 域中的某個對象的狀态。
監聽器用于監聽Web項目中的三個對象,分别是:request (ServletRequest)、session(HttpSession)、application(ServletContext)
2.作用
可以監聽到這三個對象的,建立、銷毀、屬性增加、屬性修改、屬性删除等等狀态,然後可以對這些對象的狀态進行響應的處理。即監聽對象狀态發生變化變化時,伺服器會自動調用監聽器對象中的方法。
常用于統計網站線上人數、系統加載時進行資訊初始化、統計網站的通路量等等。
3.分類
類 型 | 描 述 |
---|---|
ServletContextListener | 用于監聽 ServletContext 對象的建立與銷毀過程 |
ServletContextAttributeListener | 用于監聽 ServletContext 對象中的屬性變更 |
HttpSessionListener | 用于監聽 HttpSession 對象的建立和銷毀過程 |
HttpSessionAttributeListener | 用于監聽 HttpSession 對象中的屬性變更 |
ServletRequestListener | 用于監聽 ServletRequest 對象的建立和銷毀過程 |
ServletRequestAttributeListener | 用于監聽 ServletRequest 對象中的屬性變更 |
HttpSessionBindingListener | 用于監聽 JavaBean 對象綁定到 HttpSession 對象和從 HttpSession 對象解綁的事件 |
HttpSessionActivationListener | 用于監聽 HttpSession 中對象活化和鈍化的過程 |
3.1 按監聽對象
按監聽對象不同,主要分為這三個對象:request (ServletRequest)、session(HttpSession)、application(ServletContext)。
- ServletContext:application,整個應用隻存在一個
- HttpSession:session,針對每一個對話
- ServletRequest:request,針對每一個客戶請求
3.2 按監聽事件
按監聽事件的不同,主要分為這三類:
-
用于監聽域對象建立和銷毀的事件監聽器
(ServletContextListener 接口、HttpSessionListener 接口、ServletRequestListener 接口)。
-
用于監聽域對象屬性增加和删除的事件監聽器
(ServletContextAttributeListener 接口、HttpSessionAttributeListener 接口、ServletRequestAttributeListener 接口)。
-
用于監聽綁定到 HttpSession 域中某個對象狀态的事件監聽器
(HttpSessionBindingListener 接口、HttpSessionActivationListener 接口)。
4.使用
- 建立class,實作需要監聽對象的監聽器方法。
- 使用注解(或web.xml)進行配置。
二、統計網站線上人數示例
1.需求
計算現在又多少個使用者正在通路自己網站。
解決:使用監聽器HttpSessionListener。
原理:每當有一個通路連接配接到伺服器時,伺服器就會建立一個session來管理會話。那麼我們就可以通過統計session的數量來獲得目前線上人數。是以這裡用到的是HttpSessionListener。
2.示範
這裡的監聽器,還是使用注解,這樣就不需要再寫web.xml配置了。
注解相關請通路:https://blog.csdn.net/pan_junbiao/article/details/88414912
建立一個Servlet:
建立一個監聽器Listener:
通路
備注:如果出現500錯誤空指針異常,請清除浏覽器緩存資料,重新開機一下伺服器。
3.代碼
Servlet:
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession(); // 建立session對象
ServletContext application = req.getServletContext(); // 擷取application對象
int count = (int) application.getAttribute("count"); // 擷取存放在application中的線上人數
resp.setContentType("text/html;charset=utf-8"); // 響應編格式
resp.getWriter().write("目前網站線上人數為:" + count); // 響應線上人數
}
}
Listener
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener("線上人數監聽器") // 說明這個類是監聽器
public class MyListener implements HttpSessionListener{
int count = 0; // 線上人數
@Override
public void sessionCreated(HttpSessionEvent se) {
// 建立session時線上人數自增
ServletContext application = se.getSession().getServletContext();
count++;
application.setAttribute("count", count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 銷毀session時線上人數自減
ServletContext application = se.getSession().getServletContext();
count--;
application.setAttribute("count", count);
}
}
其他
最後
以上的這些文章就是我Servlet和jsp的所有筆記了,希望對你幫助。
BTW:jstl使用非常簡單,我就不必再出一篇總結了。請參考https://www.runoob.com/jsp/jsp-jstl.html
參考
Servlet事件監聽器是什麼?http://c.biancheng.net/view/4044.html
Java監聽器Listener的使用詳解:https://www.jianshu.com/p/1f83181112de
相關
更多Java EE基礎的 Servlet與JSP相關 請點選:【Servlet + JSP】 目錄