Servlet监听器——实现在线登录人数统计小例子
一、概念
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接口
六、存储在线用户信息的例子
1.login.jsp页面实现用户登录
- <body>
- <form method="get" action="logindo">
- <center>
- <h2>用户登录</h2>
- <hr />
- <br /> 用户名: <input type="text" name="userName" /> <br />
- <input type="submit" value="登录" />
- </center>
- </form>
- </body>
2.建立存储用户信息的类:UserList.java
- package listener;
- import java.util.Vector;
- public class UserList {
- private static Vector online = new Vector();
- //添加在线人数
- public static void addUser(String userName){
- online.addElement(userName);
- }
- //移除在线人数
- public static void removeUser(String userName){
- online.removeElement(userName);
- }
- //获取在线用户数量
- public static int getUserCount(){
- return online.size();
- }
- public static Vector getVector(){
- return online;
- }
- }
****Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小。
Vector 有三个构造函数,
public Vector(int initialCapacity,int capacityIncrement)
public Vector(int initialCapacity)
public Vector()
Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。第二个构造函数只创建初始存储容量。第三个构造函数既不指定初始的存储容量也不指定capacityIncrement。
Vector 类提供的访问方法支持类似数组运算和与Vector 大小相关的运算。类似数组的运算允许向量中增加,删除和插入元素。
****
3.写监听器类
- package listener;
- import javax.servlet.http.HttpSessionAttributeListener;
- import javax.servlet.http.HttpSessionBindingEvent;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- public class OnlineListener implements HttpSessionListener,HttpSessionAttributeListener{
- //监听Http会话中的属性添加
- public void attributeAdded(HttpSessionBindingEvent se) {
- // TODO Auto-generated method stub
- UserList.addUser(String.valueOf(se.getValue()));//增加一个用户
- System.out.println("session("+se.getSession().getId()+")增加属性"+se.getName()+",值为"+se.getValue());
- }
- //监听Http会话中的属性移除
- public void attributeRemoved(HttpSessionBindingEvent se) {
- // TODO Auto-generated method stub
- UserList.removeUser(String.valueOf(se.getValue()));
- System.out.println(se.getValue()+"属性已移除");
- }
- //监听Http会话中的属性更改操作
- public void attributeReplaced(HttpSessionBindingEvent se) {
- // TODO Auto-generated method stub
- String oldValue=String.valueOf(se.getValue());//旧的属性
- String newValue=String.valueOf(se.getSession().getAttribute(se.getName()));//新的属性
- UserList.removeUser(oldValue);//移除旧的属性
- UserList.addUser(newValue);//增加新的属性
- System.out.println(oldValue+"属性已更改为"+newValue);
- }
- public void sessionCreated(HttpSessionEvent se) {
- // TODO Auto-generated method stub
- System.out.println("会话已创建!");
- }
- public void sessionDestroyed(HttpSessionEvent se) {
- // TODO Auto-generated method stub
- System.out.println("会话已销毁!");
- }
- }
4.建立用户登录类LoginServlet.java
- package listener;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class LoginServlet extends HttpServlet{
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- String userName=req.getParameter("userName");//获取前台传来的userName属性
- HttpSession session = req.getSession();
- session.setAttribute("userName", userName);//将属性保存到session会话中
- resp.sendRedirect("index.jsp");//重定向到index.jsp页面
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- doGet(req, resp);
- }
- }
5.建立退出登录类
- package listener;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ExitServlet extends HttpServlet{
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- req.getSession().removeAttribute("userName");//从session中移除对象
- resp.sendRedirect("login.jsp");//重定向到用户登录页面
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- doGet(req, resp);
- }
- }
6.在web.xml中配置监听器、登录和退出的Servlet
- <!-- 配置监听器 -->
- <listener>
- <listener-class>listener.OnlineListener</listener-class>
- </listener>
- <!-- 配置servlet -->
- <servlet>
- <servlet-name>LoginServlet</servlet-name>
- <servlet-class>listener.LoginServlet</servlet-class>
- </servlet>
- <servlet>
- <servlet-name>ExitServlet</servlet-name>
- <servlet-class>listener.ExitServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>LoginServlet</servlet-name>
- <url-pattern>/logindo</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>ExitServlet</servlet-name>
- <url-pattern>/exitdo</url-pattern>
- </servlet-mapping>
7.编写index.jsp在线首页
- <body>
- <%
- //如果未登录,转向登录页面
- if (session.getAttribute("userName") == null) {
- response.sendRedirect("login.jsp");
- }
- Vector onlineUsers = UserList.getVector(); //获取存储在线用户名的vector对象
- %>
- <center>
- <br />
- <br />
- <h2>登录成功</h2>
- <hr />
- <br /> 欢迎你 <span style="color:red;"> <%=session.getAttribute("userName")%>
- </span> <a href="exitdo">退出登录</a> <br />
- <br /> 当前在线人数:<span style="color:red;"> <%=UserList.getUserCount()%>人</span>
- <br />
- <br> 在线用户名单 : <br /> <select multiple="multiple" name="list"
- style="width:200px;height:250px">
- <%
- for (int i = 0; i < onlineUsers.size(); i++) {
- out.write("<option>" + onlineUsers.get(i) + "</option>");
- }
- %>
- </select>
- </center>
- </body>
Servlet监听器——实现在线登录人数统计小例子的更多相关文章
- 过滤器和监听器实现用户的在线登录人数,以及设置session时长。
过滤器: package com.bjsxt.filter; import java.io.IOException; import javax.servlet.Filter; import javax ...
- Servlet监听器及在线用户
Servlet中的监听器分为三种类型Ⅰ 监听ServletContext.Request.Session作用域的创建和销毁 (1)ServletContextListener (2)HttpSessi ...
- Servlet 实现訪问量的统计小案例
今天学习了Servlet的基础知识,学习了一个统计訪问量的小案例,记录一下 package cn.selevet_01; import java.io.IOException; import java ...
- Servlet监听器统计网站在线人数
本节我们利用 Servlet 监听器接口,完成一个统计网站在线人数的案例.当一个用户登录后,显示欢迎信息,同时显示出当前在线人数和用户名单.当用户退出登录或 Session 过期时,从在线用户名单中删 ...
- Servlet监听器统计在线人数
监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应. 例1 应用Servlet监听器统计在线人数. (1)创 ...
- 使用 Redis 统计在线用户人数
在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...
- ASP.NET MVC使用SignalR统计在线用户人数
学到新东西就记录一下.也许正好有人需要~~~~~~ 由于需要记录当前在线用户,emmmm又是没做过的... 本来想用数据库的形式,但是想想这么简单的功能百度肯定有.遨游一波百度,有所收获.... 虽然 ...
- java之Servlet监听器Listener
常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...
- Java进阶(十三)servlet监听器
servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...
随机推荐
- 高性能JavaScript之加载和执行
JS在浏览器中的性能,可以认为是开发者所面临的最重要的可行性问题.这个问题因JS的阻塞特性变得复杂,也就是说当浏览器在执行JS代码时,不能同时做其他任何事情.事实上,大多数浏览器都使用单一进程来处理U ...
- windows 简单实用Elasticsearch
官网下载地址:https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/e ...
- webdriver驱动火狐浏览器报错:Unable to find a matching set of capabilities
raise exception_class(message, screen, stacktrace)selenium.common.exceptions.SessionNotCreatedExcept ...
- mysql5.7.25搭建mysql-5.7.25.tar.gz包(亲验)
STEP 1. 下载 去往官方下载MySQL包.http://dev.mysql.com mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz STEP 2. 解压缩 ...
- RF Setup和Teardown的使用
执行顺序 setup执行顺序是:project级别setup>suite级别setup>case级别setup 无返回值 Run Keywords | [KW1 | arg1 | arg2 ...
- 自定义Chrome的console(样式、打印图片、开关)
1.常用console类型 console.log() 常规打印 console.warn() 打印警告信息 console.error() 打印错误信息 console.time() 和 conso ...
- chrome浏览器爬虫WebDriverException解决采用python + selenium + chrome + headless模式
WebDriverException: Message: unknown error: Chrome failed to start: crashed 第一种:如果出现下面情况: chrome浏览器有 ...
- Chrome OS支持在窗口中运行Linux了!!!
借助Crouton Chrome扩展,Chrome OS可以在窗口中运行Linux了.在使用该扩展之前,你需要先将自己的Chromebook设置成开发者模式(Develeper Mode). 此前,C ...
- SAS数据挖掘实战篇【六】
SAS数据挖掘实战篇[六] 6.3 决策树 决策树主要用来描述将数据划分为不同组的规则.第一条规则首先将整个数据集划分为不同大小的 子集,然后将另外的规则应用在子数据集中,数据集不同相应的规则也不同 ...
- DocX 在文档中插入图片时,为什么不能按实际设置的大小插入,而Spire.Doc却可以
我的目标目标要求:将一个图片插入到页面中,页面边界为0,使用下面的代码去实现(button1UseDocX_Click函数),生成的文档不能达到目的.而使用Spire.Doc却能达到目的button1 ...