携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情 >>
介绍
监听器:3大类,8种
- Request:2种监听
- pageContext:2种监听
- session:2种监听
- application:2种监听
问题
在Servlet技术中有request、session、application作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也无法在指定的时机对数据和对象进行操作.
比如:
- session销毁的时候,在线人数-1
解决
使用监听器
监听器
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等作用域对象的创建与销毁事件,以及监听这些作用域对象中属性发生修改的事件
监听对象
- pageContext
- Request
- Session
- Application
监听内容
- 创建
- 销毁
- 属性改变事件
监听作用
监听作用于对象Request、session、application的创建、销毁和内容的改变
在事件发生之前、之后进行一些处理,比如统计在线人数
使用
- 创建一个实现了指定接口的Java类
- 在web.xml中配置监听类(注解更方便)
监听Request
监听Request对象的创建与销毁
-
实现的接口:
ServletRequestListener -
重写方法:
requestInitialized(ServletRequestEvent sre):创建requestDestroyed(ServletRequestEvent sre):销毁
-
方法:
sre.getServletRequest();:获取监听的Request对象
监听Request作用域数据的变更
-
实现的接口:
ServletRequestAttributeListener -
重写的方法
-
attributeAdded(ServletRequestAttributeEvent srae):监听添加- 每添加一条信息,都会出发该监听器
-
attributeRemoved(ServletRequestAttributeEvent srae):监听删除 -
attributeReplaced(ServletRequestAttributeEvent srae):监听修改
-
-
参数
srae.getName():获取添加的Attribute的键值srae.getValue():获取添加的Attribute的value值
实例代码
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
//ServletRequestEvent:servlet的Request请求事件
//该事件会加载到Request请求的所有内容
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
HttpServletRequest request = (HttpServletRequest) servletRequest;
//获取用户的IP地址
String ip = request.getRemoteAddr();
//获取用户请求的资源路径URL
StringBuffer URL = request.getRequestURL();
//获取当前用户是否登录
String username = "";
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
username = "游客";
}else {
username = user.getUsername();
}
System.out.println("监听用户名:" + username + "IP:" + ip + "URL:" + URL+"请求开始");
}
监听Session
监听Session对象的创建与销毁
-
实现接口:
HttpSessionListener -
重写的方法
sessionCreated(HttpSessionEvent se):监听Session的创建sessionDestroyed(HttpSessionEvent se):监听Session的销毁
-
参数
se.getSession();:获取监听的session对象
监听Session作用域数据的变更
-
实现接口:
HttpSessionAttributeListener -
重写的方法
attributeAdded(HttpSessionBindingEvent se):监听session数据的添加attributeRemoved(HttpSessionBindingEvent se):监听session数据的删除attributeReplaced(HttpSessionBindingEvent se):监听session数据的修改
-
参数
se.getName():获取session数据的键值se.getValue():获取session数据的value值
监听Application(ServletContext)
application是ServletContext的别称
在服务器已启动,就会创建一个application,也就是ServletContext
服务器一关闭,就会销毁该application,也就是ServletContext
监听application的创建与销毁
-
实现接口:
ServletContextListener -
重写的方法
contextInitialized(ServletContextEvent sce):监听application的初始化,服务器启动执行contextDestroyed(ServletContextEvent sce):监听application的销毁,服务器关闭执行
-
参数
sce.getServletContext();:获取监听的application对象,也就是ServletContext对象
监听application作用域数据的变更
-
实现接口:
ServletContextAttributeListener -
重写的方法
attributeAdded(ServletContextAttributeEvent scae):监听application数据的添加attributeRemoved(ServletContextAttributeEvent scae):监听application数据的删除attributeReplaced(ServletContextAttributeEvent scae):监听application数据的修改
-
参数
scae.getName():获取application数据的键值,也就是ServletContext数据中的键值scae.getValue():获取application数据的value值,也就是ServletContext数据中的value值