java监听器(Listener)学习笔记
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动
而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些
固定的对象等等。首先来看一下ServletContextListener接口的源代码:
public abstract interface ServletContextListener extends EventListener{
public abstract void contextInitialized(ServletContextEvent paramServletContextEvent);
public abstract void contextDestroyed(ServletContextEvent paramServletContextEvent);
}
根据ServletContextListener监听器对数据库连接池DataSource的初始化演示它的使用:ListenerWW.java
package listener; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; /**
* 现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的
* 服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化
* 的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
* 示例代码:使用监听器对数据库连接池DataSource进行初始化
*/
public class ListenerWW implements ServletContextListener { //销毁方法
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
// 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空
servletContext.removeAttribute("dataSource");
System.out.println("销毁工作完成...");
} //初始化方法
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 通过这个事件可以获取整个应用的空间
ServletContext servletContext = servletContextEvent.getServletContext();
// 在整个web应用下面启动的时候做一些初始化的内容添加工作
// 未导入对应jar包
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("com.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysqlocalhost:3306/");
basicDataSource.setUsername("root");
basicDataSource.setPassword("root");
basicDataSource.setMaxActive(10);//最大连接数
basicDataSource.setMaxIdle(5);//最大管理数 // 把 DataSource 放入ServletContext空间中,
// 供整个web应用的使用(获取数据库连接)
servletContext.setAttribute("dataSource", basicDataSource);
System.out.println("应用监听器初始化工作完成...");
System.out.println("已经创建DataSource..."); } }
配置监听器的web.xml
<!-- 配置监听器 -->
<listener>
<listener-class>listener.ListenerWW</listener-class>
</listener>
监听器在实际项目中的应用,监听器在java web中应用的较多,比如:统计当前在线人数、自定义session扫描器。
--------------------- 应用一:统计当前在线人数 ---------------------
代码实现:
package listener; import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* 说说Session的监听器Listener,它是实现了javax.servlet.HttpSessionListener 接口的
* 例子:在线人数统计
* @author 旺旺
*/
public class ListenerWW implements HttpSessionListener { //在线总人数
private static int onLinePersonCount = 0; //session创建
public void sessionCreated(HttpSessionEvent sessionEvent) {
//获取Servlet上下文
ServletContext servletContext = sessionEvent.getSession().getServletContext();
onLinePersonCount = (Integer) servletContext.getAttribute("onLinePersonCount");
// 如果用户登录,TOTAL_ONLINE_USERS自增1
onLinePersonCount++;
servletContext.setAttribute("TOTAL_ONLINE_USERS", onLinePersonCount); } //session销毁
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
//获取Servlet上下文
ServletContext servletContext = sessionEvent.getSession().getServletContext();
onLinePersonCount = (Integer) servletContext.getAttribute("onLinePersonCount");
// 如果用户登录,TOTAL_ONLINE_USERS自增1
onLinePersonCount--;
servletContext.setAttribute("TOTAL_ONLINE_USERS", onLinePersonCount);
} }
再来一个例子,扫描Session,清理长时间没有操作的用户
监听实例:
package listener; import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* 当网站用户量增加时,session占用的内存会越来越大,这时session的管理,将会是一项很大的
* 系统开销,为了高效的管理session,我们可以写一个监听器,定期清理掉过期的session
* @author 旺旺
*/
public class ListenerWW implements HttpSessionListener,ServletContextListener { // 创建一个线程安全的集合,用来存储session
List<HttpSession> sessionList = Collections.synchronizedList(new LinkedList<HttpSession>());
private Object lock = new Object(); //session创建
public void sessionCreated(HttpSessionEvent sessionEvent) {
HttpSession httpSession = sessionEvent.getSession();
synchronized (lock){
sessionList.add(httpSession);
} } //session销毁
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
HttpSession httpSession = sessionEvent.getSession();
synchronized (lock){
sessionList.remove(httpSession);
}
} // web应用关闭时触发contextDestroyed事件
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("web应用关闭...");
} // web应用启动时触发contextInitialized事件
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("web应用初始化...");
// 创建定时器
Timer timer = new Timer();
// 每隔30秒就定时执行任务
timer.schedule(new WTask(sessionList,lock), 0, 1000*30);
} }
定时任务处理类
package listener; import java.util.List;
import java.util.ListIterator;
import java.util.TimerTask; import javax.servlet.http.HttpSession; public class WTask extends TimerTask{ private List<HttpSession> list;
// 存储传递过来的锁
private Object lock;
// 构造方法
WTask(List<HttpSession> list, Object lock){
this.list = list;
this.lock = lock;
} @Override
public void run() {
// 考虑到多线程的情况,这里必须要同步
synchronized (lock) {
ListIterator<HttpSession> sessionIterator = list.listIterator();
while(sessionIterator.hasNext()) {
//五分钟没有访问后台
// httpSession.getLastAccessedTime() = session的最后访问时间
HttpSession httpSession = sessionIterator.next();
if((System.currentTimeMillis() - httpSession.getLastAccessedTime()) > 1000*60*5) {
// 手动销毁session
httpSession.invalidate();
// 从集合中移除已经被销毁的session
sessionIterator.remove();
}
}
/*for(HttpSession httpSession : list) {
//五分钟没有访问后台
// httpSession.getLastAccessedTime() = session的最后访问时间
if((System.currentTimeMillis() - httpSession.getLastAccessedTime()) > 1000*60*5) {
// 手动销毁session
httpSession.invalidate();
// 从集合中移除已经被销毁的session
list.remove(httpSession);
}
}*/
}
} }
java监听器(Listener)学习笔记的更多相关文章
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- Java安全防御学习笔记V1.0
Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
随机推荐
- Python数据类型之list和tuple
list是一种有序的集合,可以随时添加和删除其中的元素. 用len()函数可以获得list元素的个数. 用索引来访问list中每一个位置的元素,索引是从0开始的.如果要取最后一个元素,除了计算索引位置 ...
- Prometheus Node_exporter 之 Network Netstat TCP Linux MIPs
Network Netstat TCP Linux MIPs1. TCP Aborts / Tiemouts type: GraphUnit: shortLabel: ConnectionsTCPAb ...
- guid是否为空的判断
Guid类型的变量不会为空,初始化没有赋值的GUID应该是00000000-0000-0000-0000-000000000000 . 正确的判断应该是if(Guid testId== Guid.Em ...
- zabbix agent 3.4 安装指南
从官方网站www.zabbix.com 下载zabbix agent安装包.目前最新版本是4.0 LTS release. 在需要监控的服务器上安装zabbix agent. 先解压安装包. 配置 c ...
- .net 操作MongoDB 基础
1. 下载驱动,最好使用 NuGet 下载,直接搜索MongoDB: 2. 引用相关驱动 3. 部分测试代码,主要是针对MongoDB的GridFS 文件存储来用 using Mongo.Model; ...
- C#-老生常谈的 值类型与引用类型
特殊的String 说起值类型和引用类型,大家都知道这么个事,很多时候我们会拿String做值类型来做比较,但实际上String虽然是值类型,却表现的有点特别 String示例 看下面的一个例子: 话 ...
- 在eclipse中方便的比较各个语言 资源文件—jinto的安装
一.下载与安装jinto Eclipse插件的插件,用来解决资源文件的国际化问题 用jinto编辑器打开properties文件后,就可以方便的建立出各国和各种语言的资源文件,同时可以方便的对比书写各 ...
- nginx 添加虚拟主机 支持php 伪静态
1添加虚拟主机 进入 /usr/local/nginx/conf/vhost 目录, 创建虚拟主机配置文件 demo.neoease.com.conf ({域名}.conf). 2. 打开配置文件, ...
- Pre标签 自动换行
<pre> 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre> 标签的一个常见应用就是用来表示计算机的源代码 ...
- ArcGIS API for Javascript之专题图的制作(四)热力图渲染(上)
一 .热力图定义 热力图(heat map)也称热图,是以特殊颜色高亮区域的形式表示密度.温度.气压.频率等分布的不易理解和表达的数据. 二.HeatmapRenderer esri/renderer ...