监听器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()) ;
    }
}

配置文件同上。

posted @ 2013-07-22 16:23  恋醉梦  阅读(261)  评论(0编辑  收藏  举报