java web中Listener的实现(实现用户在线统计数量和强制用户下线)

一、实现的具体功能

  • (1)实现用户在线数量的统计,并显示在页面上。
  • (2)实现强制用户下线的功能。创建一个超链接,用于实现强制用户下线的功能。
  • (3)监听session的创建和销毁。
    二、代码实现
  • (1)主页面:index.jsp。
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
   <p>用户在线列表数量:${userTable.size()}</p>
   
   
   <table border="1">
      <tr>
          <td>用户信息</td>
<c:forEach items="${userTable}" var="user">
      </tr>
    <tr>
          <td>${user.key }</td>
           <td><a href="KickUser?sid=${user.key}">踢你下线</a></td>
      </tr>
</c:forEach>
   </table>
</body>
</html>
  • (2)服务器监听器:SCListener.java文件。
package com.listener;

import java.util.Hashtable;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;

/**
 * Application Lifecycle Listener implementation class SCListener
 *
 */
@WebListener
public class SCListener implements ServletContextListener {

	//在线用户数量sessionId , session
	private static Hashtable<String,HttpSession> userTable;
	
    /**
     * Default constructor. 
     */
    public SCListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    	//服务器关闭了
    	System.out.println("服务器关闭了......");
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sre)  { 
         // TODO Auto-generated method stub
    	//服务器启动
    	System.out.println("服务器启动了......");
    	//创建用户在线列表
    	userTable = new Hashtable<String , HttpSession>();
    	//放入全局对象,第一个userTable的Key
    	sre.getServletContext().setAttribute("userTable",userTable );
    	
    }
	
}

  • (3)UserListener.java文件。
package com.listener;

import java.util.Hashtable;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Application Lifecycle Listener implementation class UserListener
 *
 */
@WebListener
public class UserListener implements HttpSessionListener {

    /**
     * Default constructor. 
     */
    public UserListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent se)  { 
         // TODO Auto-generated method stub
    	System.out.println("session创建了");
    	//获取全局对象
    	ServletContext sc = se.getSession().getServletContext();
    	//获取用户列表
    	 Hashtable<String,HttpSession> userTable = (Hashtable<String,HttpSession>)sc.getAttribute("userTable");
    	
    	 //获取sessionId
    	 String sid = se.getSession().getId();
    	 //用户session信息添加到用户列表
    	 userTable.put(sid, se.getSession());
    	 
    	 System.out.println("用户在线数量:"+userTable.size());
    	 
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent se)  { 
         // TODO Auto-generated method stub
    	System.out.println("session销毁了");
    	ServletContext sc = se.getSession().getServletContext();
    	//获取用户列表
    	 Hashtable<String,HttpSession> userTable = (Hashtable<String,HttpSession>)sc.getAttribute("userTable");
    	
    	 //获取sessionId
    	 String sid = se.getSession().getId();
    	 
    	 
    	 //移除用户列表中的用户
    	 userTable.remove(sid);
    	 
    }
	
}

  • (4)交互层用于实现强制用户下线的功能:KickUser.java文件。
package com.servlet;

import java.io.IOException;
import java.util.Hashtable;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class KickUser
 */
@WebServlet("/KickUser")
public class KickUser extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public KickUser() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//获取Id
		String sid = request.getParameter("sid");
		//获取全局对象
		ServletContext sc= request.getServletContext();
		//获取用户列表
		Hashtable<String,HttpSession> userTable = (Hashtable<String,HttpSession>)sc.getAttribute("userTable");
	    
		 if(userTable.get(sid) != null) {
			//销毁session
			userTable.get(sid).invalidate();
		}
		response.sendRedirect("index.jsp");
	
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

三、运行结果

  • (1)用不同的浏览器打开,用户在线数就会增加,然后进行测试。
    在这里插入图片描述
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于您的问题,我可以给您一些指导。 首先,我们需要在我们的数字求和系统实现一个Listener接口,该接口将帮助我们统计当前有多少用户正在使用系统。下面是一个简单的例子: ```java public interface UserCountListener { void userCountChanged(int userCount); } ``` 该接口只有一个方法,即userCountChanged,它在用户数量发生变化时被调用。 然后,我们需要在数字求和系统实现一个类来实现该接口: ```java public class UserCount implements ServletContextListener, UserCountListener { private int userCount = 0; @Override public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().setAttribute("userCount", userCount); } @Override public void contextDestroyed(ServletContextEvent sce) { sce.getServletContext().removeAttribute("userCount"); } @Override public void userCountChanged(int userCount) { this.userCount = userCount; } public int getUserCount() { return userCount; } } ``` 该类实现了ServletContextListener接口和UserCountListener接口。在contextInitialized方法,我们将userCount属性存储在ServletContext。在contextDestroyed方法,我们从ServletContext删除userCount属性。在userCountChanged方法,我们将传入的用户数量更新到userCount属性。最后,我们提供了一个getUserCount方法以供其他部分使用。 最后,我们需要在我们的数字求和系统使用UserCount类并更新用户数量。下面是一个简单的例子: ```java public class SumServlet extends HttpServlet { private static final UserCount userCount = new UserCount(); @Override public void init() { getServletContext().addListener(userCount); } @Override public void destroy() { getServletContext().removeListener(userCount); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int a = Integer.parseInt(req.getParameter("a")); int b = Integer.parseInt(req.getParameter("b")); int sum = a + b; // 更新用户数量 int currentUserCount = (int) getServletContext().getAttribute("userCount"); userCount.userCountChanged(currentUserCount + 1); resp.setContentType("text/plain"); resp.getWriter().write(String.valueOf(sum)); } } ``` 在init方法,我们将UserCount类添加到ServletContextListener。在destroy方法,我们从ServletContextListener删除UserCount类。在doGet方法,我们首先解析出请求的参数,然后计算总和。接下来,我们通过ServletContext获取当前的用户数量,并使用UserCount类更新它。最后,我们将总和写回响应。 这就是一个简单的实现Listener接口统计用户数量的方法。当用户数量发生变化时,我们可以通过UserCount类获取实时的用户数量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值