JavaWeb-监听器、Servlet规范中的监听器

来源:互联网 发布:帝国cms图片二级域名 编辑:程序博客网 时间:2024/05/22 10:25
一、监听器
  1. 事件源:发送事件的对象.
  2. 事件:主要作用是对事件源的封装.
  3. 监听器:接口。传入事件对象。监听事件源上发生的事件
二、Servlet规范中的监听器(8个)
  1. 监听对象的创建和销毁 (3个)
    • 监听的对象:ServletContext、HttpSession、ServletRequest.
    • 它们分别是在何时创建和销毁的?
    • 具体监听器:ServletContextListener、HttpSessionListener、ServletRequestListener.
      • ServletContextListener:监听 ServletContext何时创建和销毁
        • //使用场景:非常有用
        • //ServletContext在一个应用中唯一的,容器加载应用时就创建
        • public class MyServletContextListener implements ServletContextListener {
        • public void contextDestroyed(ServletContextEvent sce) {
        • System.out.println("ServletContext销毁了");
        • }
        • //完成一些系统级别的初始化工作
        • public void contextInitialized(ServletContextEvent sce) {
        • System.out.println("ServletContext创建了");
        • //加载配置文件中的所有bean,并完成实例化
        • //Spring:写了一个监听器。实现了ServletContextListener接口
        • //Spring要想与web整合:只需要把Spring的这个监听器类在web.xml中进行注册即可
        • }
        • }
      • HttpSessionListener :监听  HttpSession 何时创建和销毁: httpsession在第一次request.getSession()时被创建,销毁session只有两种方式
        • //使用场景:统计当前内存中的HttpSession对象的个数。定时搜索session案例
        • //HttpSessionListener:监听会话对象的创建。找个唯一的容器存起来
        • //ServletContextListener:创建定时器,并启动,
        • public class SessionScanner implements HttpSessionListener,ServletContextListener {
        • private List<HttpSession> sessions = Collections.synchronizedList(new LinkedList<HttpSession>());//唯一的
        • private Object lock = SessionScanner.class;//唯一
        • //抓住session对象
        • public void sessionCreated(HttpSessionEvent se) {
        • System.out.println("会话对象创建了");
        • HttpSession session = se.getSession();
        • synchronized (lock) {
        • sessions.add(session);
        • }
        • }
        • //定时器启动
        • public void contextInitialized(ServletContextEvent sce) {
        • Timer t = new Timer();
        • TimerTask task = new MyTimerTask(sessions,lock);//扫描sessions,看哪个session对象超过1分钟没有使用了,主动invalidate
        • t.schedule(task, 0, 1000*60);
        • }
        • public void sessionDestroyed(HttpSessionEvent se) {
        • System.out.println("会话对象销毁了");
        • }
        • public void contextDestroyed(ServletContextEvent sce) {
        • }
        • }
        • class MyTimerTask extends TimerTask{
        • private List<HttpSession> sessions;
        • private Object lock;
        • public MyTimerTask(List<HttpSession> sessions, Object lock){
        • this.sessions = sessions;
        • this.lock = lock;
        • }
        • //具体任务
        • public void run() {
        • synchronized (lock) {
        • ListIterator<HttpSession> it = sessions.listIterator();
        • while(it.hasNext()){
        • HttpSession session = it.next();
        • if(System.currentTimeMillis()-session.getLastAccessedTime()>1000*60){
        • session.invalidate();
        • it.remove();
        • }
        • }
        • }
        • }
        • }
      • ServletRequestListener :监听  ServletRequest 何时创建和销毁
        • //使用场景:统计各个web资源的使用频率
        • public class MyServletRequestListener implements ServletRequestListener {
        • public void requestDestroyed(ServletRequestEvent sre) {
        • System.out.println("请求销毁了");
        • }
        • public void requestInitialized(ServletRequestEvent sre) {
        • System.out.println("请求创建了");
        • }
        • }
    • 如何注册监听器:在 web.xml中配置
      • <listener>
      • <listener-class>com.itheima.servlet.listener.MyServletContextListener</listener-class>
      • </listener>
  2. 监听三大域对象域中变化的监听器 (3个)
    • 监听的域对象:ServletContext、HttpSession、ServletRequest.  (page除外)
    • 作用向域中添加了东东:setAttribute...  
    • 具体监听器:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener.
      • ServletContextAttributeListener监听ServletContext域中的属性信息:
        • public void attributeAdded(ServletContextAttributeEvent scab) {
        • public void attributeRemoved(ServletContextAttributeEvent scab) {
        • public void attributeReplaced(ServletContextAttributeEvent scab) {
      • HttpSessionAttributeListener 监听HttpSession域中的属性信息 :
        • public void attributeAdded(HttpSessionBindingEvent se) {
        • public void attributeRemoved(HttpSessionBindingEvent se) {
        • public void attributeReplaced(HttpSessionBindingEvent se) {
      • ServletRequestAttributeListener 监听ServletRequest域中的属性信息 :
        • public void attributeAdded(ServletRequestAttributeEvent srae) {
        • public void attributeRemoved(ServletRequestAttributeEvent srae) {
        • public void attributeReplaced(ServletRequestAttributeEvent srae) {
    • 注册监听器:
      • 在 web.xml中配置
        • <listener>
        • <listener-class>com.itheima.servlet.listener.MyServletContextListener</listener-class>
        • </listener>
  3. 感知性监听器 (2个)
    • 不需要注册。实现这些监听器的类,能感知自己的行为。
    • HttpSessionBindingListener:实现该接口的普通类,能感知自己什么时候被HttpSession绑了,什么时候被解绑了。
    • HttpSessionActivationListener:实现该接口的普通类,能感知自己什么时候随着session对象去了,什么时候复活了。(钝化--活化)
原创粉丝点击