目录
Listener系列教材 (一)- J2EE Listener 监听器教程
Listener系列教材 (二)- 监听 Context
Listener系列教材 (三)- Session
Listener系列教材 (四)- Request
Listener系列教材 (五)- 借助Session监听器统计当前在线人数
Listener系列教材 (一)- J2EE Listener 监听器教程
Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。
web应用即ServletContext对象(jsp的隐式对象application)
除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。
Listener系列教材 (二)- 监听 Context
对Context的监听分生命周期的监听,和Context上Attribute变化的监听两种。
步骤1:编写 ContextListener
步骤2:配置 web.xml
步骤3:测试
步骤4:编写 ContextAttributeListener
步骤5:配置web.xml
步骤6:testContext.jsp
步骤7:测试
步骤 1 : 编写 ContextListener
扫描二维码关注公众号,回复:
10188205 查看本文章
ContextListener 实现接口ServletContextListener
有两个方法
public void contextDestroyed(ServletContextEvent arg0) |
对应当前web应用的销毁
public void contextInitialized(ServletContextEvent arg0) |
对应当前web应用的初始化
package listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println( "web 应用销毁 " ); } @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println( "web 应用初始化 " ); } } |
步骤 2 : 配置 web.xml
配置监听器
< listener > < listener-class >listener.ContextListener</ listener-class > </ listener > |
步骤 3 : 测试
在启动tomcat以及当前web应用重载的时候可以观察到
web应用的自动重载需要如下前提:
1. 配置: server.xml中对应的<context配置 的属性 @reloadable="true"
2. 某个servlet 发生了变化,导致这个web应用自动重启
步骤 4 : 编写 ContextAttributeListener
ContextAttributeListener 实现接口ServletContextAttributeListener,
分别提供如下方法:
public void attributeAdded(ServletContextAttributeEvent e) |
监听属性的增加
public void attributeRemoved(ServletContextAttributeEvent e) |
监听属性的移除
public void attributeReplaced(ServletContextAttributeEvent e) |
监听属性的替换
package listener; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; public class ContextAttributeListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent e) { System.out.println( "增加属性 " ); System.out.println( "属性是" + e.getName()); System.out.println( "值是" + e.getValue()); } @Override public void attributeRemoved(ServletContextAttributeEvent e) { // TODO Auto-generated method stub System.out.println( "移除属性 " ); } @Override public void attributeReplaced(ServletContextAttributeEvent e) { // TODO Auto-generated method stub System.out.println( "替换属性" ); } } |
步骤 5 : 配置web.xml
配置ContextAttributeListener
< listener > < listener-class >listener.ContextAttributeListener</ listener-class > </ listener > |
步骤 6 : testContext.jsp
故意造成Context属性的增加,替换和移除
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% application.setAttribute("test", 1); application.setAttribute("test", 2); application.removeAttribute("test"); %> |
步骤 7 : 测试
访问页面进行测试
http: //127.0.0.1/testContext.jsp |
Listener系列教材 (三)- Session
对Session的监听分生命周期的监听,和Session上Attribute变化的监听两种。
步骤1:编写 SessionListener
步骤2:配置web.xml
步骤3:测试
步骤4:编写 SessionAttributeListener
步骤5:配置web.xml
步骤6:testSession.jsp
步骤7:测试
步骤 1 : 编写 SessionListener
SessionListener 实现了接口 HttpSessionListener
表示session创建的时候执行
表示session销毁的时候执行
package listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent e) { System.out.println( "监听到 session 创建, sessionid 是: " + e.getSession().getId()); } @Override public void sessionDestroyed(HttpSessionEvent e) { System.out.println( "监听到 session 销毁, sessionid 是: " + e.getSession().getId()); } } |
步骤 2 : 配置web.xml
配置SessionListener
< listener > < listener-class >listener.SessionListener</ listener-class > </ listener > |
步骤 3 : 测试
随意访问任意页面
如果是第一次访问,都会触发session创建,后续访问不会触发session的创建
关闭浏览器,再访问,也会触发session的创建。 但是有的浏览器,即便是关闭了,下一次打开,也会发送以前sessionid到服务器,这样服务器就不会创建新的session。 请参考 session原理示意图
session的销毁不易观察到,一般说来服务器会设置session存活时间为30分钟。所以需要等待才能观察到销毁
注: 在重启tomcat测试之前, 要删除D:\tomcat\work\Catalina\localhost\_\SESSIONS.ser 这个文件。 这个文件是tomcat存放以前的session的,为了观察到创建session的活动,需要tomcat重启之前把以前的session都清除掉,才能观察到新创建session的活动
步骤 4 : 编写 SessionAttributeListener
SessionAttributeListener 实现接口 HttpSessionAttributeListener
当在session中增加属性时触发
当在session中移除属性时触发
当替换session中的属性时触发
package listener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class SessionAttributeListener implements HttpSessionAttributeListener { @Override public void attributeAdded(HttpSessionBindingEvent e) { System.out.println( "session 增加属性 " ); System.out.println( "属性是" + e.getName()); System.out.println( "值是" + e.getValue()); } @Override public void attributeRemoved(HttpSessionBindingEvent e) { // TODO Auto-generated method stub System.out.println( "session 移除属性 " ); } @Override public void attributeReplaced(HttpSessionBindingEvent e) { // TODO Auto-generated method stub System.out.println( "session 替换属性 " ); } } |
步骤 5 : 配置web.xml
配置 listener.SessionAttributeListener
< listener > < listener-class >listener.SessionAttributeListener</ listener-class > </ listener > |
步骤 6 : testSession.jsp
在testSession.jsp中,设置session属性 test=1,test=2, 接着删除
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% session.setAttribute("test", 1); session.setAttribute("test", 2); session.removeAttribute("test"); %> |
步骤 7 : 测试
访问页面
http: //127.0.0.1/testSession.jsp |
观察结果
Listener系列教材 (四)- Request
对Request的监听分生命周期的监听,和Request上Attribute变化的监听两部分。
步骤1:编写 RequestListener
步骤2:配置web.xml
步骤3:testRequest.jsp
步骤4:测试
步骤 1 : 编写 RequestListener
RequestListener 实现接口 ServletRequestListener和ServletRequestAttributeListener
当新创建了一个Request的时候触发,只要访问了服务端的资源,就会创建一个Request,无论是jsp,servlet还是html
当本次请求结束的时候触发
当有新增属性时触发
当有替换属性时触发
当有移除属性时触发
package listener; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener { @Override public void requestDestroyed(ServletRequestEvent arg0) { System.out.println( "销毁了一个Request " ); } @Override public void requestInitialized(ServletRequestEvent arg0) { System.out.println( "创建了一个Request " ); } @Override public void attributeAdded(ServletRequestAttributeEvent e) { System.out.println( "request 增加属性 " ); System.out.println( "属性是" + e.getName()); System.out.println( "值是" + e.getValue()); } @Override public void attributeRemoved(ServletRequestAttributeEvent arg0) { System.out.println( "request 移除属性 " ); } @Override public void attributeReplaced(ServletRequestAttributeEvent arg0) { System.out.println( "request 替换属性 " ); } } |
步骤 2 : 配置web.xml
< listener > < listener-class >listener.RequestListener</ listener-class > </ listener > |
步骤 3 : testRequest.jsp
测试页面,先在request中设置test,然后替换,最后移出掉test
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setAttribute("test", 1); request.setAttribute("test", 2); request.removeAttribute("test"); %> |
步骤 4 : 测试
访问页面
http: //127.0.0.1/testRequest.jsp |
观察测试结果
Listener系列教材 (五)- 借助Session监听器统计当前在线人数
HTTP协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。 不过可以通过统计session有多少来估计在线人数。
一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。
如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。
所以可以通过统计有多少session被保留来估计当前在线人数。
步骤1:编写 OnlineNumberListener
步骤2:配置web.xml
步骤3:checkOnlineNumber.jsp
步骤4:测试
步骤 1 : 编写 OnlineNumberListener
OnlineNumberListener 实现接口HttpSessionListener
当创建一个session的时候,就把数字+1,并且放在application里。
ServletContext application = e.getSession().getServletContext(); |
这就是jsp里的application
注: 第一次从application里取数据的时候,是空的,要设置为0。
当销毁一个session的时候,把这个数字-1
package listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class OnlineNumberListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent e) { 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); System.out.println( "新增一位在线用户" ); } @Override 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); System.out.println( "一位用户离线" ); } } |
步骤 2 : 配置web.xml
配置 listener.OnlineNumberListener
< listener > < listener-class >listener.OnlineNumberListener</ listener-class > </ listener > |
步骤 3 : checkOnlineNumber.jsp
通过EL表达式,直接获取application中的值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> 当前 在线人数 : ${online_number} |
步骤 4 : 测试
访问网页
http: //127.0.0.1/checkOnlineNumber.jsp |
注: 在重启tomcat测试之前, 要删除D:\tomcat\work\Catalina\localhost\_\SESSIONS.ser 这个文件。 这个文件是tomcat存放以前的session的,为了观察到创建session的活动,需要tomcat重启之前把以前的session都清除掉,才能观察到新创建session的活动
更多内容,点击了解: https://how2j.cn/k/listener/listener-tutorials/604.html?p=81777