Day61 Listener监听器
JavaWeb 三大组件(Servlet、Filter、Listener)
概念
监听器用于监听web应用中某些对象信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法
常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等
监听器可以监听就是在
application
,session
,request
三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
application
是ServletContext
类型的对象,ServletContext
代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象创建步骤
1.创建类
2.实现指定的监听器接口中的方法
3.在web.xml文件中配置监听/在类上标注@WebListener 注解
JavaEE的监听器:
没有这个pageContext:上下文对象
1.第一大类监听器:监听请求对象的创建和销毁
监听域对象 创建与销毁的监听器
需要导包,servlet-api.jar
监听器接口 | 描述 |
---|---|
ServletRequestListener | 监听请求对象的创建、销毁 |
HttpSessionListener | 监听会话对象的创建、销毁 |
ServletContextListener | 监听全局域对象的创建、销毁 |
1.1 ServletRequestListener
请求对象的生命周期:
创建:客户端发送请求,Tomcat会创建请求对象(请求对象可以存储数据,但是时间很短,在项目中要跳转时,需要临时数据,就存储在请求对象中)
销毁:服务器返回响应,Tomcat会将请求对象销毁
MyServletRequestListener
package com.qf.listener01;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
//获取请求对象
ServletRequest request = servletRequestEvent.getServletRequest();
System.out.println("请求对象被创建了"+request);
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
//获取请求对象
ServletRequest request = servletRequestEvent.getServletRequest();
System.out.println("请求对象被销毁了"+request);
}
}
web.xml
也可以使用@WebListener注解
<listener>
<listener-class>com.qf.listener01.MyServletRequestListener</listener-class>
</listener>
Welcome.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome.html</h1>
</body>
</html>
page01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>page01.jsp</h1>
</body>
</html>
运行结果:
1.2 HttpSessionListener
监听会话域对象的创建和销毁
会话对象的生命周期:
创建:服务端使用到会话对象才会被创建
销毁:会话域对象过期时间到后会被销毁
注意:
1.客户端访问服务器里的html页面不会创建会话对象,因为没有使用到session
2.客户端访问服务器里的jsp页面会创建会话对象,因为使jsp里9大内置对象里有session
3.会话域对象过期时间默认30分钟
4.在web.xml中可以设置session的过期时间(时间单位:分钟),注意:最后一次使用session的时间往后移(闲置时间)
<session-config>
<session-timeout>60</session-timeout>
</session-config>
经验:
session对象在服务器中存储,默认30分钟过期时间
JSESSIONID存储在客户端的Cookie中,默认过期时间是会话结束时
这样会导致,关闭客户端后,session对象还存活在服务端,相同的客户端再次开启并发送请求访问session时就会创建新的session对象,原有的session对象就视作为占用资源的无效对象
我们可以设置JSESSIONID的过期时间(和session对象的过期时间一致),用户关闭客户端再次开启后才能找到之前在服务器对应的session对象
package com.qf.listener01;
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("会话域对象被创建了:" + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("会话域对象被销毁了:" + session.getId());
}
}
运行结果:
Welcome.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>