listener包下

MyListener

package listener;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

/**
 * 监听器的作用
 * 		监听request、session、application这三个作用域的创建、销毁、内容改变。
 * 使用:
 * 		创建一个java类去实现指定的接口
 * 实现接口:
 * 		ServletRequestListener接口(request的创建和销毁监听)
 * 			requestInitialized()创建
 * 			requestDestroyed()销毁
 *		ServletRequestAttributeListener接口(内容改变)
 *			attributeAdded()增加
 *			attributeRemoved()删除
 *			attributeReplaced()修改
 */

public class MyListener implements ServletRequestListener,ServletRequestAttributeListener{
	//初始量
	public static int usersNumber = 0;
	//一个添加调用一次
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		System.out.println("request里增加了一条数据"+srae.getName()+"   "+srae.getValue());
	}
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
	}
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
	}
	
	
	
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		usersNumber++;
		System.out.println("我创建了");
	}
	
	
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("我销毁了");
	}
	
}

TestServlet

package listener;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setAttribute("name", "张三");
		request.setAttribute("name1", "李四");
		
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("监听器使用,接收请求"+MyListener.usersNumber+"次");
	}
}

demo1包下

CountOnline

package demo1;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class CountOnline implements HttpSessionListener{

	//监听session的创建
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		ServletContext context = se.getSession().getServletContext();
		
		Integer num = (Integer) context.getAttribute("num");
		if(num == null) {
			//第一个人访问进来了
			context.setAttribute("num", 1);
		}else {
			num++;
			context.setAttribute("num", num);
		}
		
	}
	
	//监听session的销毁
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		ServletContext context = se.getSession().getServletContext();
		Integer num = (Integer) context.getAttribute("num");
		if(num == null) {
			//第一个人访问进来了
			context.setAttribute("num", 1);
		}else {
			num--;
			context.setAttribute("num", num);
		}
		
	}

}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1 style="text-align:center;color:red;">在线人数:${num}</h1>
</body>
</html>

demo2下

Mytask

package demo2;

import java.util.List;
import java.util.TimerTask;

import javax.servlet.http.HttpSession;

/**
 * 创建一个扫描器,来监听容器的session
 *
 */
public class MyTask extends TimerTask {
	//session集合用来装用户的session
	private List<HttpSession> sessions;
	//创建一个锁
	private Object lock;
	//构造函数
	public MyTask(List<HttpSession> session,Object lock) {
		this.sessions = session;
		this.lock = lock;
				
	}
	
	@Override
	public void run() {
		synchronized (lock) {
			for (HttpSession session:sessions) {//循环所有用户
				//如果15秒没人使用,就移除
				if((System.currentTimeMillis() - session.getLastAccessedTime()) > (1000 * 15)) {
					session.invalidate();
					sessions.remove(session);
				}
			}
		}
		
	}

}

UserLinstener

package demo2;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

//用户监听无操作
public class UserLinstener implements ServletContextListener,HttpSessionListener{
	List<HttpSession> list = Collections.synchronizedList(new LinkedList<HttpSession>());
	//定义一把锁
	private Object lock = 1;
	
	//应用在启动的时候会调用
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		Timer timer = new Timer();
		timer.schedule(new MyTask(list,lock), 0, 10*1000);
	}
	
	//session创建的时候
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		synchronized (lock) {
			list.add(se.getSession());
		}
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("用户掉线");
	}
}

 

最后修改于 2021-09-16 09:45:23
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇