天天看點

Java EE基礎(22):監聽器概念 + 簡單使用(listener)前言一、 監聽器二、統計網站線上人數示例其他

文章目錄

  • 前言
  • 一、 監聽器
      • 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:

Java EE基礎(22):監聽器概念 + 簡單使用(listener)前言一、 監聽器二、統計網站線上人數示例其他

建立一個監聽器Listener:

Java EE基礎(22):監聽器概念 + 簡單使用(listener)前言一、 監聽器二、統計網站線上人數示例其他

通路

Java EE基礎(22):監聽器概念 + 簡單使用(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】 目錄