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时 ...
随机推荐
- 分布式-信息方式-ActiveMQ结合Spring
ActiveMQ结合 Spring开发■ Spring提供了对JMS的支持,需要添加 Spring支持jms的包,如下: <dependency> <groupId>org.a ...
- Spring boot之配置server信息
知识点: 1.修改端口号 2.修改context-path 3.其它配置说明 配置端口号: Spring boot 默认端口是8080, 如果想要进行更改的话, 只需要修改applicatoin.pr ...
- 创建Idea创建SpringBoot项目 - 各个目录的解释
[SpringBoot-创建项目]一.通过Idea创建SpringBoot项目 一.首先我们通过Idea创建一个新项目 二.选择sdk和快速构建模板 三.填写项目基本信息 三.选择项目依赖 四.填写项 ...
- line-height与vertical-align:简单的属性不简单
学习过CSS肯定对line-height与vertical-align两个属性有印象:line-height用来设置行高,vertical-align用来设置文本垂直方向的对齐方式,两种看似十分简单, ...
- 自动化部署脚本之windows上执行批处理文件
windows .bat 批处理 脚本路径如下: install-simo.bat文件内容: @ECHO OFF set scriptpath=%~dp0set logfile=%scriptpa ...
- python 判断是字母的多种方法
方法一:isalpha() "a".isalpha() 方法二:string.letters string.uppercase import string s=" ...
- 15个流行的python框架
Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台: ...
- 三种CSS样式
内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌入式和外部式三种. 内联式css样式表就是把css代码直接 ...
- 算法 - 剪枝游戏 - Green Hackenbush
场景:给颗树,轮流剪掉一条枝,没枝可剪的人输. 题目:Deforestation | HackerRank 讲解:Games!: Green Hackenbush 哎,差点自己想出来答案,最后还是看了 ...
- CSS 解决 a标签去掉下划线 text-decoration: none无效 的解决方案
经过查阅,如果想要去掉a标签的默认效果,就要用text-decoration: none;,但是经过试验发现并不好用,可能是因为你用a标签里的class或id定义的CSS样式,就像这样: <di ...