【Servlet】Servlet监听器
一、Servlet监听器的概念
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
三、监听器的分类
3.1 按照监听的对象划分
1、用于监听应用程序环境对象(ServletContext)的事件监听器,实现ServletContextListener、ServletContextAttributeListener接口
2、用于监听用户会话对象(HttpSeesion)的事件监听器,实现HttpSessionListener、HttpSessionAttributeListener接口
3、用于监听请求消息对象(ServletRequest)的事件监听器,实现ServletRequestListener、ServletRequestAttributeListener接口
3.2按照监听事件划分
1、监听域对象自身的创建和销毁的事件监听器
根据监听对象不同分别实现ServletContextListener、HttpSessionListener、ServletRequestListener接口。
①ServletContext的创建和销毁:contextInitialized方法和contextDestroyed方法
public void contextInitialized(ServletContextEvent sce)//ServletContext创建时调用
public void contextDestroyed(ServletContextEvent sce)//ServletContext销毁时调用
主要用途:作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等
实例:
在web.xml中可以配置项目初始化信息,在contextInitialized方法中进行启动
<context-param>
<param-name>属性名</param-name>
<param-value>属性值</param-value>
</context-param>
自定义监听器
public class MyFirstListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
//获取web.xml中配置的属性
String value=sce.getServletContext().getInitParameter("属性名");
System.out.println(value);
}
public void contextDestroyed(ServletContextEvent sce){
//关闭时操作
}
}
②HttpSession的创建和销毁:sessionCreated和sessionDestroyed方法
public void sessionCreated(HttpSessionEvent se)//session创建时调用
public void sessionDestroyed(HttpSessionEvent se)//session销毁时调用
主要用途:统计在线人数、记录访问日志等
【注】
web.xml配置session超时参数,单位:分,session超时的时间并不是精确的
<session-config>
<session-timeout>10</session-timeout>
</session-config>
③ServletRequest的创建和销毁:requestInitialized和requestDestroyed方法
public void requestInitialized(ServletRequestEvent sre)//request创建时调用
public void requestDestroyed(ServletRequestEvent sre)//request销毁时调用
主要用途:读取request参数,记录访问历史
实例:
public class MySRequestListener implements SevletRequestListener{
public void requestInitialized(ServletRequestEvent sre){
String value=sre.getServletRequest().getParameter("key");//获取request中的参数
System.out.println(value);
}
public void requestDestroyed(ServletRequestEvent sre){
System.out.println("request destroyed");
}
}
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接口
四、Servlet3.0下监听器的使用
4.1 使用条件
1、使用servlet3.0新标准的jar包
2、JDK在1.6以上版本
3、编译器的编译级别为6.0
4、在web.xml文件中,使用3.0规范
5、使用支持servlet3.0特性的web容器,比如tomcat7
4.2 servlet3.0下监听器的用法
使用注解 @WebListener 即可,无法去定义监听器的顺序
属性名 | 类型 | 是否可选 | 描述 |
value | String | 是 | 该监听器的描述信息 |
@WebListener("This is a listener")
public class FirstListener impliements ServletRequestListener{}
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:
ServletContextListener
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
【Servlet】Servlet监听器的更多相关文章
- Servlet的监听器
Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...
- 第六章 对象作用域与servlet事件监听器
作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器 一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...
- Servlet的监听器Listener
Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是 随web应用的启动而启动,只初始化一次,随web ...
- JSP学习笔记(5)——Servlet、监听器、过滤器、MVC模式介绍
MVC模式 在讲解Servlet前,先介绍一下MVC模式. M:model 模型,相当于数据层,用于存放数据,如一个Java中的一个bean类 V:view 视图,相当于页面层,用于显示数据,如一个网 ...
- org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet
java.lang.ClassCastException: org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.se ...
- sae Servlet class XXXX is not a javax.servlet.Servlet
以前都是使用myeclipse开发web工程上传sae后没有问题,但是使用javaee导出war包上传sae 无法访问 Servlet class XXXX is not a javax.servl ...
- cannot be cast to javax.servlet.Servlet
在第一次开发Maven项目时,maven环境和仓库以及eclipse都和讲师讲解的一样,可是却遇到下面这个问题: java.lang.ClassCastException: servlet.UserS ...
- java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servlet.Servlet
java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servl ...
- 异常:Servlet class X is not a javax.servlet.Servlet
使用Maven命令 mvn archetype:create 创建了一个简单的web项目.导入Eclipse运行时,报这样的异常信息: Servlet class X is not a javax.s ...
- Servlet Servlet是Java平台上的CGI技术
Servlet Servlet是Java平台上的CGI技术.Servlet在服务器端运行,动态地生成Web页面.与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更 ...
随机推荐
- 十分钟学习 react配套的类型检测库——prop-types的运用
js 有时在定义变量的类型为number 或string 时并不会报错,所以prop-types 是专门用来检测react ,以前的版本是把它放到react架构里面 ,现在作为一个独立的库搬出来了,跟 ...
- vuex-along解决vuex中存储的数据在页面刷新之后失去的问题
1. 为什么会失去? vuex可以看成是一个"提升变量"的一个工具,它是将state当做全局变量存储.F5刷新页面之后自然随着页面的刷新重新初始化state. 2. 如果解决数据保 ...
- 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?
string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 “=” ,每次 “=” 操作都是一次 “new”. static 修饰符的成员只实例化一次?? 解释:这个说法 ...
- 完美编译街机模拟器MAME(Android版)基于MAME4all
重新编译MAME4droid源码 github上开源项目MAME4all可将MAME模拟器运行在iOS和Android上,还有一个比较有名的叫MAME4droid(MAME for android), ...
- [学习笔记]最小割树(Gomory-Hu Tree)
最小割树(\(\mathcal{Gomory-Hu Tree}\))简明指南 对于单源最短路径,我们有\(SPFA\)和\(Dijkstra\),对于多源最短路径,我们有\(Floyd\):对于两点间 ...
- zmq的send
int zmq_send (void *socket, zmq_msg_t *msg, int flags); 2.2.1 nt zmq_send (void *socket, void * ...
- mysql 存储过程 随笔
CREATE PROCEDURE `g2`( in sts int,in type int, code varchar(20),in s int)begin declare i int; declar ...
- Android Studio 安装及汉化
{ https://www.bilibili.com/video/av48649403?from=search&seid=15739157224002905777 Tool: https:// ...
- Java初识方法
5.初识方法 方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用. 5.1 方法的定义 5.1.1方法的定义格式 [方法修饰列表] 返回值类型 方法名(方法参数列表){ 方法体 } ① ...
- 理解TCP/IP,SOCKET,HTTP,FTP,RMI,RPC,webservic
TCP/IP:网络宽带,传输数据的基础协议,所有得数据要在网络上传输都是基于TCP/IP协议(或UDP),才能送达到指定的目的地(IP,服务器硬件地址). SOCKET:SOCKET只是面对编程人员的 ...