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时 ...
随机推荐
- defineProperty和defineProperties介绍
v-model 实现的原理 angular 是 mvc 的实现原理,ng-model 是靠脏值检测实现的 脏值检测:for 循环一个个对比 vue 靠的是数据劫持 和 发布者,订阅者模式 数据劫持:O ...
- block(块级元素)和 inline(内联元素) 的区别
block(块级元素)和 inline(内联元素) 的区别 (2009-01-05 10:32:07) 转载▼ 标签: 杂谈 分类: div+css div这样的块级元素,就会自动占据一定矩形空间,可 ...
- flutter 添加全局环境变量
flutter安装好了之后 要添加全局环境变量才可以在终端通过flutter命令来操作 安装flutter环境变量 vim ~/.bash_profile (不存在就创建,添加下面一行命令) expo ...
- Java学习之==>集合体系(待续。。)
一.概述 Java的集合体系,本质上是一个陈放数据的容器,像之前学过的数组也是陈放数据的容器,但在 Java 中数组的长度是固定的,使用起来没那么方便.集合提供了更加强大的功能,使用起来也更方便和快捷 ...
- 针对C++容器类的一个简陋的allocator
参考: https://en.cppreference.com/w/cpp/named_req/Allocator http://www.josuttis.com/libbook/memory/mya ...
- 10 mysql选错索引
10 mysql选错索引 在mysql表中可以支持多个索引,有的sql不指定使用哪个索引,由mysql自己来决定,但是有时候mysql选错了索引,导致执行很慢. 例子 CREATE TABLE `t1 ...
- js获取当天时间,7天前后时间,时间格式化
格式化时间年月日时分秒 //时间戳转换方法 date:时间戳数字 formatDate(date) { var date = new Date(date); var YY = date.getFull ...
- c++ 指针(三)
指针 (6)传递指针给函数 只需要简单地声明函数参数为指针类型即可 #include <iostream> #include <ctime> using namespace s ...
- 盒模型 box-sizing 属性
css3增添了盒模型box-sizing属性,box-sizing属性值可以有下面三个值: content-box:默认值,让元素维持W3C的标准盒模型.元素的宽度/高度(width/height)( ...
- P1596 【[USACO10OCT]湖计数Lake Counting】
可爱的题面君~~ 个人感觉这题还是很简单的,就是一个完全不加工的找联通块个数 个人解题思路是先读入,然后循环一遍,遇到水就dfs,并把这个w所在的联通块“删除”,并在答案上加一 最后输出答案 具体注释 ...