JavaWeb -- sevlet 监听器
1.三个域对象的监听(创建和销毁) servletContext, session, request 监听器
ServletContext监听器:
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Context 初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Context 销毁");
}
}
web.xml 配置
<listener>
<listener-class>com.kevin.web.listener.MyServletContextListener</listener-class>
</listener>
Session监听器:
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session 创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session 摧毁");
}
}
Request监听器:
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request 创建");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request 销毁");
}
}
监听器还可以监听三个域中所添加的属性变化:
public class MyServletContextAttributeListener implements
ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent scab) { System.out.println(scab.getValue());
System.out.println("加东西了!!"); } public void attributeRemoved(ServletContextAttributeEvent scab) {
System.out.println("删东西了!!");
} public void attributeReplaced(ServletContextAttributeEvent scab) {
System.out.println("替换东西了!!");
}
}
public class MyRequestAndSessionAttributeListener implements
HttpSessionAttributeListener, ServletRequestAttributeListener { public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("session中加东西了!!");
} public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("session中删东西了!!");
} public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("session中替换东西了!!");
} public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("request中加东西了!!");
} public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("request中删东西了!!");
} public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("request中替换东西了!!");
}
}
HttpSessionBindingListener HttpSessionActivationListener 这两个监听器 不需要再web.xml文件中配置
public class MyBean implements HttpSessionBindingListener {
private String name;
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("自己被加到session中了");
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("自己被session踢出来了");
}
}
public class MyBean2 implements HttpSessionActivationListener,Serializable {
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("session从硬盘回到内存了");
}
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("session被序列化到硬盘了");
}
}
2. 实例: 在线人数计数器
public class OnLineCountListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer num = (Integer) context.getAttribute("num");
if(num==null)
context.setAttribute("num", 1);
else
{
num++;
context.setAttribute("num", num);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer num = (Integer) context.getAttribute("num");
if(num==null)
context.setAttribute("num", 1);
else
{
num--;
context.setAttribute("num", num);
}
}
}
3. 实例: 自定义session扫描器
public class SessionScanerListener implements HttpSessionListener,ServletContextListener {
private List<HttpSession> list = Collections.synchronizedList( new LinkedList<HttpSession>());
private Integer lock = 0;
@Override
public void contextInitialized(ServletContextEvent sce) {
Timer timer = new Timer();
timer.schedule(new MyTask(list, lock) , 0, 1000*15);
}
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
synchronized (lock) {
list.add(session);
}
System.out.println(session + "创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session + "销毁了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
class MyTask extends TimerTask
{
private List<HttpSession> list;
private Integer lock;
public MyTask(List<HttpSession> list, Integer lock)
{
this.list = list;
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
System.out.println("定时器启动了");
ListIterator<HttpSession> it = list.listIterator();
while(it.hasNext())
{
HttpSession session = it.next();
if(System.currentTimeMillis()-session.getLastAccessedTime() > 1000*15)
{
session.invalidate();
list.remove(session);
}
}
}
}
}
JavaWeb -- sevlet 监听器的更多相关文章
- JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用
JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...
- JavaWeb基础—监听器Listener
javaWeb三大组件: servlet listener(用的不多) filter 什么叫监听器: 初次相见:AWT 二次相见:SAX(XML解析时)Bundle 绑定 监听器是一个接口,内容由我们 ...
- JavaWeb中监听器
一.事件源:三大域! ServletContext 生命周期监听:ServletContextListener,它有两个方法,一个在创建时调用,一个在销毁时调用: void contextIniti ...
- JavaWeb 之监听器
1. JavaWeb 监听器概述 在 JavaWeb 被监听的事件源为: ServletContext, HttpSession, ServletRequest, 即三大域对象. 监听域对象" ...
- Javaweb基础--->监听器listener(转发)
JavaWeb中的监听器 1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Servl ...
- IT兄弟连 JavaWeb教程 监听器1
1 基本概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...
- 深入分析JavaWeb Item38 -- 监听器(Listener)高速学习
一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其它对象身上发生的事件或状态改变进行监听和对应处理的对象,当被监视的对象发生情况时,马上採取对应的行动.监听器事实上就是一个实现特定接口的普 ...
- 深入分析JavaWeb Item39 -- 监听器(Listener)学习进阶
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- javaweb之监听器详解
在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...
随机推荐
- JQuery实现动态生成树形菜单
jQuery实现动态生成树形菜单 有一个需求:菜单导航条需要依据不同的权限动态提取出来.计划是将功能模块与用户权限之间的关系保持到一个配置表中.所以功能菜单的话就需要动态提取出来再显示.借助jquer ...
- iOS学习笔记(六)——ViewController
ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图.iOS的SDK中提供很多原生ViewController ...
- 1280 前缀后缀集合(map)
1280 前缀后缀集合 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个数组包含N个正整数,其中有些是重复的.一个前缀后缀集是满足 ...
- Oracle 常用
1. 级联查询 在ORACLE 数据库中有一种方法可以实现级联查询select * //要查询的字段from table //具有子接点ID与父 ...
- JavaScript和jQuery改变标签内容
HTML: <div id="mazey">content</div> JavaScript: var mazey=document.getElementB ...
- Connection cannot be null when 'hibernate.dialect' not set
严重: Exception sending context initialized event to listener instance of class [org.springframework.w ...
- django实现密码加密的注册(数据对象插入)
在 django实现密码非加密的注册(数据对象插入)的基础上,我们对视图和注册页面进行了简单修改 视图 from django.shortcuts import render,redirect,ren ...
- MySQL中自适应哈希索引
自适应哈希索引采用之前讨论的哈希表的方式实现,不同的是,这仅是数据库自身创建并使用的,DBA本身并不能对其进行干预.自适应哈希索引近哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如SEL ...
- Python如何实现单例模式?其他23种设计模式python如何实现?
#使用__metaclass__(元类)的高级python用法 class Singleton2(type): def __init__(cls, name, bases, dict): super( ...
- 《Deep learning》第四章——数值计算
数值计算 机器学习算法通常需要大量的数值计算.这通常是指通过迭代过程更新解的估计值来解决数学问题的算法,而不是通过解析过程推导出公式来提供正确解的方法.常见的操作包括优化(找到最小化或最大化函数值的参 ...