Java监听器案例

  • 统计当前在线用户

- 创建监听器类

 1 public class CountNumListener implements HttpSessionListener {
 2     @Override
 3     public void sessionCreated(HttpSessionEvent se) {
 4         //通过事件对象获取ServletContext
 5         ServletContext context = se.getSession().getServletContext();
 6         Integer count = (Integer) context.getAttribute("count");
 7         if (count == null) {
 8             context.setAttribute("count",1);
 9         }
10         count++;
11         context.setAttribute("count",count);
12     }
13 
14     @Override
15     public void sessionDestroyed(HttpSessionEvent se) {
16         ServletContext context = se.getSession().getServletContext();
17         Integer count = (Integer) context.getAttribute("count");
18         count--;
19         context.setAttribute("count",count);
20     }
21 }

- 注册监听器

1 <listener>
2     <listener-class>com.xym.listener.CountNumListener</listener-class>
3 </listener>

- 测试代码

 当前在线人数:${applicationScope.count}人! 

此方式只能统计一个近似值,因为当客户离开网站时,服务器端的Session没有及时销毁,或是客户端同时开两个浏览器窗口访问时都会造成数据的不准确。

  • 自定义Session扫描器
 1 public class SessionScanner implements HttpSessionListener, ServletContextListener {
 2 
 3     // 经常增删应使用链表容器,容器会被并发访问,应使用同步容器
 4     private static List<HttpSession> list = Collections.synchronizedList(new LinkedList<>());
 5     private static final Object lock = new Object();
 6 
 7     @Override
 8     public void sessionCreated(HttpSessionEvent se) {
 9         HttpSession session = se.getSession();
10         System.out.println("Session被创建,ID:" + se.getSession().getId());
11         // 与定时器执行销毁时共享锁 否则会有并发修改异常
12         synchronized (lock) {
13             list.add(session);
14         }
15     }
16 
17     @Override
18     public void sessionDestroyed(HttpSessionEvent se) {
19         System.out.println("Session被销毁,ID:" + se.getSession().getId());
20     }
21 
22     @Override
23     public void contextInitialized(ServletContextEvent sce) {
24         // 服务器启动时创建一个定时器 每30秒执行任务
25         Timer timer = new Timer();
26         timer.schedule(new MyTask(),0,30*1000);
27     }
28 
29     @Override
30     public void contextDestroyed(ServletContextEvent sce) {
31 
32     }
33 
34     static class MyTask extends TimerTask{
35 
36         @Override
37         public void run() {
38             System.out.println("定时器执行!");
39             synchronized (lock) {
40                 // 应获取可迭代修改的迭代器,用迭代器的方法移除容器内的Session
41                 ListIterator<HttpSession> iterator = list.listIterator();
42                 while (iterator.hasNext()) {
43                     HttpSession session = iterator.next();
44                     // 如果Session无活跃时长大于30秒 则摧毁
45                     if (System.currentTimeMillis() - session.getLastAccessedTime() > 30 * 1000) {
46                         session.invalidate();
47                         iterator.remove();
48                     }
49                 }
50             }
51         }
52     }
53 }

同时实现两个监听器,在服务器启动时会创建定时器,在创建Session时会加入自定义的容器内自行管理,不再由服务器管理。

此Session扫描器启动的时间跟Session创建的时间会有30秒的时间差

转载于:https://www.cnblogs.com/aikf/p/10118716.html

### 回答1: Java监听器(Listener)是一种常用的 Java 设计模式,通常用于在某些特定事件发生时执行特定的操作。 下面是一个 Java 监听器的简单案例: ```java import java.util.EventListener; // 定义一个事件监听器接口 public interface ButtonClickListener extends EventListener { void buttonClicked(); } // 定义一个按钮类,它会在被点击时触发事件 public class Button { private ButtonClickListener listener; public void setButtonClickListener(ButtonClickListener listener) { this.listener = listener; } public void click() { // 当按钮被点击时,调用 listener 的 buttonClicked 方法 if (listener != null) { listener.buttonClicked(); } } } // 定义一个具体的事件监听器,它实现了 ButtonClickListener 接口 public class ButtonClickHandler implements ButtonClickListener { public void buttonClicked() { // 在按钮被点击时执行的操作 System.out.println("Button clicked!"); } } // 使用 Button 类和 ButtonClickHandler 类 public class Main { public static void main(String[] args) { Button button = new Button(); ButtonClickHandler handler = new ButtonClickHandler(); // 设置按钮的监听器为 handler button.setButtonClickListener(handler); // 点击按钮,会触发 buttonClicked 事件 button.click(); } } ``` 在这个案例中,ButtonClickListener 接口定义了一个 buttonClicked 方法,表示当按钮被点击时执行的操作。Button 类定义了一个 listener 字段,用于保存当前设置的监听器。当调用 Button 类的 click 方法时,会调用 listener 的 buttonClicked 方法 ### 回答2: 以下是一个简单的Java监听器案例: ```java import java.util.ArrayList; import java.util.List; // 创建事件 class Event { private String name; public Event(String name) { this.name = name; } public String getName() { return name; } } // 定义监听器接口 interface EventListener { void onEvent(Event event); } // 创建事件源 class EventSource { private List<EventListener> listeners = new ArrayList<>(); // 注册监听器 public void registerListener(EventListener listener) { listeners.add(listener); } // 触发事件 public void fireEvent(Event event) { for (EventListener listener : listeners) { listener.onEvent(event); } } } // 实现监听器接口,定义监听器的行为 class ExampleListener implements EventListener { @Override public void onEvent(Event event) { System.out.println("收到事件:" + event.getName()); } } public class Main { public static void main(String[] args) { // 创建事件源 EventSource eventSource = new EventSource(); // 创建监听器 ExampleListener listener1 = new ExampleListener(); ExampleListener listener2 = new ExampleListener(); // 注册监听器 eventSource.registerListener(listener1); eventSource.registerListener(listener2); // 触发事件 eventSource.fireEvent(new Event("事件1")); eventSource.fireEvent(new Event("事件2")); } } ``` 以上代码创建了一个简单的事件监听器案例,包括了事件、事件监听器和事件源。事件监听器实现了一个`onEvent`方法,用于处理接收到的事件。事件源注册了监听器,并在触发事件时通知所有注册的监听器。在`Main`类中,创建了一个事件源和两个监听器,并进行了注册和事件触发的操作。当事件触发时,监听器的`onEvent`方法会被调用,并打印接收到的事件名称。 ### 回答3: 当然!下面是一个简单的Java监听器案例: 首先,需要创建一个事件类,例如名为"ButtonClickEvent"的类。该类用于定义按钮点击事件的相关信息,例如按钮的标识符。 ``` public class ButtonClickEvent { private String buttonId; public ButtonClickEvent(String buttonId) { this.buttonId = buttonId; } public String getButtonId() { return buttonId; } } ``` 接下来,创建一个监听器接口"ButtonClickListener",该接口定义了监听器的回调方法"onButtonClick"。 ``` public interface ButtonClickListener { void onButtonClick(ButtonClickEvent event); } ``` 然后,创建一个触发事件的类,例如名为"Button"的类。该类包含一个监听器列表,以及相关的方法用于添加、删除和触发监听器。 ``` public class Button { private List<ButtonClickListener> listeners = new ArrayList<>(); public void addButtonClickListener(ButtonClickListener listener) { listeners.add(listener); } public void removeButtonClickListener(ButtonClickListener listener) { listeners.remove(listener); } public void click(String buttonId) { ButtonClickEvent event = new ButtonClickEvent(buttonId); for (ButtonClickListener listener : listeners) { listener.onButtonClick(event); } } } ``` 最后,在使用监听器的地方创建一个监听器实现类,例如名为"LogButtonClickListener"的类。该类实现了监听器接口的回调方法,可以在按钮点击时进行一些操作,例如打印日志。 ``` public class LogButtonClickListener implements ButtonClickListener { @Override public void onButtonClick(ButtonClickEvent event) { System.out.println("按钮点击事件 - 按钮标识符:" + event.getButtonId()); } } ``` 在主程序中,可以进行如下使用: ``` public class Main { public static void main(String[] args) { Button button = new Button(); ButtonClickListener listener = new LogButtonClickListener(); button.addButtonClickListener(listener); button.click("Button 1"); button.click("Button 2"); button.removeButtonClickListener(listener); button.click("Button 3"); } } ``` 上述程序会输出如下日志: ``` 按钮点击事件 - 按钮标识符:Button 1 按钮点击事件 - 按钮标识符:Button 2 ``` 这就是一个简单的Java监听器案例监听器模式可以用于很多场景,例如按钮点击、鼠标点击等等,通过监听器可以对事件进行处理,实现更加灵活的编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值