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 监听器的更多相关文章

  1. JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用

    JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...

  2. JavaWeb基础—监听器Listener

    javaWeb三大组件: servlet listener(用的不多) filter 什么叫监听器: 初次相见:AWT 二次相见:SAX(XML解析时)Bundle 绑定 监听器是一个接口,内容由我们 ...

  3. JavaWeb中监听器

     一.事件源:三大域! ServletContext 生命周期监听:ServletContextListener,它有两个方法,一个在创建时调用,一个在销毁时调用: void contextIniti ...

  4. JavaWeb 之监听器

    1. JavaWeb 监听器概述 在 JavaWeb 被监听的事件源为: ServletContext, HttpSession, ServletRequest, 即三大域对象. 监听域对象" ...

  5. Javaweb基础--->监听器listener(转发)

    JavaWeb中的监听器 1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Servl ...

  6. IT兄弟连 JavaWeb教程 监听器1

    1  基本概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...

  7. 深入分析JavaWeb Item38 -- 监听器(Listener)高速学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其它对象身上发生的事件或状态改变进行监听和对应处理的对象,当被监视的对象发生情况时,马上採取对应的行动.监听器事实上就是一个实现特定接口的普 ...

  8. 深入分析JavaWeb Item39 -- 监听器(Listener)学习进阶

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  9. javaweb之监听器详解

    在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...

随机推荐

  1. MYSQL存储引擎介绍--应用场景

    MySQL存储引擎通常有哪3种?各自分别有什么特点?应用场景是哪些? MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默 ...

  2. PHP替换字符串-str_replace

    实例 把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai": <?php echo str_ ...

  3. STL学习笔记— —容器map和multimap

    简单介绍 在头文件<map> 中定义 namespace std { template <typename Key, typename T, typename Compare = l ...

  4. pycharm 用鼠标滚动调整字体大小

  5. Java基础—序列化与反序列化(转载)

    转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...

  6. AWK Demo

    AWK is so poweful. AWK功能太强大了: @1:处理格式化文本(感觉主要还是以这个为主) @2:对文本逐行进行处理(过滤某些行,保留符合条件的) @3:将文件根据不同的条件分成多个文 ...

  7. dataTables的用法

    原地址:http://blog.csdn.net/mickey_miki/article/details/8240477 1.DataTables的默认配置 $(document).ready(fun ...

  8. active scaffold

    模板文件路径:/.rvm/gems/ruby-2.2.3/gems/active_scaffold-3.5.3/app/views/active_scaffold_overrides

  9. Oracle索引(2)索引的修改与维护

    修改索引   利用alter index语句可以完成的操作 重建或合并索引 回收索引未使用的空间或为索引非配新空间 修改索引是否可以并行操作及并行度 修改索引的存储参数以及物理属性 指定Logging ...

  10. Springboot WebSocket例子

    Springboot整合WebSocket 1.application.properties #设置服务端口号 server.port=8080 #thymeleaf配置 #是否启用模板缓存. spr ...