4.5过滤器和监听器——监听器

JAVAWEB学习文章索引点这里
Servlet事件监听器的原理和GUI中的监听器的原理一致。不过这里主要监听的是ServletContext、session、request等对象以及其属性变更。
ServletContextListener接口中:

方法 说明
contextInitialized(ServletContextEvent event) 当ServletContext对象被创建时,web容器会调用contextInitialized()方法。且参数event可以用于获取ServletContext对象
contextDestroyed(ServletContextEvent event) 当ServletContext对象即将被销毁时,web容器会调用该方法

HttpSessionListener接口中:

方法 说明
sessionCreated(HttpSessionEvent event) 当HttpSession对象被创建时,web容器会调用sessionCreated ()方法。且参数event可以用于获取HttpSession对象
sessionDestroyed(HttpSessionEvent event) 当HttpSession对象即将被销毁时,web容器会调用该方法

ServletRequestListener接口中:

方法 说明
requestInitialized(ServletRequestEvent event) 当ServletRequest对象被创建时,web容器会调用requestInitialized()方法。且参数event可以用于获取ServletRequest对象
requestDestroyed(ServletRequestEvent event) 当ServletRequest对象即将被销毁时,web容器会调用该方法

简单测试以上方法:

package com.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class ListenerTest implements ServletContextListener, HttpSessionListener, ServletRequestListener {

    public void contextDestroyed(ServletContextEvent arg0)  { 
        System.out.println("ServletContext销毁了");
    }

    public void contextInitialized(ServletContextEvent arg0)  { 
        System.out.println("ServletContext创建了");
    }

    public void sessionCreated(HttpSessionEvent arg0)  { 
        System.out.println("session创建了"); 
        arg0.getSession().setMaxInactiveInterval(2);
    }

    public void sessionDestroyed(HttpSessionEvent arg0)  { 
         System.out.println("session销毁了");
    }
    public void requestDestroyed(ServletRequestEvent arg0)  { 
        System.out.println("request销毁了");
    }

    public void requestInitialized(ServletRequestEvent arg0)  { 
         System.out.println("request创建了");
    }

}

操作方式为,打开浏览器,访问这个监听器下的资源,等待一会儿后关闭浏览器,关闭服务器,结果如下:

ServletContext创建了
request创建了
session创建了
request销毁了
session销毁了
ServletContext销毁了

监听器接口中属性变更的方法:

方法 说明
attributeAdded(ServletContextAttributeEvent event) 当ServletContext对象中添加一个属性时,web容器会调用该方法
attributeAdded(HttpSessionBindindEvent event) 当HttpSession对象中添加一个属性时,web容器会调用该方法
attributeAdded(ServletRequestAttributeEvent event) 当ServletRequest对象中添加一个属性时,web容器会调用该方法
attributeRemoved(ServletContextAttributeEvent event) 当删除被监听对象中的一个属性时,web容器会调用该方法
attributeRemoved(HttpSessionBindindEvent event) 当删除被监听对象中的一个属性时,web容器会调用该方法
attributeRemoved(ServletRequestAttributeEvent event) 当删除被监听对象中的一个属性时,web容器会调用该方法
attributeReplaced(ServletContextAttributeEvent event) 当被监听对象中的一个属性改变时,web容器会调用该方法
attributeReplaced(HttpSessionBindindEvent event) 当被监听对象中的一个属性改变时,web容器会调用该方法
attributeReplaced(ServletRequestAttributeEvent event) 当被监听对象中的一个属性改变时,web容器会调用该方法

测试代码如下:

package com.test;

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;
import javax.servlet.http.HttpSession;

@WebServlet("/ListenerTestServlet")
public class ListenerTestServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = request.getServletContext();
        HttpSession session = request.getSession();

        context.setAttribute("name", "aaa");
        context.setAttribute("name", "bbb");
        context.removeAttribute("name");

        request.setAttribute("name", "ccc");
        request.setAttribute("name", "ddd");
        request.removeAttribute("name");

        session.setAttribute("name", "eee");
        session.setAttribute("name", "fff");
        session.removeAttribute("name");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
package com.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener
public class AttributeListenerTest implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {

    public void attributeAdded(ServletContextAttributeEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-添加1-"+arg0.getServletContext().getAttribute(name));
    }

    public void attributeReplaced(ServletContextAttributeEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-替换1-"+arg0.getServletContext().getAttribute(name));
    }
    public void attributeRemoved(ServletContextAttributeEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-销毁1-"+arg0.getServletContext().getAttribute(name));
    }
    public void attributeAdded(ServletRequestAttributeEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-增加2-"+arg0.getServletRequest().getAttribute(name));
    }

    public void attributeReplaced(ServletRequestAttributeEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-替换2-"+arg0.getServletRequest().getAttribute(name));
    }
    public void attributeRemoved(ServletRequestAttributeEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-销毁2-"+arg0.getServletRequest().getAttribute(name));
    }

    public void attributeAdded(HttpSessionBindingEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-增加3-"+arg0.getSession().getAttribute(name));
    }

    public void attributeRemoved(HttpSessionBindingEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-销毁3-"+arg0.getSession().getAttribute(name));
    }

    public void attributeReplaced(HttpSessionBindingEvent arg0)  { 
        String name = arg0.getName();
        System.out.println(name+"-替换3-"+arg0.getSession().getAttribute(name));
    }
}

HttpSessionBindingListener接口:
在使用javabean时经常会判断该对象是否绑定到session域中,为此提供了这个接口来监听javabean对象从session中的绑定和解绑事件。使用下列两个方法需要实现HttpSessionBindingListener接口

valueBound(HttpSessionBindingEvent event) 当对象被绑定到session的时候,容器会自动调用该方法
valueUnbound(HttpSessionBindingEvent event) 当对象从session中解绑的时候,容器会自动调用该方法

HttpSessionActivationListener接口:
Servlet容器在某些特殊情况下会将session对象从内存中转移到硬盘中,这个过程称为持久化(钝化)。例如:大量用户访问服务器的时候会创建大量的session,所以为了减少内存占用,将一部分一段时间没有访问的session对象钝化。在持久化会话中,Servlet容器不只会持久化session,还会将它所有可以序列化的属性进行持久化,从而确保存放在会话范围内的共享数据不会丢失。而可以序列化的属性的意思是这个属性实现了Serializable接口。当会话从持久化的状态变为运行状态的过程被称为活化(加载)。一般情况下,当服务器重新启动或者单个web应用启动时,处于会话中的客户端向web应用发出http请求时,相应的会话会被激活。
该接口提供方法如下

sessionWillPassivate(HttpSessionEvent event) 当绑定到session中的对象将要随session对象被钝化之前,容器会自动调用该方法
sessionDidActivate(HttpSessionEvent event) 当绑定到session中的对象将要随session对象被活化之前,容器会自动调用该方法

猜你喜欢

转载自blog.csdn.net/smallhc/article/details/80910060