Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518027
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: Java

2010-11-18 15:29:10

分两步走:

    (1)实现 javax.servlet.ServletContextListener 接口的两个方法:contextInitialized()和contextDestroyed()

    contextInitialized():当Servlet容器启动时会执行contextDestroyed():当Servlet容器停止时会执行

    (2)在contextInitialized()中加入需要监听的程序,并由 java.util.Timer 的 schedule() 方法来控制监听程序执行的频率

    DEMO(这是我的一个短信回复监听的程序原型,精简了一下)

  ----------------------------------------------------------------

    ReplyListener.java

  ----------------------------------------------------------------

  package com.hanweb.jcms;
  
  
import javax.servlet.*;
  
  
public class ReplyListener implements ServletContextListener {
  
private ReplyTimer rt = null;
  
public void contextInitialized(ServletContextEvent event) {
  String status 
= "[SYS] SMS reply listener start .";
  event.getServletContext().log(status);
  System.out.println(status);
  
  rt 
= new ReplyTimer(1);
  rt.start();
  }
  
  
public void contextDestroyed(ServletContextEvent event) {
  String status 
= "[SYS] SMS reply listener stop .";
  event.getServletContext().log(status);
  System.out.println(status);
  
  
if (rt != null) {
  rt.stop();
  }
  }
  }

  ----------------------------------------------------------------
  ReplyTimer.java
  ----------------------------------------------------------------

  package com.hanweb.jcms;
  
  
import java.util.*;
  
  
public class ReplyTimer {
  
private final Timer timer = new Timer();
  
private final int min;
  
  
public ReplyTimer(int minutes) {
  min 
= minutes;
  }
  
  
public void start() {
  Date date 
= new Date();
  timer.schedule(
new ReplyTask(), date, min * 60 * 1000);
  }
  
  
public void stop() {
  timer.cancel();
  }
  }

  ----------------------------------------------------------------
  ReplyTask.java
  ----------------------------------------------------------------

  package com.hanweb.jcms;
  
  
import java.util.*;
  
  
public class ReplyTask extends TimerTask {
  
public void doSomething() {
  System.out.println(
"[SYS] SMS reply listener running ");
  }
  
  
public void run() {
  doSomething();
  }
  }

    将编译好的class文件放入WEB-INF/classes中,最后别忘记了在Servlet容器中当前WEB应用的web.xml中加入监听语句:

  <listener>
  
<listener-class>com.hanweb.jcms.ReplyListenerlistener-class>
  
listener>



在Web项目中,我们可以使用Listener接口来监听Container的中一些对象状态的变化,并且根据这些对象的状态的变化做出相应的响应。

在Servlet 2.4和JSP 2.0 规范中一共有八个listener接口和六个event事件类。

当一个事件发生的时候我们可以使用listener中的某个方法去对事件做出相应的响应,这些方法的参数都是java.util.EventObject的子类。

这些Listener与其方法对应的Event参数类型如下图:
 

上图详细描述了八个listener接口和与其对应的event类

我们大致可以把八个listener分成三类,分别为与ServletContext、HttpSession、ServletRuquest相关的listener,在上图中已经使用不同的底色进行标注。

 

由于listener在实际的应用中好像不如预计的广泛,所以底下只简单介绍接口、方法、参数和注意点(统计在线人数和在线人员名单也许是用的最多的使用listener的实现了)。

 

好了,让我们从与ServletContext相关的两个接口开始吧

 

首先ServletContext是整个Web应用的上下文,所以这个对象里存放的应该是和整个Web应用相关的东西(在线人数明显很符合这个特点)

 

ServletContextListener

 

void contextInitialized(ServletContextEvent sce)

这个方法在Container初始化整个Web应用时调用,运行在该Web应用中servlet和filter初始化之前

 

void contextDestroyed(ServletContextEvent sce)

这个方法在Container卸载整个Web应用时调用,运行在该Web应用中servlet和filter的destroy()方法之后

 

ServletContextAttributeListener

 

   void attributeAdded(ServletContextAttributeEvent scab)

   这个方法在通过ServletContext的void setAttribute(String name, Object object)向ServletContext新添加一个name为名,object为值得对象之后被调用

   void attributeReplaced(ServletContextAttributeEvent scab)

   这个方法在通过ServletContext的void setAttribute(String name, Object object)替换ServletContext中name对应的值之后被调用

void attributeRemoved(ServletContextAttributeEvent scab)

这个方法在通过ServletContext的void removeAttribute(String name)删除ServletContext中以name为名的键值对之后或者ServletContext被销毁之前被调用。

 

ServletContextAttributeEvent提供两个方法:

String getName()返回键值对的名也就是name。

Object getValue()这个方法,在attributeAdded中返回新添的键值对的值;在attributeReplaced和中attributeRemoved返回原键值对的值。

 

 

HttpSessionListener

 

       void sessionCreated(HttpSessionEvent se)

    当一个session被创建之后,容器调用此方法。

void sessionDestroyed(HttpSessionEvent se)

 当一个session将要被销毁时,容器调用此方法。

 

 HttpSessionEvent只有一个方法HttpSession getSession(),该方法返回对应的session。

 

 

HttpSessionActivationListener

这个接口一般和Servlet容器的集群有关系,它监听的是同一个session转移至不同的JVM的事件。

       void sessionDidActivate(HttpSessionEvent se)

       当一个session对象已经变成有效的状态的时候,容器调用此方法

void sessionWillPassivate(HttpSessionEvent se)

 当一个session对象将要变成无效状态的时候,容器调用此方法

 

 

HttpSessionAttributeListener

这个接口和ServletContextAttributeListener方法一样,唯一的差别即是:

ServletContextAttributeListener针对的是ServletContext,而HttpSessionAttributeListener针对的Session。

 

   void attributeAdded(HttpSessionBindingEvent se)

   这个方法在通过HttpSession的void setAttribute(String name, Object object)向HttpSession新添加一个name为名,object为值得对象之后被调用

   void attributeReplaced(HttpSessionBindingEvent se)

   这个方法在通过HttpSession的void setAttribute(String name, Object object)替换HttpSession中name对应的值之后被调用

void attributeRemoved(HttpSessionBindingEvent se)

这个方法在通过HttpSession的void removeAttribute(String name)删除HttpSession中以name为名的键值对或者HttpSession失效时被调用之后被调用。

 

HttpSessionBindingEvent提供三个方法:

String getName()返回键值对的名也就是name。

Object getValue()这个方法,在attributeAdded中返回新添的键值对的值;在attributeReplaced和中attributeRemoved返回原键值对的值。

HttpSession getSession() 返回发生此事件的HttpSession对象。

 

 

HttpSessionBindingListener

注意:这个listener是一个比较特殊的listener,它不需要在web.xml中进行配置。

此listener需要存放于session中的对象实现此接口,才能被响应。

 

       void valueBound(HttpSessionBindingEvent event)

 此方法通过HttpSession的void setAttribute(String name, Object object)被调用。其中object需要实现HttpSessionBindingListener接口。

   

void valueUnbound(HttpSessionBindingEvent event)

此方法通过HttpSession的void removeAttribute(String name)或者HttpSession失效时被调用。其中nam对应的object需要实现HttpSessionBindingListener接口。

 

这个接口和HttpSessionAttributeListener差别为,此接口不需要在web.xml中配置并且可以监听单个类的对象被放入 session或者从session中去掉的动作。而HttpSessionAttributeListener需要在web.xml中配置,并且是监听 所有类的对象。

 

 

ServletRequestListener

   void requestInitialized(ServletRequestEvent sre)

       request初始化之后,容器调用此方法。

void requestDestroyed(ServletRequestEvent sre)

request消亡之前,容器调用此方法。

 

ServletRequestEvent提供二个方法:

       ServletContext getServletContext()

    返回此事件request对象对应的ServletContext

ServletRequest getServletRequest()

 返回此事件的request对象

 

ServletRequestAttributeListener

这个listener作用和ServletContextAttributeListener和HttpSessionAttributeListener类似,不过它监听的是ServletRequest对象。

 

  void attributeAdded(ServletRequestAttributeEvent srae)

   这个方法在通过ServletRequest的void setAttribute(String name, Object object)向ServletRequest新添加一个name为名,object为值得对象之后被调用

   void attributeReplaced(ServletRequestAttributeEvent srae)

   这个方法在通过ServletRequest的void setAttribute(String name, Object object)替换ServletRequest中name对应的值之后被调用

void attributeRemoved(ServletRequestAttributeEvent srae)

这个方法在通过ServletRequest的void removeAttribute(String name)删除ServletRequest中以name为名的键值对或者ServletRequest失效时被调用之后被调用。

 

 

ServletRequestAttributeEvent除了继承了ServletRequestEvent的ServletContext getServletContext()和ServletRequest getServletRequest()还提供了:

    String getName()返回键值对的名也就是name

Object getValue()这个方法,在attributeAdded中返回新添的键值对的值;在attributeReplaced和中attributeRemoved返回原键值对的值。

 

 

除了HttpSessionBindingListener以外,其他的listener都必须在web.xml中进行配置。

配置的方法很简单就是在web.xml中最后一个后,添加一个

 

 


 

 

     squall.servlet.listener.Listener

 

其中squall.servlet.listener.Listener为某一个listener的实现类。



Listener即监听器,通过Listener可以监听容器中的某一执行动作,并根据其要求做出相应的响应。

到目前Servlet2.4开始,一共包含8个Listener接口,可以分为三类:

1)、与ServletContext有关的Listener接口:ServletContextListener和ServletContextAttributeListener。

2)、与HttpSession有关的的 Listener接 口:HttpSessionListener,HttpSessionAttributeListener,HttpSessionBindingListener 和HttpSessionActivationListener.

3)、与ServletRequest有关的接口:ServletRequestListener,ServletRequestAttributeListener.

自定义监听器:只需要实现相应的监听器接口并实现其相应方法即可!然后在web.xml中进行监听器的配置

Xml代码
  1. <listener>  
  2. <listener-class>package.classlistener-class>  
  3. listener>  

一、ServletContextListener类

1、 ServletContextListener接口:接口中的两个方法:contextInitialized(),用来监听 ServletContext的启动和初始化;contextDestroy(),用来监听ServletContext的销毁;这两个方法中都包含一个 参数sce,其类型为ServletContextEvent。通过ServletContextEvent对象的 getServletContext()方法可以获得ServletContext对象。

Java代码
  1. package listener;   
  2.   
  3. import javax.servlet.ServletContextEvent;   
  4. import javax.servlet.ServletContextListener;   
  5.   
  6.   
  7. public class MyServletContextListener implements ServletContextListener {   
  8.     //ServletContext创建时调用该方法   
  9.     public void contextInitialized(ServletContextEvent sce) {   
  10.          System.out.println("ServletContext创建");   
  11.                   //获取ServletContext对象   
  12.                SerlvetContext context= sce.getServletContext();   
  13.      }   
  14.     //ServletContext销毁时调用该方法   
  15.     public void contextDestroyed(ServletContextEvent sce) {   
  16.          System.out.println("ServletContext销毁");   
  17.      }   
  18. }  

2、 ServletContextAttributeListener接口:用来监听application范围属性变化的监听。三个方 法:attributeAdded(),监听application范围属性的添加;attributeReplaced(),监听 application范围属性的替换;attributeRemoved(),监听application范围属性的移除。在这三个方法中有一个参数 ServletContextAttributeEvent scab,通过ServletContextAttributeEvent 对象的getName()可以获取属性的名称、getValue()获取属性值。

1)、ServletContextAttributeListener监听器

Java代码
  1. package listener;   
  2. import javax.servlet.ServletContextAttributeEvent;   
  3. import javax.servlet.ServletContextAttributeListener;   
  4.   
  5. public class MyServletContextAttributeListener implements  
  6.          ServletContextAttributeListener {   
  7.     //application范围属性添加时调用   
  8.     public void attributeAdded(ServletContextAttributeEvent scab) {   
  9.          System.out.println("添加application范围属性,属性名:" + scab.getName() + ",属性值:" + scab.getValue());   
  10.      }   
  11.     //application范围属性移除时调用   
  12.     public void attributeRemoved(ServletContextAttributeEvent scab) {   
  13.          System.out.println("移除application范围属性,属性名" + scab.getName());   
  14.            
  15.      }   
  16.     //application范围属性替换时调用   
  17.     public void attributeReplaced(ServletContextAttributeEvent scab) {   
  18.          System.out.println("替换application范围属性,属性名" + scab.getName());   
  19.      }   
  20. }  

2)、页面实例 ApplicationDEmo.jsp

Jsp代码
  1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
  2.   
  3.   
  4.      设置application范围属性   
  5.   
  6.   
  7.      <%   
  8.          //添加application范围name属性   
  9.          application.setAttribute("name","James");   
  10.          //替换application范围name属性   
  11.          application.setAttribute("name","123");   
  12.          //移除application范围name属性   
  13.          application.removeAttribute("name");   
  14.      %>   
  15.   
  16.   

二、HttpSession Listener类

1、HttpSessionListener接口:实现Session的初始化和销毁监听。

该接口有两个方法:sessionCreated(),session的创建和初始化监听;

                           sessionDestroyed(),监听session的销毁。

   两个方法中都包含一个参数: HttpSessionEvent se,调用其getSession()方法可以获取Session对象。

1)、HttpSessionListener类

Java代码
  1. package listener;   
  2.   
  3. import javax.servlet.http.HttpSession;   
  4. import javax.servlet.http.HttpSessionEvent;   
  5. import javax.servlet.http.HttpSessionListener;   
  6.   
  7. public class MyHttpSessionListener implements HttpSessionListener{   
  8.     //session创建时调用该方法   
  9.     public void sessionCreated(HttpSessionEvent se) {   
  10.          HttpSession session = se.getSession();   
  11.          System.out.println("创建session,ID为" + session.getId());   
  12.      }   
  13.     //session销毁时调用该方法   
  14.     public void sessionDestroyed(HttpSessionEvent se) {   
  15.          System.out.println("销毁session");   
  16.      }   
  17. }  

2)、JSP实例:SessionDemo.jsp

Java代码
  1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
  2.   
  3.   
  4.      销毁session   
  5.   
  6.   
  7.      <%   
  8.          session.invalidate();//销毁session   
  9.      %>   
  10.   
  11.   

2、 HttpSessionAttributeListener接口:用来监听session范围属性变化的监听。三个方 法:attributeAdded(),监听session范围属性的添加;attributeReplaced(),监听session范围属性的替 换;attributeRemoved(),监听session范围属性的移除。在这三个方法中有一个参数 HttpSessionAttributeEvent se,通过HttpSessionAttributeEvent 对象的getName()可以获取属性的名称、getValue()获取属性值。

1)、HttpSessionAttributeListener监听器

Java代码
  1. package listener;   
  2.   
  3. import javax.servlet.http.HttpSessionAttributeListener;   
  4. import javax.servlet.http.HttpSessionBindingEvent;   
  5.   
  6. public class MyHttpSessionAttributeListener implements  
  7.          HttpSessionAttributeListener {   
  8.     //session范围属性添加时调用   
  9.     public void attributeAdded(HttpSessionBindingEvent se) {   
  10.          System.out.println("添加session范围属性,属性名:" + se.getName() + ",属性值:" + se.getValue());   
  11.      }   
  12.     //session范围属性移除时调用   
  13.     public void attributeRemoved(HttpSessionBindingEvent se) {   
  14.          System.out.println("移除session范围属性" + se.getName());   
  15.      }   
  16.     //session范围属性替换时调用   
  17.     public void attributeReplaced(HttpSessionBindingEvent se) {   
  18.          System.out.println("替换session范围属性" + se.getName());   
  19.      }   
  20. }  

2)、JSP实例:SessionAttributeDemo.jsp

Java代码
  1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
  2.   
  3.   
  4.      设置session范围属性   
  5.   
  6.   
  7.      <%   
  8.         //添加session范围name属性   
  9.          session.setAttribute("name","James");   
  10.         //替换session范围name属性   
  11.          session.setAttribute("name","Forward");   
  12.         //移除session范围name属性   
  13.          session.removeAttribute("name");   
  14.      %>   
  15.   
  16.  



阅读(1152) | 评论(1) | 转发(0) |
0

上一篇:java tomcat servlet 交互过程

下一篇:web html5

给主人留下些什么吧!~~

chinaunix网友2010-11-19 15:21:45

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com