首页 > 其他分享 >实现在线用户列表显示、注销的Listener

实现在线用户列表显示、注销的Listener

时间:2023-05-16 19:03:38浏览次数:47  
标签:ArrayList 用户 列表 Listener application allUser import 注销 public




实现在线用户列表显示、注销的Listener


文章分类:Java编程

实现一个对在线用户的监听:即监听用户的登录和注销两个操作。需要自定义一个Listener,实现ServletContextListener,HttpSessionListener和HttpSessionAttributeListener。

一、表示层:

1、用户登录表单Login.jsp



Jsp代码

1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
2. <html>   
3. <head>   
4.     <title>用户登录表单</title>   
5. </head>   
6. <body>   
7.     <%--表单,提交方式为post-,提交到DoGetDemo--%>   
8. "LoginConf.jsp" method="post">    
9. "text" name="username"/><br>    
10. "submit" value="登录"/>    
11. "reset" value="重置"/>    
12.     </form>   
13. </body>   
14. </html>



 

2、用户登录处理页:LoginConf.jsp


Jsp代码


1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
2. <html>   
3. <head>   
4.     <title>登录判断</title>   
5. </head>   
6. <body>   
7. <center>   
8.     <%   
9. "username") ; //接受用户名参数    
10.         //登录判断省略   
11. "username",username);    
12.     %>   
13.     //跳转到用户列表页   
14. "ShowAllUser.jsp"></jsp:forward>    
15. </center>   
16. </body>   
17. </html>




3、用户列表显示页面:ShowAllUser.jsp



Jsp代码


<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<html>
<head>
	<title>在线用户列表</title>
</head>
<body>
	<%=session.getAttribute("username")%>
	欢迎你的登录,你可以<a href="Logout.jsp">注销</a>。
	<h3>在线用户列表</h3><hr>
	<% 
		ArrayList<String> allUser = (ArrayList<String>)application.getAttribute("allUser");
		Iterator<String> iter = allUser.iterator();
		while(iter.hasNext()) {
			out.println("★" + iter.next() + "★   ");
		}
	%>
</body>
</html>


 

 

4、用户注销页面Logout.jsp

 



Jsp代码


1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
2. <html>   
3. <head>   
4.     <title>注销</title>   
5. </head>   
6. <body>   
7.     <%   
8.         //注销时进行session销毁   
9.         session.invalidate() ;   
10.     %>   
11. </body>   
12. </html>






 

 

二、自定义Listener:OnlineUserListener

 



Java代码

package listener;

import java.util.ArrayList;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineUserListener implements
		ServletContextListener,HttpSessionListener,HttpSessionAttributeListener{
	// 声明一个ServletContext对象
	private ServletContext application = null ;
	//ServletContext创建时调用该方法
	public void contextInitialized(ServletContextEvent sce) {
		//储存所用用户名
		ArrayList<String> allUser = new ArrayList<String>();
		//获得当前application对象
		application = sce.getServletContext();
		//设置到application范围
		application.setAttribute("allUser", allUser);
	}
	//ServletContext销毁时调用该方法
	public void contextDestroyed(ServletContextEvent sce) {
		
	}
	//session创建时调用该方法
	public void sessionCreated(HttpSessionEvent se) {
		
	}
	//session销毁时调用该方法
	public void sessionDestroyed(HttpSessionEvent se) {
		//获得当前所有的用户
		ArrayList<String> allUser = (ArrayList<String>) application.getAttribute("allUser");
		//获得删除的用户
		String user = (String)se.getSession().getAttribute("username");
		//删除该用户
		allUser.remove(user);
		//重新设置到application范围中
		application.setAttribute("allUser", allUser);
	}
	//session范围属性添加时调用
	public void attributeAdded(HttpSessionBindingEvent se) {
		//获得当前所有的用户
		ArrayList<String> allUser = (ArrayList<String>) application.getAttribute("allUser");
		//获得添加的用户
		String user = (String) se.getValue();
		//添加到所有用户中
		allUser.add(user);
	}
	//session范围属性移除时调用
	public void attributeRemoved(HttpSessionBindingEvent se) {
	}
	//session范围属性替换时调用
	public void attributeReplaced(HttpSessionBindingEvent se) {
	}


}

 

三、Listener配置



Xml代码


1. <listener>  
2.   <listener-class>listener.OnlineUserListener</listener-class>   
3.  </listener>





 

标签:ArrayList,用户,列表,Listener,application,allUser,import,注销,public
From: https://blog.51cto.com/u_16115638/6286405

相关文章

  • edge浏览器列表 edge://edge-urls
    ListofEdgeURLsedge://aboutedge://accessibilityedge://app-service-internalsedge://app-settingsedge://application-guard-internalsedge://appsedge://attribution-internalsedge://augloop-internalsedge://autofill-internalsedge://blob-internalsedge......
  • keyevent常用键列表
    常⽤键展示KEYCODE_CALL拨号键5KEYCODE_ENDCALL挂机键6KEYCODE_HOME按键Home3KEYCODE_MENU菜单键82KEYCODE_BACK返回键4KEYCODE_SEARCH搜索键84KEYCODE_CAMERA拍照键27KEYCODE_FOCUS拍照对焦键80KEYCODE_POWER电源键26KEYCODE_NOTIFICATION通知键83KEYCODE_M......
  • 5.16文本样式,列表样式,背景样式
    文本装饰:text-decotation:overline文本上出现上划线text-decoration:line-through文本出现删除线text-decoration:underline文本出现下划线      垂直对齐方式vertical-align:top顶部对齐vertical-align:middle中部对齐vertical:bottom底部对齐文本阴影:text=-shadow:{......
  • 4、clickhouse的Log系列表引擎、外部集成表引擎和其他特殊的表引擎介绍及使用
    文章目录ClickHouse系列文章一、Log系列表引擎1、应用场景2、Log系列表引擎的特点1)、共性特点2)、区别3、TinyLog表引擎使用4、StripLog表引擎使用5、Log表引擎使用二、外部集成表引擎1、HDFS使用方式2、MySQL使用方式3、JDBC使用方式4、Kafka使用方式三、其他特殊的表引擎1、Memor......
  • css基本介绍+嵌套使用+选择器+列表样式+绝对定位
    1. 什么是CSS,有什么作用?  01CSS(Cascading Style Sheet):层叠样式表语言。CSS的作用是: 修饰HTML页面,设置HTML页面中的某些元素的样式,让HTML页面更好看。 CSS好比是HTML的化妆品一样。HTML还是主体,CSS依赖HTML。CSS的存在就是修饰HTML,所以新建的文件还是xx.html文件。2、CSS......
  • 2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你
    2023-05-12:存在一个由n个节点组成的无向连通图,图中的节点按从0到n-1编号,给你一个数组graph表示这个图,其中,graph[i]是一个列表,由所有与节点i直接相连的节点组成。返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重......
  • 模板元编程实战--类型列表算法
    这篇文章主要说明了我学习的过程,作为一种记事本来记录,它讲述了如何处理一个类型列表的拼接,查找,排序,等算法。数据结构:template<typename...Ts>structTypeList{structisTypeList{};usingtype=TypeList<Ts...>;constexprstaticsize_tsize=sizeof...(......
  • Eclipse的TODO标签不在Tasks列表显示
    1.问题描述最近在做一个品管文档查询的功能,由于项目未部署,先本地测试,degug断点修改变量的值,但是每次请求都要改一次,太麻烦。所以直接在代码里面把变量的值改了,但是项目部署前要记得注释掉,这里就用到了TODO标签,防止自己忘掉。2.问题解决在Project下面把BuildAutomatically勾......
  • Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consid
    这个警告意味着在事件监听器中,添加了一个阻止页面滚动的`mousewheel`事件,但是该事件监听器并没有标记为被动事件监听器(passiveeventlistener)。这可能会导致页面滚动变得不流畅,特别是在移动设备上。为了解决这个问题,您需要将事件监听器标记为被动事件监听器。具体实现方法如下......
  • 个人站点页分类列表展示
    目录一、导航条换成访问用户的站点二、左边的站点用户文章分类、便签以及时间的分类视图函数没有查表导入数据之前的空壳导入数据后的网页三、Django之TruncMonth截取日期作为新的虚拟字段使用使用方法时区报错问题一、导航条换成访问用户的站点<!DOCTYPEhtml><htmllang="en"......