Servlet监听器
来源:互联网 发布:ugui drawcall 优化 编辑:程序博客网 时间:2024/06/07 02:44
一.监听器的概念
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
监听对象:
1、ServletContext:application,整个应用只存在一个
2、HttpSession:session,针对每一个对话
3、ServletRequest:request,针对每一个客户请求
监听内容:创建、销毁、属性改变事件
监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。
创建步骤:
1、创建一个实现监听器接口的类
2、配置web.xml文件,注册监听器
<listener>
<listener-class>完整类名</listener-class>
</listener>
监听器的启动顺序:按照web.xml的配置顺序来启动
加载顺序:监听器 >过滤器>servlet三.监听器的分类
1、按照监听的对象划分
1)用于监听应用程序环境对象(ServletContext)的事件监听器
实现ServletContextListener、ServletContextAttributeListener接口
2)用于监听用户会话对象(HttpSeesion)的事件监听器
实现HttpSessionListener、HttpSessionAttributeListener接口
3)用于监听请求消息对象(ServletRequest)的事件监听器
实现ServletRequestListener、ServletRequestAttributeListener接口
2、按照监听事件划分
1、监听域对象自身的创建和销毁的事件监听器
根据监听对象不同分别实现ServletContextListener、HttpSessionListener、ServletRequestListener接口。
①ServletContext的创建和销毁:contextInitialized方法和contextDestroyed方法
publicvoid contextInitialized(ServletContextEvent sce)//ServletContext创建时调用
publicvoid contextDestroyed(ServletContextEvent sce)//ServletContext销毁时调用
主要用途:作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等
实例:
在web.xml中可以配置项目初始化信息,在contextInitialized方法中进行启动
<context-param>
<param-name>属性名</param-name>
<param-value>属性值</param-value>
</context-param>
public class MyFirstListenerimplements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
//获取web.xml中配置的属性
Stringvalue=sce.getServletContext().getInitParameter("属性名");
System.out.println(value);
}
public void contextDestroyed(ServletContextEvent sce){
//关闭时操作
}
}
②HttpSession的创建和销毁:sessionCreated和sessionDestroyed方法
public voidsessionCreated(HttpSessionEvent se)//session创建时调用
public voidsessionDestroyed(HttpSessionEvent se)//session销毁时调用
主要用途:统计在线人数、记录访问日志等
【注】
web.xml配置session超时参数,单位:分,session超时的时间并不是精确的
<session-config>
<session-timeout>10</session-timeout>
</session-config>
③ServletRequest的创建和销毁:requestInitialized和requestDestroyed方法
public voidrequestInitialized(ServletRequestEvent sre)//request创建时调用
public voidrequestDestroyed(ServletRequestEvent sre)//request销毁时调用
主要用途:读取request参数,记录访问历史
2、监听域对象中的属性的增加和删除的事件监听器
根据监听对象不同分别实现ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。
实现方法:attributeAdded、attributeRemoved、attributeReplaced
3、监听绑定到HttpSeesion域中的某个对象的状态的事件监听器(创建普通JavaBean)
HttpSession中的对象状态:绑定→解除绑定;钝化→活化
实现接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)
【注1】①要实现钝化和活化必须实现Serializable接口
②不需要在web.xml中注册
【注2】
绑定: 通过setAttribute保存到session对象当中
解除绑定: 通过removeAttribue去除
钝化: 将session对象持久化到存储设备上
活化: 将session对象从存储设备上进行恢复
session钝化机制:
①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反序列化到内存中,整个过程由服务器自动完成;
②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和解除需要实现HttpSessionBindingListener接口
MyListener implementsHttpSessionAttributeListener
{
attributeAdded(HttpSessionBindingEvenet event)
{
System.out.println("有对象加入session中");
}
attributeRemoved(HttpSessionBindingEvent event)
{
System.out.println("有对象从session中移除");
}
attributeReplaced(HttpSessionBindingEvent event)
{
System.out.println("属性值改变");
}
}
当有对象添加到session中时,session.setAttribute("object",other)触发attributeAdded事件,
当该对象从session移除时,session.removeAttribute("object")触发attriubteRemoved事件,
当该属性的值发生变化时, session.replaceAttribute("object",another)触发attributeRepalced事件。
注意:只要有对象保存到session中或从session中移除或改变属性的值都会触发相应事件,不论该对象是否实现了AttributeListener。
HttpSessionBindingListener:当一个对象实现了该接口,且该对象被绑定到session中或从session中删除时,Servlet容器会通知该对象,该对象在接收到通知后做初始化操作或清除状态操作;
该接口提供了如下方法:
1,public void valueBound(HttpSessionBindingEventevent):当对象正在被绑定到session中时,Servlet容器通知对象它将被绑定到某个对话并标识该对话;
2,public void valueUnBound(HttpSessionBindingEventevent):当从session中删除该对象时,Servlet容器通知对象要从某个会话中取消对它的绑定并标识该对话;
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。即HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
publicclass UserObject implements HttpSessionBindingListener
{
public voidvalueBound(HttpSessionBindingEvent event)
{
System.out.println("触发绑定事件!");
}
public voidvalueUnbound(HttpSessionBindingEvent event)
{
System.out.println("解除和session的绑定");
}
}
UserObject user = new UserObject();
当把该监听器保存到session中,session.setAttribute("user",user)时就会触发valueBound事件.
当该监听器从session中移除时即session.removeAttribute("user"),触发valueUnbound事件;session失效或超时
时也会触发valueUnbound事件。
注意:只有当该监听器(UserObject)保存到session中或从session移除时才会触发事件,其他没有实现该listener对象保存到session时不会触发该事件。
四、Servlet3.0下监听器的使用
servlet3.0下监听器的用法
使用注解@WebListener 即可,无法去定义监听器的顺序
@WebListener的常用属性
属性名 类型 是否可选 描述
value String 是 该监听器的描述信息
@WebListener("Thisis a listener")
publicclass FirstListener impliements ServletRequestListener{}
- Servlet监听器
- servlet监听器
- Servlet监听器
- Servlet监听器
- servlet 监听器
- servlet监听器
- Servlet监听器
- servlet监听器
- Servlet监听器
- Servlet监听器
- Servlet监听器
- Servlet监听器
- Servlet监听器
- Servlet监听器
- servlet监听器
- servlet监听器
- servlet监听器
- servlet监听器
- 7 MapReduce进阶之shuffle阶段
- SpringMVC概念原理分析
- 查看内存使用情况
- 关于java代码jtable不显示表头的解决
- 互联网+农业:十万亿市场的各个环节都在这里了
- Servlet监听器
- Trivial Problem CodeForces
- JavaScript for Kids 学习笔记7. 函数
- C#算法之递归
- ubuntu16.04 boot空间提示不足
- [笔记]算法复习笔记---数组、集合、散列表(上)
- 2017年校招全国统一模拟笔试(第一场)编程题集合——好多鱼
- A Trivial Problem
- PackageManagerService分析之二