监听器 listener


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
常用的listener有:
  (1) ServletContextListener 监听ServletContext。
        当创建ServletContext时,激发 contextInitialized(ServletContextEvent sce)方法;
       当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

  (2)ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。

  (3)HttpSessionListener 监听HttpSession的操作。
          当创建一个Session时,激发 session Created(HttpSessionEvent se)方法;
          当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
  

 (4)HttpSessionAttributeListener 监听HttpSession中的属性的操作。
        当在Session增加一个属性时,激发 attributeAdded(HttpSessionBindingEvent se) 方法;
        当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEventse)方法;
        当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

1,  SerlvetContextListener 

(1) 在每一个java的web应用中都只能又一个单独的servlet context。而这个context被放置在整个应用级别上,当应用一旦启动之后,servlet容器就会创建这样一个servlet context来服务于web应用。因此我们也可以创建一个类并实现了一个ServletContextListerner接口,用于通知这个context是否被创建了或者被销毁了。这样当Context被创建时,就会收到一个相关的通知,并且在Context被销毁前也会得到一个通知。
如: public void contextInitialized(ServletContextEvent event) {
ServletContext ctx = event.getServletContext( );
ctx.setAttribute("dateStarted", new Date( ));
//在页面或程序中用<%=getServletContext().getAttribute("dateStarted")%> 得到设置的属性
}
注:在使用Struts的时候,我们可以采用plug-in的方式来解决这个问题。因为pulg-in可以做context Listern所能做的任何事情。并且能够传入各种配置在struts-config.xml文件中的参数。
(2)  在web.xml中配置

   <listener>
       <listener-class>demo.listener.MyContextLoader</listener-class>
  </listener>
(2) 定时任务的实现
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

private Timer timer = null;

public void contextInitialized(ServletContextEvent event) {
timer = new Timer(true);
//设置任务计划,启动和间隔时间
timer.schedule(new MyTask(), 0, 86400000);
}

public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
}

}

class MyTask extends TimerTask {

public void run() {
// System.out.println("call at " + (new Date()));
// TODO 此处添加具体任务代码
}

2, HttpSessionListener

(1) 用来监听Servlet Context的创建和销毁的状态
(2)统计当前有多少在线用户,原理:看创建了多少个session即可

package demo.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionCounter implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
ServletContext ctx = event.getSession( ).getServletContext( );
Integer numSessions = (Integer) ctx.getAttribute("numSessions");

//在页面或程序中用<%=getServletContext().getAttribute("dateStarted")%> 得到人数

if (numSessions == null) {
    numSessions = new Integer(1);
}
else {
    int count = numSessions.intValue( );
    numSessions = new Integer(count + 1);
}
ctx.setAttribute("numSessions", numSessions);
}
public void sessionDestroyed(HttpSessionEvent event) {
ServletContext ctx = event.getSession( ).getServletContext( );
Integer numSessions = (Integer) ctx.getAttribute("numSessions");
if (numSessions == null) {
    numSessions = new Integer(0);
}
else {
    int count = numSessions.intValue( );
    numSessions = new Integer(count - 1);
}
ctx.setAttribute("numSessions", numSessions);
}
}
3, HttpSessionAttributeListener
(1) 监听session中的属性的创建,移除等,如当创建userName属性时做些什么之类
(2)应用:

package demo.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class UserCounter implements HttpSessionAttributeListener {

public void attributeAdded(HttpSessionBindingEvent event) {
if (attributeIsUser(event))
    adjustUserCounter(event.getSession( ).getServletContext( ),
    true);
}

public void attributeRemoved(HttpSessionBindingEvent event) {
if (attributeIsUser(event))
    adjustUserCounter(event.getSession( ).getServletContext( ),
    false);
}

public void attributeReplaced(HttpSessionBindingEvent event) {
}

private boolean attributeIsUser(HttpSessionBindingEvent event) {
String name = event.getName( );
Object value = event.getValue( );
return "user".equals(name) &&
       value instanceof demo.app.domain.user;
}

private void adjustUserCounter(ServletContext ctx, boolean userAdded) {
Integer counterObj = (Integer) ctx.getAttribute("numUsers");
int counter = (counterObj == null ? 0 : counterObj.intValue( ));
if (userAdded) {
  counter++;
}
else {
    if (counter > 0) counter--;
}
ctx.setAttribute("numUsers", new Integer(counter));
}
}