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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

