Listener
监听web应用是否启动,session是否有创建
一.Hello Listener
Listener的作用是用于监听web应用的创建和销毁,及其在其上attribute发生的变化,
web应用即ServletContext对象(jsp的隐式对象application)
除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。
二.监听Context
对Context的监听分生命周期的监听,和Context上Attribute变化的监听两种。
1.编写ContextListener
ublic class ContextListener implements ServletContextListener {
//对应当前web应用的销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("web 应用销毁 ");
}
//对应当前web应用的初始化
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("web 应用初始化 ");
}
}
2.配置 web.xml (配置监听器)
<listener>
<listener-class>listener.ContextListener</listener-class>
</listener>
3.测试
web应用的自动重载需要如下前提:
- 配置: server.xml中对应的<context配置 的属性 @reloadable="true"
- 某个servlet 发生了变化,导致这个web应用自动重启
4.编写 ContextAttributeListener
public class ContextAttributeListener implements ServletContextAttributeListener {
//监听属性的增加
@Override
public void attributeAdded(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
}
//监听属性的移除
@Override
public void attributeRemoved(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
}
//监听属性的替换
@Override
public void attributeReplaced(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
}
}
5.配置web.xml
配置ContextAttributeListener
<listener>
<listener-class>listener.ContextAttributeListener</listener-class>
</listener>
6.testContext.jsp
故意造成Context属性的增加,替换和移除
<%
application.setAttribute("test", 1);
application.setAttribute("test", 2);
application.removeAttribute("test");
%>
7.测试
http://127.0.0.1/testContext.jsp
三.监听session
1.编写 SessionListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent e) {
}
@Override
public void sessionDestroyed(HttpSessionEvent e) {
}
}
2.配置web.xml
<listener>
<listener-class>listener.SessionListener</listener-class>
</listener>
3.测试
随意访问任意页面,如果是第一次访问,都会触发session创建,后续访问不会触发session的创建
4.编写 SessionAttributeListener
public class SessionAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent e) { }
public void attributeRemoved(HttpSessionBindingEvent e) { }
public void attributeReplaced(HttpSessionBindingEvent e) { }
}
5.配置web.xml
<listener>
<listener-class>listener.SessionAttributeListener</listener-class>
</listener>
6.testSession.jsp
<%
session.setAttribute("test", 1);
session.setAttribute("test", 2);
session.removeAttribute("test");
%>
7.测试
访问页面http://127.0.0.1/testSession.jsp
四.监听Request
RequestListener 实现接口 ServletRequestListener和ServletRequestAttributeListener
测试
<%
request.setAttribute("test", 1);
request.setAttribute("test", 2);
request.removeAttribute("test");
%>
五.统计在线人数
Http协议是短链接的,所以无法在服务端根据建立多少连接来统计当前有多少人在场,可以通过session多少来估计在线人数
一旦一个用于访问服务器,就会创建一个session,如果用户持续访问,那么该session会持续有效,如果经理30分钟,对应的session也会被销毁。
1.编写 OnlineNumberListener
public class OnlineNumberListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent e) {
//application对象是ServletConntext接口的实例,可以通过reques.getServletContext()来获取,application映射的就是web应用本身
ServletContext application=e.getSession().getServletContext();
Integer online_number=(Integer) application.getAttribute("online_number");
if(null==online_number)
online_number=0;
online_number++;
application.setAttribute("online_number", online_number);
}
public void sessionDestroyed(HttpSessionEvent e) {
ServletContext application=e.getSession().getServletContext();
Integer online_number=(Integer) application.getAttribute("online_number");
if(null==online_number) {
online_number=0;
}
else
online_number--;
application.setAttribute("online_number", online_number);
}
2.配置web.xml
配置 listener.OnlineNumberListener
<listener>
<listener-class>listener.OnlineNumberListener</listener-class>
</listener>
3.checkOnlineNumber.jsp
通过EL表达式,直接获取application中的值
当前 在线人数 : ${online_number}
网友评论