博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
listener:监听器(加载框架配置文件/执行任务调度/session的优化)
阅读量:5066 次
发布时间:2019-06-12

本文共 5851 字,大约阅读时间需要 19 分钟。

所谓监听器就是一个java类,用来监听其他java类的状态变化。

监听器的术语: 

  事件源:指被监听的对象(汽车)

  监听器:监听的对象(报警器)
  事件源与监听器的绑定:(就是在汽车上安装报警器)
  事件:事件源的改变(踹汽车一脚)--事件是用来获得事件源的。

监听器的用途: 

  一:用来监听其他对象的状态变化;

  二:主要应用在图形化界面中比较多;
    GUI、Android

1 package test; 2 import java.awt.event.WindowEvent; 3 import java.awt.event.WindowListener; 4 import javax.swing.JFrame; 5 public class MyFrame extends JFrame { 6     public static void main(String[] args) { 7         //创建一个窗口对象(事件源) 8         MyFrame mf = new MyFrame(); 9         //设置窗口的大小10         mf.setBounds(0, 0, 200, 200);11         //设置窗口时显示的12         mf.setVisible(true);13         //给这个窗口设置监听器(事件源和监听器的绑定)14         mf.addWindowListener(new MyWindowListener());15     }16 }17 /**18  * 监听器19  */20 class MyWindowListener implements WindowListener{21     @Override22     public void windowOpened(WindowEvent e) {23     }24     //当关闭窗口的时候触发(改变事件源)25     @Override26     public void windowClosing(WindowEvent e) {27         System.out.println("窗口正在关闭。。。");28         System.exit(0);//关闭程序29     }30     @Override31     public void windowClosed(WindowEvent e) {32     }33     @Override34     public void windowIconified(WindowEvent e) {35     }36     @Override37     public void windowDeiconified(WindowEvent e) {38     }39     @Override40     public void windowActivated(WindowEvent e) {41     }42     @Override43     public void windowDeactivated(WindowEvent e) {44     }45 }
GUI图形界面中监听器的代码示例

WEB中的监听器: 

  事件源:servlet中的三个域对象:ServletContext,HttpSession,ServletRequest.

  监听器:自定义类实现8个接口。
  事件源和监听器的绑定:配置

WEB中的监听器共有三类八种(监听三个域对象)

一类:监听三个域对象的创建和销毁;

  ServletContextListener
  HttpSessionListener
  ServletRequestListener
二类:监听三个域对象的属性变更(属性添加,移除,替换);
  ServletContextAttributeListener
  HttpSessioinAttributeListener
  ServletRequestAttributeListener
三类:监听HttpSession中JavaBean的状态改变(绑定,解除绑定,钝化,活化);
  HttpSessionBindingListener (监听绑定,解除绑定)绑定就是把javabean存入session域中,解除就是把javabean移除或用其他值(非javabean值)替换。
  HttpSessionActivationListener (监听钝化,活化) 钝化即序列化 活化即反序列化

    注意:第三类监听器很特殊,不需要进行配置,作用在JavaBean上的监听器,JavaBean可以自己感知在Session中的状态;

         让需要被监听的javabean implements HttpSessionBindingListener/HttpSessionActivationListener,然后重写里面的方法即可。
         当需要监听某个javabean的钝化或活化时,该javabean需要实现序列化接口Serializable,否则会报错。(当正常关闭服务器session域就会发生钝化情况,或者通过配置session钝化时间)

WEB中监听器的使用:

步骤1:编写一个类实现监听器的接口;

步骤2:通过配置文件配置监听器;

自定义监听器类的全路径

两种监听器在企业中的应用:

ServletContextListener

  因为该监听器是监听ServletContext对象的,由于该对象的创建和生命周期的特性可以用来做加载文件或执行定时任务。

作用一:加载框架的配置文件;eg:Spring框架 ContextLoaderListener implements ServletContextListener

作用二:执行定时任务调度(Timer,TimerTask):(在服务器启动的时候,定时去执行任务)

    

Timer  API:  
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定速率执行
void scheduleAtFixedRate(TimerTask task, long delay, long period)  安排指定的任务在指定的延迟后开始进行重复的固定速率执行。 
1 package listener; 2  3 import java.util.Calendar; 4 import java.util.Timer; 5 import java.util.TimerTask; 6  7 import javax.naming.NamingException; 8 import javax.servlet.ServletContext; 9 import javax.servlet.ServletContextEvent;10 import javax.servlet.ServletContextListener;11 12 import org.apache.naming.SelectorContext;13 14 public class MyServletContextListener implements ServletContextListener {15     @Override16     public void contextInitialized(ServletContextEvent sce) {17         // 通过事件来获得事件源18         ServletContext source = (ServletContext) sce.getSource();19         System.out.println(source.getServletContextName());20         // 任务调度示例21         Timer timer = new Timer();22         Calendar calendar = Calendar.getInstance();23         calendar.set(2018, 7, 24, 10, 47, 59);//设置一个时间点24         //设置服务器启动后按指定的calendar.getTime()时间执行run(),然后接下来每间隔5s执行一次.25         timer.scheduleAtFixedRate(new TimerTask() {26             @Override27             public void run() {28                 System.out.println("发送邮件。。。");29             }30         }, calendar.getTime(), 5000);31     }32 33     // ServletContext对象销毁的时候触发34     @Override35     public void contextDestroyed(ServletContextEvent sce) {36 37     }38 39 }
定时任务调度示例一
1 package listener; 2  3 import java.util.Calendar; 4 import java.util.Timer; 5 import java.util.TimerTask; 6  7 import javax.naming.NamingException; 8 import javax.servlet.ServletContext; 9 import javax.servlet.ServletContextEvent;10 import javax.servlet.ServletContextListener;11 12 import org.apache.naming.SelectorContext;13 14 public class MyServletContextListener implements ServletContextListener {15     @Override16     public void contextInitialized(ServletContextEvent sce) {17         // 通过事件来获得事件源18         ServletContext source = (ServletContext) sce.getSource();19         System.out.println(source.getServletContextName());20         // 任务调度示例21         Timer timer = new Timer();22         // 设置服务器启动后延迟10s后执行run(),然后接下来每间隔2s执行一次23         timer.scheduleAtFixedRate(new TimerTask() {24             @Override25             public void run() {26                 System.out.println("发送邮件。。。");27             }28         }, 10000, 2000);29     }30 31     // ServletContext对象销毁的时候触发32     @Override33     public void contextDestroyed(ServletContextEvent sce) {34 35     }36 37 }
定时任务调度示例二

HttpSessionActivationListener

作用:优化session

当并发访问过大的时候,因为过多的session对象对服务器内存造成巨大的浪费导致性能的下降,我们可以使用该监听器让规定一定时长后不使用的session序列化到硬盘,然后再等用的时候反序列化回来,这样大大节省了内存,提高了性能。但是我们又不能依赖于服务器的关闭和启动来实现序列化session,那么我们可以通过配置一个<Context>标签定时序列化session。

<Context>配置的三种路径:(放到不同的路径中对session的作用范围不同)

  一:在tomcat/conf/context.xml中配置一个<Context>;        //在tomcat中所有虚拟主机和虚拟路径都会按照这个配置执行。

  二:在tomcat/conf/Catalina/localhost/context.xml配置<Context>;  //在tomcat中的localhost虚拟主机中的所有虚拟路径按照这个配置执行。
  三:在当前工程下的META-INF/context.xml配置<Context>;     //当前这个工程按照配置执行。

<Context>的配置文档:

1 
2
6
7
8
9
 <Context>的配置:

 

转载于:https://www.cnblogs.com/laodang/p/9530220.html

你可能感兴趣的文章
Solr学习笔记1(V7.2)
查看>>
共享仅来宾
查看>>
MYSQL优化---hidba
查看>>
DTRACE简介(2)
查看>>
在.net中读写XML方法的总结[转]
查看>>
2015年最后一天
查看>>
MVC
查看>>
javscript对cookie的操作,以及封装
查看>>
中断方式下进行串口通讯的正确方法
查看>>
GIMP简介
查看>>
在 C++ 中使用 PPL 进行异步编程
查看>>
为什么要逃离物理?
查看>>
第二阶段冲刺 站立会议03
查看>>
Python编程快速上手-字典
查看>>
13.Git分支-变基(rebase)、rebase VS merge
查看>>
实验10 指针2
查看>>
git和github
查看>>
还零钱
查看>>
游戏引擎架构
查看>>
Linux中的mysql.redis
查看>>