Servlet中的监听器及监听在线人数实例

简介:

Servlet API提供了基本的应用程序事件监听器接口。编程者可以通过实现这些接口来使用管理事件的功能。Servlet2.4以后提供了对以下对象的事件监听:ServletContext,HttpSession,ServletRequest。监听ServletContext可以使Web程序得知整个应用程序载入和卸载等运行情况。监听HttpSession可以Web程序了解应用程序会期间的状况并作出响应。监听ServletRequest可以使 Web程序控制Web请求的生命周期。下面结合JavaServetAPI官方文档对各个事件监听器接中进行说明。 

一、 ServletContextListener 
所在包:javax.servlet 
接口声明:public interface ServletContextListener extends java.util.EventListener 
方法: 
1.void contextDestroyed(ServletContextEvent sce) 
当应用被卸载后触发执行该方法中的代码。 
2.void contextInitialized(ServletContextEvent sce) 
当应用在初始化时触发执行该方法中的代码。 

这里需要对ServletContentEvent说明一下,它是一个ServletContext对象的事件,其类的声明如下: 
public class ServletContentEvent extends java.util.EventObject 
包含方法:ServletContext getServletContext(),返回事件的Servlet上下文,即产生事件的当前应用程序。 

二、 ServletContextAttributeListener 
所在包:javax.servlet 
接口声明:public interface ServletContextAttributeListener 
extends java.util.EventListener 
方法: 
1. void attributeAdded(ServletContextAttributeEvent scab) 
当一个新的属性加入到Servlet的上下文中后触发该方法中的代码。 
2.void attributeRemoved(ServletContextAttributeEvent scab) 
当一个属性被从servlet的上下文中移走后触发该方法中的代码。 
3.void attributeReplaced(ServletContextAttributeEvent scab) 
当servlet上下文中的一个属性的值被替换后触发该方法中的代码。 

ServletContextAttributeEvent是servlet上下文里的属性的事件,其类声明如下: 
public class ServletContextAttributeEvent 
extends ServletContextEvent 
包含方法:String GetName(),返回产生事件的属性名称;Object GetValue(),返回产生事件的属性的值。 

三、HttpSessionListener 
所在包:javax.servlet 
接口声明:public interface HttpSessionListener 
extends java.util.EventListener 
方法: 
1.void sessionCreated(HttpSessionEvent se) 
当一个会话被创建后触发执行该方法中的代码。 
2.void sessionDestroyed(HttpSessionEvent se) 
当一个会话被释放后触发执行该方法中的代码。 

HttpSessionEvent 是会话事件类,其声明如下: 
public class HttpSessionEvent 
extends java.util.EventObject 
包含方法:HttpSession getSession(),返回产生事件的session对象。 

四、 HttpSessionActivationListener 
所在包:javax.servlet 
接口声明:public interface HttpSessionActivationListener 
extends java.util.EventListener 
方法: 
1.void SessionDidActivate(HttpSessionEvent se) 
2.void SessionWillPassivate(HttpSessionEvent se) 
Activate与Passivate是用于置换对象的动作,当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate。 

五、HttpSessionAttributeListener 
所在包:javax.servlet 
接口声明:public interface HttpSessionAttributeListener 
extends java.util.EventListener 
方法: 
1.void attributeAdded(HttpSessionBindingEvent se) 
2.void attributeReplaced(HttpSessionBindingEvent se) 
3.void attributeRemoved(HttpSessionBindingEvent se) 
以上三个方法分别在会话属性被加入、会话属性值被修改和会话属性被移除时触发执行。 

HttpSessionBindingEvent 是一个会话事件对象类,其声明如下: 
public interface HttpSessionBindingListener 
extends java.util.EventListener 
包含方法:String getName(),返回产生当前事件的会话的属性名。Object getValue(),返回产生当前事件的会话的属性值。HttpSession getSession(),返回产生当前事件的会话对象。 

六、 HttpSessionBindingListener 
所在包:javax.servlet 
接口声明:public interface HttpSessionBindingListener 
extends java.util.EventListener 
方法: 
1.void valueBound(HttpSessionBindingEvent event) 
当实现 HttpSessionBindingListener接口的对象被绑定到Session Attribute中,该对象的此方法被执行。 
2.void valueUnbound(HttpSessionBindingEvent event) 
当实现 HttpSessionBindingListener接口的对象被从Session Attribute解除绑定,该对象的此方法被执行。 

请注意 HttpSessionAttributeListener与HttpSessionBindingListener的区别: 
1.前者是需要在web.xml中进行描述的,后者不需要。 
2.前者是在任何session的属生变化时都会触发执行其方法中的代码,而后者只是在实现它的对象被绑定到会话属性或被从会话属生中解除绑定时,才会触发执行那个对象的valueBound和valueUnboundy这两个方法的代码。比如说有两个对象A和B都实现了HttpSessionBindingListener接口,当A被绑定到会话属性中时,只是A的valueBound() 方法被触发执行。 

七、 ServletRequestListener 
所在包:javax.servlet 
接口声明:public interface ServletRequestListener 
extends java.util.EventListener 
方法: 
1.void RequestDestroyed(ServletRequestEvent evt) 
2.void RequestInitialized(ServletRequestEvent evt) 
以上两个方法分别在ServetRequest对象初始化和清除时触发执行。 

ServletRequestEvent 表示ServletReuest事件类,其声明如下: 
public class ServletRequestEvent 
extends java.util.EventObject 
包含方法:ServletContext getServletContext(),获得当前Web应用程序的上下文对象。ServletRequest getServletRequest(),获得当前事件的主体,ServletRequest对象。 

八、 ServletRequestAttributeListener 
所在包:javax.servlet 
接口声明:public interface ServletRequestAttributeListener 
extends java.util.EventListener 
方法: 
1.void attributeAdded(ServletRequestAttributeEvent e) 
当向ServlvetRequest对象属性中添加属性后触发执行该方法。 
2.void attributeRemoved(ServletRequestAttributeEvent e) 
当向ServlvetRequest对象属性中移除属性后触发执行该方法。 
3.void attributeReplaced(ServletRequestAttributeEvent e) 
当修改ServlvetRequest对象属性的属生值后触发执行该方法。 

ServletRequestAttributeEvent 是ServletRequest属性事件类,其声明如下: 
public class ServletRequestAttributeEvent 
extends ServletRequestEvent 
包含方法:String getName(),获得触发事件的属性的名称。Object getValue(),获得触发事件的属生的值。 

下面说明如何在web.xml中布署事件监听器以实现对事件的处理,格式如下: 
<listener> 
  <listener-class> 
    packname.classname
  </listener-class >  
</listener> 
其中fey.servlet.listener.CustomServletContextListener是实现上述各事件监听器接口的类名。当然需要将这些类放入Web容器的Web应用的classes或lib目录下以让Web容器可以找到。外说明一点,一个类可以一个或多个监听器接口。 


九、实例:session的2个监听器接口监听当前在线人数列表 

1、javax.servlet.http.HttpSessionBindingListener;

实现这个接口的类,每当被存放到session或从session中移除都会出发接口中相应的方法,从而实现监听的效果。

2、javax.servlet.http.HttpSessionListener;

实现这个接口的类,本身就是1个监听器,每当有session生成或消亡时,都触发接口中相应的方法,从而实现监听器的效果;

HttpSessionListener的实现类本身就是一个监听器,要使用它需要在web.xml中启动这个监听器,例如

<listener>  
 <listener-class>packname.classname</listener-class>  
</listener>  

3、这2个监听器是有区别的

前者的触发取决于session中加入的属性。

后者的触发取决于session本身的产生和消亡。

4、与和上述之类似的还有对ServletContext的监听和对Request监听。

 

在线人数列表是对所有人起作用,数据应放到application中即ServletContext对象。

OnLineDemo.java   

import java.util.ArrayList;   
import java.util.List;   
import javax.servlet.ServletContext;   
import javax.servlet.ServletContextEvent;   
import javax.servlet.ServletContextListener;   
import javax.servlet.http.HttpSessionAttributeListener;   
import javax.servlet.http.HttpSessionBindingEvent;   
import javax.servlet.http.HttpSessionEvent;   
import javax.servlet.http.HttpSessionListener;    

public class OnlineDemo implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {   
   
    // 声明一个ServletContext对象   
    private ServletContext application = null;   
  
    public void contextInitialized(ServletContextEvent sce) {   
        // 容器初始化时,向application中存放一个空的容器   
        this.application = sce.getServletContext();   
        this.application.setAttribute("alluser", new ArrayList());   
    }   
  
    public void contextDestroyed(ServletContextEvent sce) {   
    }   
  
    public void sessionCreated(HttpSessionEvent se) {   
    }   
  
    public void sessionDestroyed(HttpSessionEvent se) {   
        // 将用户名称从列表中删除   
        List l = (List) this.application.getAttribute("alluser");   
        String value = (String) se.getSession().getAttribute("uname");   
        l.remove(value);   
        this.application.setAttribute("alluser", l);   
    }   
  
    public void attributeAdded(HttpSessionBindingEvent se) {   
        // 如果登陆成功,则将用户名保存在列表之中   
        List l = (List) this.application.getAttribute("alluser");   
        l.add(se.getValue());   
        this.application.setAttribute("alluser", l);   
    }   
  
    public void attributeRemoved(HttpSessionBindingEvent se) {   
    }   
  
    public void attributeReplaced(HttpSessionBindingEvent se) {   
    }   
}  


online.jsp

<%@ page contentType="text/html;charset=gb2312"%>  
<%@ page import="java.util.*"%>  

<form action="online.jsp" method="post">     
 <input type="text" name="name">  
 <input type="submit" value="登陆">  
 <a href="logout.jsp">注销</a>  
</form>  
 
<%   
    if(request.getParameter("name")!=null)   
        session.setAttribute("uname",request.getParameter("name")) ;   
%>  
<h2>在线人员</h2>  
<hr>  
<%   
    List l = (List)application.getAttribute("allUser");   
    for(Object o : l)   
        out.println(o);   
%> 

logout.jsp

<%   
    session.invalidate() ;   
%>

原帖地址:http://blog.sina.com.cn/s/blog_705c12080100nayb.html

目录
相关文章
|
2天前
|
Java Unix 应用服务中间件
Servlet 教程 之 Servlet 实例 3
Servlet是Java写的HTTP服务程序,用于扩展HTTP请求。在Tomcat的默认目录结构下,Servlet应用的类文件需放在WEB-INF/classes里。以`com.myorg.MyServlet`为例,对应的`.class`文件应在此路径下。配置`web.xml`,添加Servlet和映射,。
8 2
|
2天前
|
Java
Servlet 教程 之 Servlet 实例 1
Servlet是Java类,用于处理HTTP请求,常用于扩展`HttpServlet`。
9 3
|
8月前
|
存储 Java 数据安全/隐私保护
servlet过滤器与监听器
前言 Servlet 过滤器和监听器是 Java Web 应用程序中常见的两种组件,它们提供了各种扩展 Web 应用程序功能的方式。 总的来说,过滤器和监听器都可以通过 Java Web 应用程序的配置文件或注解进行使用,方便灵活,并可以很好地实现框架与业务逻辑的分离,提高代码可维护性和扩展性。 过滤器(Filter) 1. 参数验证和转换:可以拦截用户提交的数据,并对数据格式进行验证、修正或转换。 2. 访问控制和认证:可以拦截请求并检查用户是否有访问特定资源的权限。 3. 日志记录:可以拦截请求并输出相应的日志信息,用于系统运行时的监测与故障排除。 4. 资源压缩和解密: 可以拦截响应并对
49 0
|
8月前
|
Java 应用服务中间件
如何在个人web项目中使用Servlet监听器?
如何在个人web项目中使用Servlet监听器?
|
10月前
|
存储 Java
【Java Web编程 十一】深入理解Servlet监听器
【Java Web编程 十一】深入理解Servlet监听器
63 0
【Java Web编程 十一】深入理解Servlet监听器
|
JavaScript
Servlet学习——监听器
Servlet学习——监听器
131 0
|
XML 设计模式 前端开发
Servlet、过滤器、监听器、拦截器
Servlet是javaEE规范中的一种,javaEE中的规范很多除了Servlet还有很多我们熟悉的JSP、JDBC、RMI、XML、EJB、JTS等等。
124 0
Servlet、过滤器、监听器、拦截器
|
存储 缓存 监控
servlet中的监听器接口
servlet中的监听器接口
78 0
servlet中的监听器接口
|
Java Spring 容器
【JavaWeb】之Servlet监听器
【JavaWeb】之Servlet监听器
109 0
|
存储 编解码 Java
Java Web之Servlet中过滤器与监听器的解析及使用(附源码)
Java Web之Servlet中过滤器与监听器的解析及使用(附源码)
127 0