引言:listener顾名思义就是监听的意思,作用就是监听程序中的一些变化,并根据其做出一些相应的响应。通俗的语言就是在session,request,application三个对象创建消亡或者往其中进行修改增加删除属性时自动执行代码的功能组件。
定义:listener监听器主要是实现了javax.servlet.ServletContextListener接口的服务器端程序,它跟过滤器一样随web应用启动而启动,只需要初始化一次,以后都可以进行监听。一般主要用于ServletContext、HttpSession、HttpServletSession这三个对象中的属性变更信息事件监听。
应用实例:实现对javax.servlet.ServletRequestListener接口的监听,也就是HttpRequestServlet进行监听。
1、Web.xml中的配置:
<listener>
<description>HttpRequestListner监听器</description>
<listener-class>com.check.listener.MyRequestContextListener</listener-class>
</listener>
2
、在
MyRequestContextListener类中对ServletRequestListener接口的实现
package com.check.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyRequestContextListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("Request销毁成功"+sre.getServletRequest());
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("Request创建成功"+sre.getServletRequest());
}
}
总结这:样就可以对request请求进行监听,其中对象的创建和销毁时间为:request请求发生的时候对象创建,当响应产生的时候request对象销毁。
二、对session进行监听
1、web.xml中的配置
<!--注册针对HttpSession对象监听器 -->
<listener>
<description>HttpSessionListener监听器</description>
<listener-class>com.check.listener.MySessionContextListener</listener-class>
</listener>
2、
MySessionContextListener对HttpSessionListener
实现
package com.check.listener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionContextListener implements HttpSessionListener {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void sessionCreated(HttpSessionEvent se) {
Date date=new Date();
System.out.println("session创建成功"+se.getSession()+" "+sdf.format(date));
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
Date date=new Date();
System.out.println("session销毁成功"+se.getSession() + " "+sdf.format(date));
}
}
总结:我在运行的时候,报这个session创建的时间是在一次Httprequest请求成功后创建的,也就是相当于一个request请求会创建一个session,而session的创建包括如下几种情况。
1.session对象创建:
reqeust.getSession();它是用于获取session.
是否创建,分以下几种情况:
1.请求中如果没有jsessionid,那么就是创建session对象。
2.如果请求头中有jsessionid值:
1.如果在服务器端,有一个session的id值与其一样,不创建,直接使用。
2.如果在服务器端,没有这个session的id值,那么会创建。
2. session销毁:
1.默认超时 30分钟
2.设置session超时时间
setMaxInactiveInterval(int interval)
3.invalidate()手动销毁.
4.关闭服务器
而我在创建的时候,在web.xm中配置session的销毁时间:1分钟
<session-config>
<session-timeout>1</session-timeout>
</session-config>
三、实现对ServletContext事件的监听
1、web.xml配置
<listener>
<description>ServletContextListener监听器</description>
<!-- 实现了ServletContextListener接口的监听器类 -->
<listener-class>com.check.listener.MyServletContextListener</listener-class>
</listener>
2、实现类MyServletContextListener;
package com.check.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象创建"+sce.getServletContext());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象销毁"+sce.getServletContext());
}
}
四、对其中属性进行一个监听:例如ServletContextAttributeListener
1、web.xml配置
<listener>
<description>MyServletContextAttributeListener监听器</description>
<listener-class>com.check.listener.MyServletContextAttributeListener</listener-class>
</listener>
2、实现类
package com.check.listener;
import java.text.MessageFormat;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent scab) {
String str =MessageFormat.format(
"ServletContext域对象中添加了属性:{0},属性值是:{1}"
,scab.getName()
,scab.getValue());
System.out.println(str);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scab) {
String str =MessageFormat.format(
"ServletContext域对象中删除属性:{0},属性值是:{1}"
,scab.getName()
,scab.getValue());
System.out.println(str);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scab) {
String str =MessageFormat.format(
"ServletContext域对象中替换了属性:{0}的值"
,scab.getName());
System.out.println(str);
}
}
总结:当往servletContext中添加数据或者其它属性的时候就会被监听到。监听结果