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

实现一个对在线用户的监听:即监听用户的登录和注销两个操作。需要自定义一个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.     <form action="LoginConf.jsp" method="post">   
  9.         用户名:<input type="text" name="username"/><br>   
  10.         <input type="submit" value="登录"/>   
  11.         <input type="reset" value="重置"/>   
  12.     </form>   
  13. </body>   
  14. </html>  
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
	<title>用户登录表单</title>
</head>
<body>
	<%--表单,提交方式为post-,提交到DoGetDemo--%>
	<form action="LoginConf.jsp" method="post">
		用户名:<input type="text" name="username"/><br>
		<input type="submit" value="登录"/>
		<input type="reset" value="重置"/>
	</form>
</body>
</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.         String username = request.getParameter("username") ; //接受用户名参数   
  10.         //登录判断省略   
  11.         session.setAttribute("username",username);   
  12.     %>   
  13.     //跳转到用户列表页   
  14.     <jsp:forward page="ShowAllUser.jsp"></jsp:forward>   
  15. </center>   
  16. </body>   
  17. </html>  
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
	<title>登录判断</title>
</head>
<body>
<center>
	<%
		String username = request.getParameter("username") ; //接受用户名参数
		//登录判断省略
		session.setAttribute("username",username);
	%>
	//跳转到用户列表页
	<jsp:forward page="ShowAllUser.jsp"></jsp:forward>
</center>
</body>
</html>

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

Jsp代码 复制代码
  1. <%@ page language="java" contentType="text/html;charset=gb2312"%>   
  2. <%@ page import="java.util.*"%>   
  3. <html>   
  4. <head>   
  5.     <title>在线用户列表</title>   
  6. </head>   
  7. <body>   
  8.     <%=session.getAttribute("username")%>   
  9.     欢迎你的登录,你可以<a href="Logout.jsp">注销</a>。   
  10.     <h3>在线用户列表</h3><hr>   
  11.     <%    
  12.         ArrayList<String> allUser = (ArrayList<String>)application.getAttribute("allUser");   
  13.         Iterator<String> iter = allUser.iterator();   
  14.         while(iter.hasNext()) {   
  15.             out.println("★" + iter.next() + "★&nbsp;&nbsp;&nbsp;");   
  16.         }   
  17.     %>   
  18. </body>   
  19. </html>  
<%@ 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() + "★&nbsp;&nbsp;&nbsp;");
		}
	%>
</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>  
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
	<title>注销</title>
</head>
<body>
	<%
		//注销时进行session销毁
		session.invalidate() ;
	%>
</body>
</html>

 

 

二、自定义Listener:OnlineUserListener

 

Java代码 复制代码
  1. package listener;   
  2.   
  3. import java.util.ArrayList;   
  4.   
  5. import javax.servlet.ServletContext;   
  6. import javax.servlet.ServletContextEvent;   
  7. import javax.servlet.ServletContextListener;   
  8. import javax.servlet.http.HttpSessionAttributeListener;   
  9. import javax.servlet.http.HttpSessionBindingEvent;   
  10. import javax.servlet.http.HttpSessionEvent;   
  11. import javax.servlet.http.HttpSessionListener;   
  12.   
  13. public class OnlineUserListener implements  
  14.         ServletContextListener,HttpSessionListener,HttpSessionAttributeListener{   
  15.     // 声明一个ServletContext对象   
  16.     private ServletContext application = null ;   
  17.     //ServletContext创建时调用该方法   
  18.     public void contextInitialized(ServletContextEvent sce) {   
  19.         //储存所用用户名   
  20.         ArrayList<String> allUser = new ArrayList<String>();   
  21.         //获得当前application对象   
  22.         application = sce.getServletContext();   
  23.         //设置到application范围   
  24.         application.setAttribute("allUser", allUser);   
  25.     }   
  26.     //ServletContext销毁时调用该方法   
  27.     public void contextDestroyed(ServletContextEvent sce) {   
  28.            
  29.     }   
  30.     //session创建时调用该方法   
  31.     public void sessionCreated(HttpSessionEvent se) {   
  32.            
  33.     }   
  34.     //session销毁时调用该方法   
  35.     public void sessionDestroyed(HttpSessionEvent se) {   
  36.         //获得当前所有的用户   
  37.         ArrayList<String> allUser = (ArrayList<String>) application.getAttribute("allUser");   
  38.         //获得删除的用户   
  39.         String user = (String)se.getSession().getAttribute("username");   
  40.         //删除该用户   
  41.         allUser.remove(user);   
  42.         //重新设置到application范围中   
  43.         application.setAttribute("allUser", allUser);   
  44.     }   
  45.     //session范围属性添加时调用   
  46.     public void attributeAdded(HttpSessionBindingEvent se) {   
  47.         //获得当前所有的用户   
  48.         ArrayList<String> allUser = (ArrayList<String>) application.getAttribute("allUser");   
  49.         //获得添加的用户   
  50.         String user = (String) se.getValue();   
  51.         //添加到所有用户中   
  52.         allUser.add(user);   
  53.     }   
  54.     //session范围属性移除时调用   
  55.     public void attributeRemoved(HttpSessionBindingEvent se) {   
  56.     }   
  57.     //session范围属性替换时调用   
  58.     public void attributeReplaced(HttpSessionBindingEvent se) {   
  59.     }   
  60.   
  61.   
  62. }  
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>  
<listener>
 <listener-class>listener.OnlineUserListener</listener-class>
</listener>

 

实现在线用户统计,可以使用Listener监听器来监控用户的会话(session)状态。具体实现步骤如下: 1. 创建一个实现了HttpSessionListener接口的监听器类,例如OnlineUserListener。 2. 在该类中实现sessionCreated方法和sessionDestroyed方法。 3. 在sessionCreated方法中,获取当前创建的会话(session),并将该会话添加到一个集合中,表示该用户已经在线。 4. 在sessionDestroyed方法中,获取当前销毁的会话(session),并将该会话从集合中移除,表示该用户已经下线。 5. 在web.xml中配置该监听器。 6. 在需要统计在线用户数的地方,可以通过访问OnlineUserListener中的集合来获取在线用户数。 示例代码: // OnlineUserListener.java import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import java.util.ArrayList; import java.util.List; public class OnlineUserListener implements HttpSessionListener { // 存储在线用户的集合 private static List<HttpSession> sessions = new ArrayList<HttpSession>(); // session创建时调用 public void sessionCreated(HttpSessionEvent se) { // 将创建的session添加到集合中 HttpSession session = se.getSession(); sessions.add(session); } // session销毁时调用 public void sessionDestroyed(HttpSessionEvent se) { // 将销毁的session从集合中移除 HttpSession session = se.getSession(); sessions.remove(session); } // 获取在线用户数 public static int getOnlineUserCount() { return sessions.size(); } } // web.xml中配置OnlineUserListener <listener> <listener-class>OnlineUserListener</listener-class> </listener> // 在需要统计在线用户数的地方调用OnlineUserListener.getOnlineUserCount()方法 int onlineUserCount = OnlineUserListener.getOnlineUserCount();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值