一、概念

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. Python 入门知识

    一python 语言介绍 特点 简单清晰明确   目前是全球最火的高级编程语言  应用领域很广 NASA FACEBOOK 谷歌 春雨医生 金山 腾讯,Python是一门解释性弱类型编程语言.编译性得 ...

  3. C++入门经典-例3.5-判断某一年是否是闰年之嵌套判断

    1:代码如下: // 3.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  4. 对于Java培训出身的同学,接下来该怎么学习技术?

    首先恭喜从培训班出来找到工作的同学,确实挺不容易的,4个月的培训,每天从早上9点到晚上9点,也是996,主要的活动地方就是宿舍和教室, 让我现在也去培训,我估计还熬不下来. 尤其是对于从小白开始的同学 ...

  5. JS箭头函数的this

    箭头函数的this看定义他的时候,他的外层有没有函数 有:外层函数的this就是箭头函数的this 无:箭头函数的this就是window obj = {age:18, getAge: ()=> ...

  6. C与指针学习笔记

    有些任务无法用其他语言实现,如直接访问硬件,但C却可以. C对数组下标引用和指针访问并不进行有效性检查,这可以节省时间,但你在使用这些特性时,就必须特别小心.

  7. Uva 101 -- the block problem

    Uva 101 the block problem 题目大意: 输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置.现对这些木块进行操作,操作分为四种. 1.move a o ...

  8. 源码编译apache出错

    报错信息如下 exports.c:1572: error: redefinition of `ap_hack_apr_allocator_create' exports.c:177: error: ` ...

  9. python源码

    初学者 GitHub - kennethreitz/pip-pop: Tools for managing requirements files. GitHub - kennethreitz/envo ...

  10. 1.7 本机单步调试(Intellij IDEA)

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...