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服務器的時候,可以看到相應的日誌的輸出,表明監聽器已成功添加,並隨着服務器的啓動開始工作了