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时 ...
随机推荐
- C++入门经典-例4.10-使用static变量实现累加
1:静态变量static可以分为静态局部变量和静态全局变量,静态局部变量的值在函数调用结束后不消失,静态全局变量只能在本源文件中使用. 静态变量属于静态存储方式,它具有以下特点: (1)静态变量在函数 ...
- Zookeeper 选举过程
Zookeeper 选举过程 问题 选举过程 服务器之间是怎么通信的? 答:QuorumCnxManager使用TCP-socket实现选举过程中的连接通信 Leader的选举过程在什么时候实现? L ...
- 191121HTML
一.HTML 1.web server import socket def handle_request(client): buf = client.recv(1024) client.send(by ...
- html 行内元素和块级元素
行内元素一般是内容的容器,而块级元素一般是其他容器的容器.一般情况下,行内元素只能包含内容或者其它行内元素,宽度和长度依据内容而定,不可以设置,可以和其它元素和平共处于一行:而块级元素可以包含行内元素 ...
- Error-ASP.NET:在从服务器接收结果时发生传输级错误。 (provider: Session Provider, error: 19 - 物理连接不可用)
ylbtech-Error-ASP.NET:在从服务器接收结果时发生传输级错误. (provider: Session Provider, error: 19 - 物理连接不可用) 1.返回顶部 1 ...
- Win10卸载预装应用
Win10的预装应用大多数都比较鸡肋,没啥用,喜欢纯净的系统的朋友可以将其卸载掉. 1.以管理员身份启动powershell,键入命令[Get-AppxPackage | Select Name, P ...
- Computer Network Homework3’ s hard question
Computer Network Homework3’ s hard question 1. Which kind of protocol does CSMA belong to? A. Random ...
- nodejs之express框架商品管理系统登录功能
1.该系统主要使用express.body-parser.express-session.ejs.mongodb-connect . npm install express --save npm in ...
- 【DVWA】File Inclusion(文件包含漏洞)通关教程
日期:2019-07-28 20:58:29 更新: 作者:Bay0net 介绍: 0x01. 漏洞介绍 文件包含时,不管包含的文件是什么类型,都会优先尝试当作 php 文件执行. 如果文件内容有 p ...
- Android IdleHandler 原理浅析
IdleHandler:空闲监听器(就像我没事做了,在群里发了个表情,这时候其他人就知道我很闲了) 在每次next获取消息进行处理时,发现没有可以处理的消息(队列空,只有延时消息并且没到时间,同步阻塞 ...