listener顾名思义就是监听的意思,主要是用来监听web容器中所产生的事件,按照监听对象自顶向下的范围划分,javaweb中主要有以下种类的监听器:
①ServletContextListener 监听容器对象的初始化与销毁事件
②ServletContextAttributeListener 监听容器对象的属性的添加,删除和覆盖事件
③HttpSessionListener 监听容器中session对象的创建和销毁的事件
④HttpSessionAttributeListener 监听session对象中属性的添加,删除和覆盖事件
⑤ServletRequestListener 监听容器中request对象的创建和销毁的事件
⑥ServletRequestAttributeListener 监听request对象中属性的添加,删除和覆盖事件挑选两个作为使用示例
package com.demo.listener;
import java.util.Date;
import java.text.SimpleDateFormat;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TestServletContextListener implements ServletContextListener{
private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println(df.format(new Date()) + "---- " + "ServletContext Destroyed." );
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println(df.format(new Date()) + "---- " + "ServletContext Initialized.");
ServletContext sc = sce.getServletContext();
sc.setAttribute("df", df);
sc.setAttribute("appname", "demo");
new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(df.format(new Date()) + "---- " + "I am a new Thread be created when servletcontext initialized.");
}
}.run();
}
}
package com.demo.listener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class TestServletContextAttributeListener implements ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent scav) {
// TODO Auto-generated method stub
ServletContext sc = scav.getServletContext();
SimpleDateFormat df = (SimpleDateFormat) sc.getAttribute("df");
System.out.println(df.format(new Date()) + "---- " + "ServletContext Added An Attribute.");
try{
String scattr = scav.getName();
String scattr_value = scav.getValue().toString();
System.out.println(df.format(new Date()) + "---- " + scattr + ": " + scattr_value);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scav) {
// TODO Auto-generated method stub
ServletContext sc = scav.getServletContext();
SimpleDateFormat df = (SimpleDateFormat) sc.getAttribute("df");
System.out.println(df.format(new Date()) + "---- " + "ServletContext Removed An Attribute.");
try{
String scattr = scav.getName();
String scattr_value = scav.getValue().toString();
System.out.println(df.format(new Date()) + "---- " + scattr + ": " + scattr_value);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scav) {
// TODO Auto-generated method stub
ServletContext sc = scav.getServletContext();
SimpleDateFormat df = (SimpleDateFormat) sc.getAttribute("df");
System.out.println( df.format(new Date()) + "---- " + "ServletContext Replaced An Attribute.");
try{
String scattr = scav.getName();
String scattr_value = scav.getValue().toString();
System.out.println(df.format(new Date()) + "---- " + scattr + ": " + scattr_value);
}catch(Exception e){
e.printStackTrace();
}
}
}
以上两个test类分别实现了ServletContextListener和ServletContextAttributeListener两个接口,第一个test实现了容器的启动与销毁的事件监听,第二个test实现了容器中属性的添加,删除和覆盖的事件监听
3.部署到容器中
<listener>
<description>Listener ServletContext Start Or Destory</description>
<listener-class>com.demo.listener.TestServletContextListener</listener-class>
</listener>
<listener>
<description>Listener ServletContext Add, Remove Or Replace An Attribute</description>
<listener-class>com.demo.listener.TestServletContextAttributeListener</listener-class>
</listener>
当我们启动web服务器的时候,可以看到相应的日志的输出,表明监听器已成功添加,并随着服务器的启动开始工作了