(22)监听器概念 + 简单使用(listener)

(22)监听器概念 + 简单使用(listener)

前言

在上一篇 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