一、概念

servlet监听器的主要目的是给web应用增加事件处理机制,以便更好的监视和控制web应用的状态变化,从而在后台调用相应处理程序。

二、监听器的类型

1.根据监听对象的类型和范围,分为3类

Request事件监听器

HttpSession事件监听器

ServletContext事件监听器

2.八个监听接口和六个监听事件

三、ServletContext监听

1.Application对象

application是ServletContext的实例,由JSP容器默认创建。Servlet中调用getServletContext()方法得到ServletContext的实例。

全局对象即Application范围的对象,初始化阶段的变量值在web.xml中,经由<context-param>元素所设定的变量,它的范围也是Application的范围

2.ServletContextListener接口

用于监听Web应用启动和销毁的事件,监听器类需要实现ServletContextListener接口。

该接口的主要方法;

void contextInitialized(ServletContextEvent se):通知正在接受的对象,应用程序已经被加载及初始化

void contextDestroyed(ServletContextEvent se):通知正在接受的对象,应用程序已经被销毁

ServletContextEvent的主要方法:ServletContext getServletContext():取得当前的ServletContext对象

3.ServletContextAttributeListener

用于监听Web应用属性改变的事件,包括增加、删除、修改属性。监听器类需要实现ServletContextAttributeListener接口

ServletContextAttributeListener接口的主要方法:

void attributeAdded(ServletContextAttributeEvent se):若有对象加入Application的范围,通知正在收听的对象。

void attributeRemoved(ServletContextAttributeEvent se):若有对象从Application范围移除,通知正在收听的对象。

void attributeReplaced(ServletContextAttributeEvent se):若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象

ServletContextAttributeEvent中的主要方法:

getName():返回属性名称

getValue()返回属性的值

四、HttpSession 会话监听

1.HttpSessionListener

主要方法:

sessionCreated(HttpSessionEvent se):session创建

sessionDestroyed(HttpSessionEvent se):session销毁

2.HttpSessionActivationListener:

监听器监听Http会话的情况

3.HttpSessionAttributeListener:

监听HttpSession中属性的操作

该接口的主要方法:

void attributeAdded(HttpSessionBindingEvent se):监听Http会话中的属性添加

void attributeRemoved(HttpSessionBindingEvent se):监听Http会话中的属性移除

void attributeReplaced(HttpSessionBindingEvent se):监听Http会话中的属性更改操作

4.HttpSessionBindingListener

监听Http会话中对象的绑定信息

getSession():获取session对象

getName():返回session增加、删除、或替换的属性名称

getValue():返回session增加、删除、或替换的属性值

五、ServletRequest监听

可以监听客户端的请求

1.ServletRequestListener接口

用于监听客户端的请求初始化和销毁事件,需要实现ServletRequestListener接口
接口中的方法:
requestInitialized(ServletRequestEvent):通知当前对象请求已经被加载及初始化
requestDestroyed(ServletRequestEvent):通知当前对象,请求已经被消除
ServletRequestEvent实例中的方法
getServletRequest():获取ServletRequest对象
getServletContext():获取ServletContext对象
2.ServletRequestAttributeListener
用于监听Web应用属性改变的事件,包括增加属性、删除属性、修改属性
接口方法:
void attributeAdded(ServletRequestAttributeEvent e):向Request对象添加新属性
void attributeRemoved(ServletRequestAttributeEvent e):从request对象中删除属性
void attributeReplaced(ServletRequestAttributeEvent e):替换对象中现有属性值
ServletRequestAttributeEvent中的主要方法:
getName():返回Request增加、删除、或替换的属性名称
getValue():返回Request增加、删除、或替换的属性的值

六、存储在线用户信息的例子

1.login.jsp页面实现用户登录

  1. <body>
  2. <form method="get" action="logindo">
  3. <center>
  4. <h2>用户登录</h2>
  5. <hr />
  6. <br /> 用户名: <input type="text" name="userName" /> <br />
  7. <input type="submit" value="登录" />
  8. </center>
  9. </form>
  10. </body>

2.建立存储用户信息的类:UserList.java

  1. package listener;
  2. import java.util.Vector;
  3. public class UserList {
  4. private static Vector online = new Vector();
  5. //添加在线人数
  6. public static void addUser(String userName){
  7. online.addElement(userName);
  8. }
  9. //移除在线人数
  10. public static void removeUser(String userName){
  11. online.removeElement(userName);
  12. }
  13. //获取在线用户数量
  14. public static int getUserCount(){
  15. return online.size();
  16. }
  17. public static Vector getVector(){
  18. return online;
  19. }
  20. }

****Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小。

Vector 有三个构造函数, 
public Vector(int initialCapacity,int capacityIncrement)  

public Vector(int initialCapacity)

public Vector()   

Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。第二个构造函数只创建初始存储容量。第三个构造函数既不指定初始的存储容量也不指定capacityIncrement。   

Vector 类提供的访问方法支持类似数组运算和与Vector 大小相关的运算。类似数组的运算允许向量中增加,删除和插入元素。

****

3.写监听器类

  1. package listener;
  2. import javax.servlet.http.HttpSessionAttributeListener;
  3. import javax.servlet.http.HttpSessionBindingEvent;
  4. import javax.servlet.http.HttpSessionEvent;
  5. import javax.servlet.http.HttpSessionListener;
  6. public class OnlineListener implements HttpSessionListener,HttpSessionAttributeListener{
  7. //监听Http会话中的属性添加
  8. public void attributeAdded(HttpSessionBindingEvent se) {
  9. // TODO Auto-generated method stub
  10. UserList.addUser(String.valueOf(se.getValue()));//增加一个用户
  11. System.out.println("session("+se.getSession().getId()+")增加属性"+se.getName()+",值为"+se.getValue());
  12. }
  13. //监听Http会话中的属性移除
  14. public void attributeRemoved(HttpSessionBindingEvent se) {
  15. // TODO Auto-generated method stub
  16. UserList.removeUser(String.valueOf(se.getValue()));
  17. System.out.println(se.getValue()+"属性已移除");
  18. }
  19. //监听Http会话中的属性更改操作
  20. public void attributeReplaced(HttpSessionBindingEvent se) {
  21. // TODO Auto-generated method stub
  22. String oldValue=String.valueOf(se.getValue());//旧的属性
  23. String newValue=String.valueOf(se.getSession().getAttribute(se.getName()));//新的属性
  24. UserList.removeUser(oldValue);//移除旧的属性
  25. UserList.addUser(newValue);//增加新的属性
  26. System.out.println(oldValue+"属性已更改为"+newValue);
  27. }
  28. public void sessionCreated(HttpSessionEvent se) {
  29. // TODO Auto-generated method stub
  30. System.out.println("会话已创建!");
  31. }
  32. public void sessionDestroyed(HttpSessionEvent se) {
  33. // TODO Auto-generated method stub
  34. System.out.println("会话已销毁!");
  35. }
  36. }

4.建立用户登录类LoginServlet.java

  1. package listener;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. public class LoginServlet extends HttpServlet{
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  11. throws ServletException, IOException {
  12. // TODO Auto-generated method stub
  13. String userName=req.getParameter("userName");//获取前台传来的userName属性
  14. HttpSession session = req.getSession();
  15. session.setAttribute("userName", userName);//将属性保存到session会话中
  16. resp.sendRedirect("index.jsp");//重定向到index.jsp页面
  17. }
  18. @Override
  19. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  20. throws ServletException, IOException {
  21. // TODO Auto-generated method stub
  22. doGet(req, resp);
  23. }
  24. }

5.建立退出登录类

  1. package listener;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class ExitServlet extends HttpServlet{
  8. @Override
  9. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  10. throws ServletException, IOException {
  11. // TODO Auto-generated method stub
  12. req.getSession().removeAttribute("userName");//从session中移除对象
  13. resp.sendRedirect("login.jsp");//重定向到用户登录页面
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  17. throws ServletException, IOException {
  18. // TODO Auto-generated method stub
  19. doGet(req, resp);
  20. }
  21. }

6.在web.xml中配置监听器、登录和退出的Servlet

  1. <!-- 配置监听器 -->
  2. <listener>
  3. <listener-class>listener.OnlineListener</listener-class>
  4. </listener>
  5. <!-- 配置servlet -->
  6. <servlet>
  7. <servlet-name>LoginServlet</servlet-name>
  8. <servlet-class>listener.LoginServlet</servlet-class>
  9. </servlet>
  10. <servlet>
  11. <servlet-name>ExitServlet</servlet-name>
  12. <servlet-class>listener.ExitServlet</servlet-class>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>LoginServlet</servlet-name>
  16. <url-pattern>/logindo</url-pattern>
  17. </servlet-mapping>
  18. <servlet-mapping>
  19. <servlet-name>ExitServlet</servlet-name>
  20. <url-pattern>/exitdo</url-pattern>
  21. </servlet-mapping>

7.编写index.jsp在线首页

    1. <body>
    2. <%
    3. //如果未登录,转向登录页面
    4. if (session.getAttribute("userName") == null) {
    5. response.sendRedirect("login.jsp");
    6. }
    7. Vector onlineUsers = UserList.getVector(); //获取存储在线用户名的vector对象
    8. %>
    9. <center>
    10. <br />
    11. <br />
    12. <h2>登录成功</h2>
    13. <hr />
    14. <br /> 欢迎你 <span style="color:red;"> <%=session.getAttribute("userName")%>
    15. </span>      <a href="exitdo">退出登录</a> <br />
    16. <br /> 当前在线人数:<span style="color:red;"> <%=UserList.getUserCount()%>人</span>
    17. <br />
    18. <br> 在线用户名单 : <br /> <select multiple="multiple" name="list"
    19. style="width:200px;height:250px">
    20. <%
    21. for (int i = 0; i < onlineUsers.size(); i++) {
    22. out.write("<option>" + onlineUsers.get(i) + "</option>");
    23. }
    24. %>
    25. </select>
    26. </center>
    27. </body>

Servlet监听器——实现在线登录人数统计小例子的更多相关文章

  1. 过滤器和监听器实现用户的在线登录人数,以及设置session时长。

    过滤器: package com.bjsxt.filter; import java.io.IOException; import javax.servlet.Filter; import javax ...

  2. Servlet监听器及在线用户

    Servlet中的监听器分为三种类型Ⅰ 监听ServletContext.Request.Session作用域的创建和销毁 (1)ServletContextListener (2)HttpSessi ...

  3. Servlet 实现訪问量的统计小案例

    今天学习了Servlet的基础知识,学习了一个统计訪问量的小案例,记录一下 package cn.selevet_01; import java.io.IOException; import java ...

  4. Servlet监听器统计网站在线人数

    本节我们利用 Servlet 监听器接口,完成一个统计网站在线人数的案例.当一个用户登录后,显示欢迎信息,同时显示出当前在线人数和用户名单.当用户退出登录或 Session 过期时,从在线用户名单中删 ...

  5. Servlet监听器统计在线人数

    监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应. 例1 应用Servlet监听器统计在线人数. (1)创 ...

  6. 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...

  7. ASP.NET MVC使用SignalR统计在线用户人数

    学到新东西就记录一下.也许正好有人需要~~~~~~ 由于需要记录当前在线用户,emmmm又是没做过的... 本来想用数据库的形式,但是想想这么简单的功能百度肯定有.遨游一波百度,有所收获.... 虽然 ...

  8. java之Servlet监听器Listener

    常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...

  9. Java进阶(十三)servlet监听器

    servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...

随机推荐

  1. python学习之路(2)(渗透信息收集)

    scapy的用法 通过目标ip的回复判断目标ip主机的情况 先写上三层的IP 四层的TCP 然后r.display看一下我们的包 src是源ip dst是目标ip 我们添加目标ip 这里是网关的ip ...

  2. shell定义

    用户输入的命令并且把它们送到内核.不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序. Shell编程语言具有普通编程语言的很多特点 无图形化界面时与lin ...

  3. 《信息安全系统设计基础》--Myod

    Myod 回顾Makefile 任务详情 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Mak ...

  4. Oracle中关键字like的使用总结

    Like 模糊查询 占位符 %  任意个数字符 _  一个字符 查询 用户名以‘S’开头的员工信息 Select * from emp where ename like 'S%' 查询用户名第二个字母 ...

  5. 石川es6课程---3、变量let和常量const

    石川es6课程---3.变量let和常量const 一.总结 一句话总结: let非常好用,尤其是let的块级作用域可以解决之前要(function(){})()立刻执行函数做的块级作用域 1.js中 ...

  6. go GTK msys2

    1 下载安装msys2 MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境.同时它也是一个在Cygwin (POSIX 兼容性层) 和 ...

  7. Python 抓取数据存储到Redis中

    redis是一个key-value存储结构.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  8. ORCAD导网表:遇"No_connect" property

    问题: Orcad Capture中将No Connect标识放置到了原本应该放置连线的管脚上,不知道怎么删除. 虽然添加一根Wire可以掩盖该管脚上已经添加的No Connect标识,但是到处网表的 ...

  9. WireShark简单使用以及TCP三次握手

    最近一直在用C#编写服务器端的程序,苦于一直找不到合适的方法来测试网络程序,这篇文章很好的解释了网络程序的底层实现. WireShark是最好的学习网络协议最好的工具. wireshark介绍 wir ...

  10. 阶段3 2.Spring_04.Spring的常用注解_7 改变作用范围以及和生命周期相关的注解

    Scope 改成多例 PreDestory和PostConstruct PreDestory和PostConstruct这两个注解了解即可 增加两个方法,分别用注解 没有执行销毁方法. 如果你一个子类 ...