zoukankan      html  css  js  c++  java
  • JavaWeb之Listener监听器

    监听在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中看到如下输出。

  • 相关阅读:
    javascript获取当前url
    外贸电子商务网站之Prestashop 安装后台中文语言包
    外贸电子商务网站之Prestashop paypal支付添加
    外贸电子商务网站之Prestashop 语言包安装
    PHPCMS快速建站系列之邮箱验证
    display: none;、visibility: hidden、opacity=0区别总结
    facebook第三方登录
    PHPCMS V9静态化HTML生成设置及URL规则优化
    Phpcms V9全站伪静态设置方法
    MySQL命令输入错误 取消命令
  • 原文地址:https://www.cnblogs.com/5ishare/p/6561657.html
Copyright © 2011-2022 走看看