社会主义接班人 阅读(144) 评论(0)

监听在Java体系中运用的很广泛,在安卓开发、JavaWeb开发中到处存在,在其他语言也有类似的,如果有了解过设计模式那很容易理解实现的原理。不过对于开发者来说,使用观察者模式只需实现相应的接口就好,所以很方便。在Servlet2.5中有8种的Listener,Session、Request、Context的创建与销毁、属性变化对应6种还有2个是对Session内对象的监听。

一、监听对象的创建与销毁

1.ServletRequestListener:监听Request的创建和监听

每次请求都会执行requestInitialized(ServletRequestEvent sre)方法,request处理完毕自动销毁前会执行requestDestroyed(ServletRequestEvent sre)方法。

ServletRequestEvent的API可以看下图,里面有一个getServletContext()方法可以获得值改变后的getServletContext

2.HttpSessionListener:监听Session的创建和监听

Session创建时执行sessionCreated(HttpSessionEvent se)方法,当Session销毁失效时执行sessionDestroyed(HttpSessionEvent se)方法。下面再看下HttpSessionEvent对象。

从API可以看到可以通过getSession()方法获取改变后的session对象。

3.ServletContextListener:监听Context的创建和销毁

通知将开始 Web 应用程序初始化过程。在初始化 Web 应用程序中的所有过滤器或 servlet 之前,应该通知所有 ServletContextListener 关于上下文初始化的信息。通知即将关闭 servlet 上下文。在通知所有 ServletContextListener 上下文销毁之前,所有 servlet 和过滤器都已销毁。下图是ServletContextEvent类。

 

可以通过getServletContext()方法来获得改变后的ServletContext对象。

二、监听对象的属性变化

1.HttpSessionAttributeListener:监听Session的改变,Session的增加、删除和替换

下面再查下API看看HttpSessionBindingEvent对象

可以通过该对象获取session的name和值value。

2.ServletRequestAttributeListener:监听Request属性的改变

下面是ServletRequestAttributeEvent对象

可以通过属性的Name和Value。

3.ServletContextAttributeListener:用于监听上下文属性的改变

下图是ServletContextAttributeEvent类

也是获取Name和Value,和上面的基本类似。

三、监听Session内的对象

这两个与其他的就有点不一样了。

1.HttpSessionBindingListener

首先看它的接口

当对象被放到Session里时会执行valueBound(HttpSessionBindingEvent event)方法,当对象从Session中移除时会执行valueUnbound(HttpSessionBindingEvent event)方法,不过对象要实现这个接口。

2.HttpSessionActivationListener

服务器关闭时会将Session的内容保存到硬盘,这个过程叫钝化。服务器重启时会将Session内容从内容中加载,钝化会执行sessionDidActivate(HttpSessionEvent se)方法,重新加载会执行sessionWillPassivate(HttpSessionEvent se),对象也是要实现这个接口。

四、实验

上面算是把8个监听对象理论学习了下,下面利用上面的来做个实验。

1.创建

还是和Filter一样,以HelloWorld为基础,不重新创建包了,直接在com.test.cyw包中创建一个Listener,实现了6个接口。同时新建了一个Person类实现了Session内对象监听的两个接口

点击下一步可以选择要实现哪些监听接口.除了上面介绍的几个接口,还有几个新的接口,这里不再一一介绍,不过都是实现接口。

2.实现

1.创建一个Person类继承HttpSessionActivationListener, HttpSessionBindingListener实现这两个接口

package com.test.cyw;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;

public class Person implements HttpSessionActivationListener, HttpSessionBindingListener {

    public Person(String name, int age) {
        
        Name = name;
        Age = age;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public int getAge() {
        return Age;
    }

    public void setAge(int age) {
        Age = age;
    }

    private String Name;
    private int Age;
    @Override
    public void valueBound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionBindingListener_valueBound  Name:"+arg0.getName()+"Value:"+arg0.getValue());

    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionBindingListener_valueUnbound  Name:"+arg0.getName()+"Value:"+arg0.getValue());
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionActivationListener_sessionDidActivate");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionActivationListener_sessionWillPassivate");
    }

}
View Code

2.在MyListener中实现其他的6种接口,不打印记录

package com.test.cyw;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Application Lifecycle Listener implementation class MyListener
 *
 */
@WebListener
public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener,HttpSessionAttributeListener,ServletRequestAttributeListener,ServletContextAttributeListener {

    /**
     * Default constructor. 
     */
    public MyListener() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("HttpSessionListener_sessionCreated");
    }

    /**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("ServletRequestListener_requestDestroyed");
    }

    /**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
    public void requestInitialized(ServletRequestEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("ServletRequestListener_requestInitialized");
    }

    /**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("HttpSessionListener_sessionDestroyed");
    }

    /**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("ServletContextListener_contextDestroyed ContextParam:"+arg0.getServletContext().getInitParameter("ImageType"));
    }

    /**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("ServletContextListener_contextInitialized ContextParam:"+arg0.getServletContext().getInitParameter("ImageType"));
    }
    
    /**
     * @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
     */
    public void attributeAdded(HttpSessionBindingEvent arg0) 
    {
        System.out.println("HttpSessionAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }
    /**
     * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
     */
    public void attributeRemoved(HttpSessionBindingEvent arg0) 
    {
        System.out.println("HttpSessionAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }
    
    /**
     * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
     */
    public void attributeReplaced(HttpSessionBindingEvent arg0) 
    {
        System.out.println("HttpSessionAttributeListener_attributeReplaced Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("ServletRequestAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("ServletRequestAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("ServletRequestAttributeListener_attributeReplaced Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("ServletContextAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("ServletContextAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("ServletContextAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
    }

    
}
View Code

3.在test.jsp中设置request、response的属性、创建person对象并添加到session中,创建session并对其进行增改删。这里需要使用jsp的import来引入person类。

<body>
<% Person person=new Person("CuiYW",25); %>
<% 
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");

%>

</body>
View Code

4.配置

上面虽然实现了各种监听,但怎么让tomcat知道呢,还是需要在配置文件web.xml中配置。对于Session内对象的监听就不需要配置了。

  <listener>
      <listener-class>com.test.cyw.MyFilter</listener-class>
  </listener>

5.结果

先启动Tomcat然后浏览器请求test.jsp然后关闭tomcat,可以在console中看到如下输出。