1. Listener的广义概念
顾名思义,Listener就是监听器,监听主要是对ServletContext,HttpSession,ServletRequest这三大域对象的创建和销毁事件监听,还有就是对域对象属性的操作监听,当监听这些事件发生是就会进行一些适当的操作。
对于域独享属性操作的监听一般用的很少,主要介绍这三大域对象的监听器。
2. Javaweb四大域对象
域对象 作用域
PageContext 当前jsp
ServletRequest 当前HTTP请求
HttpSession 当前会话
ServletContext 整个web服务器生命周期
上面是按照作用域从小到大排列的。
3. ServletContextListener介绍
ServletContextListener主要用于任务调度和Spring容器初始化的工作。
实现类:
public class ServletContextListenerDemo implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
System.out.println("ServletContextInitParams: "+sc.getInitParameter("ServletContextParam"));
System.out.println("ServletContextListenerDemo has been created");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListenerDemo hase been destroyed");
}
}
通过实现ServletContextListener接口,然后按照自己的需求重写初始化和销毁的两个方法就可以了,ServletContextEvent对象可以获取到ServletContext对象,具体还有其他的api。
xml配置:
<listener>
<listener-class>com.lyh.Listener.ServletContextListenerDemo</listener-class>
</listener>
4.HttpSessionListener介绍
HttpSessionListener是对HttpSession这个域对象进行监听的,可以用于统计实时在线人数,因为session是唯一的。
整个需要结合前面那个ServletContxtListener来合作使用,首先使用ServletContextListener在ServletContext创建之时就加入属性count=0表示当前在线的人数,然后用Session监听器监听Session创建,每当Session创建就计数加一,销毁就计数减一。
ServletContextListener中增加代码
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
sc.setAttribute("count", 0);
}
HttpSessionListener代码
public class HttpSessionListenerDemo implements HttpSessionListener{
private Integer count;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session has been created"+se.getSession().getId());
ServletContext sc = se.getSession().getServletContext();
count = (Integer) sc.getAttribute("count");
synchronized (sc){
sc.setAttribute("count", count+1);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext sc = se.getSession().getServletContext();
count = (Integer) sc.getAttribute("count");
synchronized (sc) {
sc.setAttribute("count", count - 1);
}
System.out.println("session has been destroyed");
}
}
不要忘了xml配置
<listener>
<listener-class>com.lyh.Listener.HttpSessionListenerDemo</listener-class>
</listener>
这样接下来只需要在jsp创建和销毁session测试就可以了。
5.ServletRequestListener介绍
这个监听器相对来说用的比较少,具体的使用方法和前面两个监听器是一样的,重写初始化和销毁方法然后添加xml配置就好了,ServletRequest对象的生命周期是一次请求中,所以请求结束就销毁了,一般监听器用的比较少,对象用的比较多。