JavaWeb(六)Listener监听器

监听器

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

Servlet监听器

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSessionServletRequest 这三个域对象。

Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。

  • 监听三个域对象创建和销毁的事件监听器
  • 监听域对象中属性的增加和删除的事件监听器
  • 监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。

编写监听器

和编写其它事件监听器一样,编写servlet监听器也需要实现一个特定的接口,并针对相应动作覆盖接口中的相应方法。

和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用<listener>标签配置好监听器,web容器就会自动把监听器注册到事件源中。

一个 web.xml 文件中可以配置多个 Servlet 事件监听器,web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器。

ServletContext监听器

ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。

当 ServletContext 对象被创建时,激发contextInitialized (ServletContextEvent sce)方法

当 ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

servletContext域对象何时创建和销毁:

  • 创建:服务器启动针对每一个web应用创建servletcontext
  • 销毁:服务器关闭前先关闭代表每一个web应用的servletContext
 1 package com.hanqi.listener;
 2
 3 import javax.servlet.ServletContextEvent;
 4 import javax.servlet.ServletContextListener;
 5
 6 public class TestApplicationListener implements ServletContextListener {
 7
 8     @Override
 9     public void contextDestroyed(ServletContextEvent arg0) {
10         System.out.println("application对象销毁");
11     }
12
13     @Override
14     public void contextInitialized(ServletContextEvent arg0) {
15         System.out.println("创建application对象");
16     }
17 }

访问时会在控制台打印“创建application对象”

HttpSession监听器

HttpSessionListener接口用于监听HttpSession的创建和销毁

创建一个Session时,sessionCreated(HttpSessionEvent se) 方法将会被调用。

销毁一个Session时,sessionDestroyed (HttpSessionEvent se) 方法将会被调用。

Session域对象创建和销毁的时机创建:用户每一次访问时,服务器创建session

  • 销毁:如果用户的session 30分钟没有使用,服务器就会销毁session,我们在web.xml里面也可以配置session失效时间

ServletRequest 监听器

ServletRequestListener 接口用于监听ServletRequest 对象的创建和销毁。

Request 对象被创建时,监听器的requestInitialized方法将会被调用。

Request对象被销毁时,监听器的requestDestroyed方法将会被调用。

servletRequest域对象创建和销毁的时机:

  • 创建:用户每一次访问,都会创建一个reqeust
  • 销毁:当前访问结束,request对象就会销毁

当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象

各个域属性监听器中的完整语法定义为:

  • public void attributeAdded(ServletContextAttributeEvent scae)
  • public void attributeAdded (HttpSessionBindingEvent  hsbe)
  • public void attributeAdded(ServletRequestAttributeEvent srae)

监听三个域的属性变化

Servlet规范定义了监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。

这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener ServletRequestAttributeListener

这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。

当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象

各个域属性监听器中的完整语法定义为:

  • public void attributeAdded(ServletContextAttributeEvent scae)
  • public void attributeAdded (HttpSessionBindingEvent  hsbe)
  • public void attributeAdded(ServletRequestAttributeEvent srae)

当删除被监听对象中的一个属性时,web 容器调用事件监听器的这个方法进行相应

各个域属性监听器中的完整语法定义为:

  • public void attributeRemoved(ServletContextAttributeEvent scae)
  • public void attributeRemoved (HttpSessionBindingEvent  hsbe)
  • public void attributeRemoved (ServletRequestAttributeEvent srae)

当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应

各个域属性监听器中的完整语法定义为:

  • public void attributeReplaced(ServletContextAttributeEvent scae)
  • public void attributeReplaced (HttpSessionBindingEvent  hsbe)
  • public void attributeReplaced (ServletRequestAttributeEvent srae)

例子:

 1 package com.hanqi.listener.attr;
 2
 3 import javax.servlet.ServletRequestAttributeEvent;
 4 import javax.servlet.ServletRequestAttributeListener;
 5
 6 public class TestRequestAttributeListener implements ServletRequestAttributeListener {
 7
 8     @Override
 9     public void attributeAdded(ServletRequestAttributeEvent arg0) {
10         System.out.println("request对象添加属性");
11     }
12
13     @Override
14     public void attributeRemoved(ServletRequestAttributeEvent arg0) {
15         System.out.println("移除request属性");
16     }
17
18     @Override
19     public void attributeReplaced(ServletRequestAttributeEvent arg0) {
20         System.out.println("替换request属性");
21     }
22
23 }
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("hanqi", "淄博汉企");//设置request属性
request.removeAttribute("hanqi");移除request属性

session.getCreationTime();//获取session的创建时间

%>
<h1>首页</h1>
<hr>
当前在线人数: <%=application.getAttribute("userCount") %>
<hr>
用户列表:
User [sessionid, session创建时间]
</body>
</html>

应用:统计在线用户数量和用户信息

 1 package com.util;
 2
 3 import java.util.Date;
 4
 5 public class User {
 6     private String sid;
 7     private Date stime;
 8
 9     public String getSid() {
10         return sid;
11     }
12     public void setSid(String sid) {
13         this.sid = sid;
14     }
15     public Date getStime() {
16         return stime;
17     }
18     public void setStime(Date stime) {
19         this.stime = stime;
20     }
21     @Override
22     public String toString() {
23         return "User :sid=" + sid + ", stime=" + stime + "|";
24     }
25 }
 1 package com.listener;
 2
 3 import java.text.SimpleDateFormat;
 4 import java.util.ArrayList;
 5 import java.util.Date;
 6 import java.util.Iterator;
 7
 8 import javax.servlet.annotation.WebListener;
 9 import javax.servlet.http.HttpSession;
10 import javax.servlet.http.HttpSessionEvent;
11 import javax.servlet.http.HttpSessionListener;
12
13 import com.util.User;
14
15 /**
16  * Application Lifecycle Listener implementation class SessionListener
17  *
18  */
19 @WebListener
20 public class SessionListener implements HttpSessionListener {
21
22     private int userCount;//记录在线人数
23     private ArrayList<User> userList;//记录在线人的信息
24     /**
25      * Default constructor.
26      */
27     public SessionListener() {
28         // TODO Auto-generated constructor stub
29     }
30
31     /**
32      * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
33      */
34     //session创建时的方法
35     public void sessionCreated(HttpSessionEvent sessionEvent)  {
36          // TODO Auto-generated method stub
37         userCount++;//用户每一次访问时,服务器创建session,用户数量+1
38         if(userList==null) {
39             userList = new ArrayList<User>();
40         }
41         //获取HttpSession,便于显示,不用每一次都调用
42         HttpSession session = sessionEvent.getSession();
43
44         String sessionid = session.getId();//获取唯一ID
45         long stime = session.getCreationTime();//获取创建时间
46         //调用方法查看是不是已经存在的用户,如果不存在,新建用户存入信息,加到集合中
47         if(!checkUsersSession(sessionid, userList)) {
48             User u = new User();
49             u.setStime(new Date(stime));
50             u.setSid(sessionid);
51             userList.add(u);
52         }
53         //设置session属性,在线人数和在线信息
54         session.getServletContext().setAttribute("userCount", userCount);
55         session.getServletContext().setAttribute("userList", userList);
56     }
57
58     private boolean checkUsersSession(String sessionid, ArrayList<User> userList2) {
59         //查看是不是已经存在的用户,遍历集合,如果集合中有某个元素的id等于传入的id,返回true
60         for(User u : userList2) {
61             if(u.getSid().equals(sessionid)) {
62                 return true;
63             }
64         }
65         return false;
66     }
67
68     /**
69      * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
70      */
71     //session销毁时的方法
72     public void sessionDestroyed(HttpSessionEvent sessionEvent)  {
73         //用户下线,人数-1
74         userCount--;
75         HttpSession session = sessionEvent.getSession();
76
77         String sessionid = session.getId();
78         System.out.println(sessionid + "的用户下线");
79         //获取销毁的用户的sessionid,在从集合中找到,移除
80         if(checkUsersSession(sessionid, userList)) {
81             Iterator<User> iter = userList.iterator();
82             while(iter.hasNext()) {
83                 User u = iter.next();
84                 if(u.getSid().equals(sessionid)) {
85                     iter.remove();
86                 }
87             }
88         }
89         session.getServletContext().setAttribute("userCount", userCount);
90         session.getServletContext().setAttribute("userList", userList);
91     }
92 }
 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8" import="java.util.ArrayList,com.util.User"%>
 3 <%@ page import="java.util.*" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11
12 当前在线人数: <%=application.getAttribute("userCount") %>
13 <hr>
14 在线用户列表:<br>
15 <%
16 List<User> userList = (List<User>)application.getAttribute("userList");//获取application对象,用户信息集合
17 if(userList!=null) {//如果集合不为空,遍历显示
18     for(User u : userList) {
19         out.print(u+"<br>");
20     }
21 }
22 %>
23 </body>
24 </html> 

尝试加一个踢人推出的功能

时间: 2024-10-05 05:42:19

JavaWeb(六)Listener监听器的相关文章

Listener监听器与Filter过滤器

1.Listener [1]监听器简介 > Listener是JavaWeb的三大组件之一,Servlet.Filter.Listener > Listener翻译过来就是监听器 > 现实生活中的监听器: - 监听谁:明星 - 监听器:朝阳群众 - 监听事件:干坏事 - 回调函数:报警 > JavaWeb中的监听器: - 监听谁:ServletContext.HttpSession.ServletRequest - 监听器:自己写 - 监听的事件:生命周期.属性的变化 - 回调函数

JavaWEB过滤器和监听器技术

过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之外.(起到拦截的作用) 传智播客: 一开始大家都是小白,进入传智播客学习,经历了4个月的学习,毕业之后,具有了一定(月薪10000左右)的编码能力. (对每一个经过的学员,都增强了学员的编码能力,起到了增强的作用) JavaWeb中的过滤器的概念: 对请求和响应进行拦截或者增强的对象,就是过滤器.

十:JavaWeb中的监听器(一)

2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件. 2.2.Servlet监听器的分类 在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象 Servlet规范针对这三个对

Java Web总结二十一Listener监听器

一.事件三要素 1.事件源:操作事件的对象,例如:窗体Frame 2.事件监听器:事件监听器监听事件源,例如WindowListner,它是一个接口 3.事件,例如:单击事件,通过事件,可以取得事件源 二.适配器模式 1.当一个接口有较多的方法时,而实现类只需对其中少数几个实现,此时可以使用适配器模式 2.适配器模式常用于GUI编程 三.八种Web监听器 1.Web中有三个事件源,分别是ServletContext->HttpSession->ServletRequest 2.ServletC

(转)JavaWeb开发——Servlet监听器

一.Servlet监听器的概念 Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext.HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件. 监听对象: 1.ServletContext:application,整个应用只存在一个 2.HttpSession:session,针对每一个对话 3.ServletRequest:request,针对每一个客户请求 监听内容:创建.销毁.属性改变

JavaWeb中的监听器

JavaWeb中的监听器 l  事件源:三大域! ServletContext ¨       生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用: 2       void contextInitialized(ServletContextEvent sce):创建SErvletcontext时 2       void contextDestroyed(ServletContextEvent sce):销毁Servletcontext

JavaWeb之Listener&amp;Filter

1. 回顾一下三个作用域 启动tomcat时会创建ServletContext,关闭服务器,将项目从服务器中移除会销毁ServletContext 请求项目中的任何资源都会创建ServletRequest,请求结束,销毁ServletRequest 请求项目中的JSP资源会创建HttpSession,Session过期,服务器正常或非正常退出都会销毁HttpSession 2. Listener 监听器,监听某个事件的发生或状态改变 监听器的内部机制就是接口回调 WEB监听器 总共有8个,划分为

Servlet3.0的注解自定义原生Listener监听器实战

简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战 自定义Listener(常用的监听器 servletContextListener.httpSessionListener.servletRequestListener) 代码示例: RequestListener.java 1 package net.xdclass.demo.listener; 2 3 import javax.servlet.ServletContextEvent; 4 import java

listener监听器的使用

1.listener监听器定义 2.listener监听器的web.xml配置 <listener> <listener-class>listener.MyServletContextListener</listener-class>//只需定义监听器的类 </listener> 3.监听器的分类 原文地址:https://www.cnblogs.com/shouyaya/p/12057029.html