一、什么是监听器
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控
监听器包括三部分:事件、事件源和事件监听器
事件,发生事件的组件,也就是被监听的对象
事件源,生成事件的对象,事件源提供了用于为事件注册监听器的方法
事件监听器,监听并负责处理事件的方法
二、监听器实现原理
接下来的代码演示中:
事件Event,事件源People,事件监听器MyListener
public class Event {
private People people;
public People getPeople() {
return people;
}
public void setPeople(People people) {
this.people = people;
}
public Event(People people) {
this.people = people;
}
}
public class People {
String name;
MyListener myListener;
public void eat(){
System.out.println("吃饭");
myListener.doEat(new Event(this));
}
public void sleep(){
System.out.println("睡觉");
myListener.doSleep(new Event(this));
}
public People(String name, MyListener myListener) {
this.name = name;
this.myListener = myListener;
}
public People(String name) {
this.name = name;
}
public void registerMyListener(MyListener myListener){
this.myListener = myListener;
}
}
public interface MyListener {
void doEat(Event event);
void doSleep(Event event);
}
使用监听器,这里在两个people中实现了不同的监听器去做指定的事情
public class Main {
public static void main(String[] arg){
People people = new People("小红");
people.registerMyListener(new MyListener() {
@Override
public void doEat(Event event) {
System.out.println("不让"+event.getPeople().name+"吃饭");
}
@Override
public void doSleep(Event event) {
System.out.println("不让"+event.getPeople().name+"睡觉");
}
});
people.eat();
people.sleep();
People p = new People("大黄");
p.registerMyListener(new MyListener() {
@Override
public void doEat(Event event) {
System.out.println("让"+event.getPeople().name+"吃饭");
}
@Override
public void doSleep(Event event) {
System.out.println("让"+event.getPeople().name+"睡觉");
}
});
p.eat();
p.sleep();
}
}
运行结果如下
在实际的开发中 监听器的三部分都不需要我们自己去写 我们只是会实现监听器提供的接口,然后注册监听器,程序运行后,监听器就会在指定事件发生时进行相应处理。具体使用看下面
三、监听器常用的用途
通常使用Web监听器做以下的内容:
统计在线人数,利用HttpSessionLisener
加载初始化信息:利用ServletContextListener
统计网站访问量、实现访问监控等
在springboot项目中简单实现统计在线人数的监听器如下:
浏览器首次访问服务会创建session来存放用户相关信息(会在用户退出登录时销毁session 或者设置session过期时间来控制其失效),我们就监听session的创建来实现对在线人数的统计
1.实现监听器
public class TestListener implements HttpSessionListener {
//HttpSessionListener提供了对session创建和销毁进行监听后的处理的监听器 我们只需要实现这两个方法
private int userNumber = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
userNumber++;
se.getSession().setAttribute("userNumber", userNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
userNumber--;
se.getSession().setAttribute("userNumber", userNumber);
}
}
2.注册监听器
//注册监听器
@Configuration
public class ListenerBeanConfig {
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();
bean.setListener(new TestListener());
return bean;
}
}
3.使用监听器
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String getResult() {
return "在线用户人数:"+SessionUtils.getSessionAttribute("userNumber");
}
}
4.启动项目,访问接口检查运行结果
第一次 访问浏览器 在线人数为1
换另外一个浏览器访问 在线人数为2
这里我们只是测试了对session创建时的监控
监听器的分类和其他具体使用后续再继续学习