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));
}
}