• 监听器Listener


    方便自己查询,嫌低级的勿喷。。。。

    监听器主要功能是负责监听Web的各种操作,当相关事件触发后将产生事件,并对此事件进行处理。

    一.对application监听

    对application监听实际上就是对ServletContext监听,主要使用ServletContextListener和ServletContextAttributeListener两个接口:

    1.上下文状态监听:ServletContextListener接口

    javax.servlet.ServletContextListener接口定义的方法如下:

    No 方法 描述
    1 public void contextInitialized(ServletContextEvent sce) 容器启动时触发
    2 public void contextDestroyed(ServletContextEvent sce) 容器销毁时触发

    在上下文状态监听操作中,一旦触发了ServletContextListener接口中定义的事件后,可以通过ServletContextEvent获取一个ServletContext对象的实例(application对象):

    No 方法 描述
    1 public ServletContext getServletContext() 取得ServletContext对象
    package org.lxh.listenerdemo ;
    import javax.servlet.* ;
    public class ServletContextListenerDemo implements ServletContextListener {
        public void contextInitialized(ServletContextEvent event){
            System.out.println("** 容器初始化 --> " + event.getServletContext().getContextPath()) ;
        }
        public void contextDestroyed(ServletContextEvent event){
            System.out.println("** 容器销毁 --> " + event.getServletContext().getContextPath()) ;
            try{
                Thread.sleep(300) ;
            }catch(Exception e){}
        }
    }

    配置web.xml文件

    <listener>
       <listener-class>
           org.lxh.listenerdemo.ServletContextListenerDemo
       </listener-class>
    </listener>

     2.上下文属性监听:ServletContextAttributeListener接口

    javax.servlet.ServletContextAttributeListener接口定义的方法如下:

    No 方法 描述
    1 public void attributeAdded(ServletContextAttributeEvent scab) 增加属性时触发
    2 public void attributeRemoved(ServletContextAttributeEvent scab) 删除属性时触发
    3 public void attributeReplaced(ServletContextAttributeEvent scab) 替换属性(重复设置)时触发

    在上下文属性监听中,一旦触发了ServletContextAttributeListener接口中定义的事件后,可以通过ServletContextAttributeEvent获取到下面的方法:

    No 方法 描述
    1 public String getName() 取得设置的属性名称
    2 public Object getValue() 取得设置的属性内容
    package org.lxh.listenerdemo ;
    import javax.servlet.* ;
    public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {
        public void attributeAdded(ServletContextAttributeEvent scab){
            System.out.println("** 增加属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
        }
        public void attributeRemoved(ServletContextAttributeEvent scab){
            System.out.println("** 删除属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
        }
        public void attributeReplaced(ServletContextAttributeEvent scab){
            System.out.println("** 替换属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
        }
    }

    配置web.xml文件

        <listener>
            <listener-class>
                org.lxh.listenerdemo.ServletContextAttributeListenerDemo
            </listener-class>
        </listener>

    二.对session监听

    1.session状态监听:HttpSessionListener接口

    javax.servlet.http.HttpSessionListener接口定义的方法如下:

    No 方法 描述
    1 public void sessionCreated(HttpSessionEvent se) session创建时调用
    2 public void sessionDestroyed(HttpSessionEvent se) session销毁时调用

    当session创建或者销毁后,可以通过HttpSessionEvent获取对应的session:

    No 方法 描述
    1 public HttpSession getSession() 获取当前session
    package org.lxh.listenerdemo ;
    import javax.servlet.http.* ;
    public class HttpSessionListenerDemo implements HttpSessionListener {
        public void sessionCreated(HttpSessionEvent se){
            System.out.println("** SESSION创建,SESSION ID = " +se.getSession().getId() ) ;
        }
        public void sessionDestroyed(HttpSessionEvent se){
            System.out.println("** SESSION销毁,SESSION ID = " +se.getSession().getId() ) ;
        }
    }

    配置web文件同上。

    2.session属性监听:HttpSessionAttributeListener接口

    javax.servlet.http.HttpSessionAttributeListener接口定义的方法如下:

    No 方法 描述
    1 public void attributeAdded(HttpSessionBindingEvent se) 增加属性时触发
    2 public void attributeRemoved(HttpSessionBindingEvent se) 删除属性时触发
    3 public void attributeReplaced(HttpSessionBindingEvent se) 替换属性时触发

    当进行属性操作时,可以通过HttpSessionBindingEvent接口获取session相关的信息:

    No 方法 描述
    1 public HttpSession getSession() 取得当前的session
    2 public String getName() 取得属性的名称
    3 public Object getValue() 取得属性的内容
    package org.lxh.listenerdemo ;
    import javax.servlet.http.* ;
    public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {
        public void attributeAdded(HttpSessionBindingEvent se){
            System.out.println(se.getSession().getId() + ",增加属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
        }
        public void attributeRemoved(HttpSessionBindingEvent se){
            System.out.println(se.getSession().getId() + ",删除属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
        }
        public void attributeReplaced(HttpSessionBindingEvent se){
            System.out.println(se.getSession().getId() + ",替换属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
        }
    }

    配置web文件同上。

    3.session属性监听:HttpSessionBindingListener接口

    上面的session监听接口都是需要在web.xml文件里配置后才能起作用,但是在Web中也提供一个javax.servlet.http.HttpSessionBindingListener接口,通过此接口实现的监听程序可以不用配置而直接使用:

    No 方法 描述
    1 public void valueBound(HttpSessionBindingEvent event) 绑定对象到session时触发
    2 public void valueUnbound(HttpSessionBindingEvent event) 从session中移除对象时触发
    package org.lxh.listenerdemo ;
    import javax.servlet.http.* ;
    public class LoginUser implements HttpSessionBindingListener {
        private String name ;//保存登陆用户姓名
        public LoginUser(String name){
            this.setName(name) ;
        }
        public void valueBound(HttpSessionBindingEvent event){
            System.out.println("** 在session中保存LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
        }
        public void valueUnbound(HttpSessionBindingEvent event){
            System.out.println("** 从session中移出LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
        }
        public String getName(){
            return this.name ;
        }
        public void setName(String name){
            this.name = name ;
        }
    }
    <%@ page contentType="text/html" pageEncoding="GBK"%>
    <%@ page import="org.lxh.listenerdemo.*"%>
    <html>
    <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
    <body>
    <%
        LoginUser user = new LoginUser("MLDN") ;
        session.setAttribute("info",user) ;    // 直接保存LoginUser对象
    session.removeAttribute("info") ; // 直接保存LoginUser对象
    %> </body> </html>

    首先实例化一个LoginUser对象(注意用户名同session的用户名一致),然后将此对象保存在session属性范围内,这样监听器就会自动调用valueBound()操作进行处理。直接从session中删除info属性,监听器会自动调用valueUnbound()操作进行处理。

    三.对request监听

    1.请求状态监听:ServletRequestListener接口

    javax.servlet.ServletRequestListener接口定义方法如下:

    No 方法 描述
    1 public void requestInitialized(ServletRequestEvent sre) 请求开始时调用
    2 public void requestDestroyed(ServletRequestEvent sre) 请求结束时调用

    ServletRequestListener接口一旦监听到事件后,通过ServletRequestEvent接口获取request对象和application对象:

    No 方法 描述
    1 public ServletRequest getServletRequest() 取得ServletRequest对象
    2 public ServletContext getServletContext() 取得ServletContext对象
    package org.lxh.listenerdemo ;
    import javax.servlet.* ;
    public class ServletRequestListenerDemo implements ServletRequestListener {
        public void requestInitialized(ServletRequestEvent sre){
            System.out.println("** request初始化。http://" + 
                sre.getServletRequest().getRemoteAddr() + 
                sre.getServletContext().getContextPath()) ;
        }
        public void requestDestroyed(ServletRequestEvent sre){
            System.out.println("** request销毁。http://" + 
                sre.getServletRequest().getRemoteAddr() + 
                sre.getServletContext().getContextPath()) ;
        }
    }

    配置文件同上。

    2.request属性监听:ServletRequestAttributeListener接口

    javax.servlet.ServletRequestAttributeListener接口定义的方法如下:

    No 方法 描述
    1 public void attributeAdded(ServletRequestAttributeEvent srae) 属性增加时调用
    2 public void attributeReplaced(ServletRequestAttributeEvent srae) 属性替换时调用
    3 public void attributeRemoved(ServletRequestAttributeEvent srae) 属性删除时调用

    当request属性操作时通过ServletRequestAttributeEvent接口获取对应属性的名称和内容:

    No 方法 描述
    1

    public String getName()

    取得设置的属性名称
    2 public Object getValue() 取得设置的属性内容
    package org.lxh.listenerdemo ;
    import javax.servlet.* ;
    public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {
        public void attributeAdded(ServletRequestAttributeEvent srae){
            System.out.println("** 增加request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
        }
        public void attributeRemoved(ServletRequestAttributeEvent srae){
            System.out.println("** 删除request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
        }
        public void attributeReplaced(ServletRequestAttributeEvent srae){
            System.out.println("** 替换request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
        }
    }

    配置文件同上。

  • 相关阅读:
    系统编码、文件编码与python系统编码
    python2判断编码格式
    android: 对apk进行系统签名
    android: 对普通的apk应用进行签名
    android studio: 设置单条注释不换行
    Gradle: Could not determine the dependencies of task ':app:processDebugResources'解决(转)
    android Dialog: 去除dialog 顶部 蓝色的线
    android:Error:” ” is not translated in “en” (English) [MissingTranslation]处理方法(转)
    android: 通过Intent筛选多种类型文件
    GIt: git rebase 和 git merge 的区别 (转)
  • 原文地址:https://www.cnblogs.com/mjsh/p/3205564.html
Copyright © 2020-2023  润新知