【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具有更高的效率并更 ...
随机推荐
- Unity中嵌入网页插件Embedded Browser2.1.0
背景 最近刚换了工作,新公司不是做手游的,一开始有点抵触,总觉得不是做游戏自己就是跨行了,认为自己不对口,但是慢慢发现在这可以学的东西面很广,所以感觉又到了打怪升级的时候了,老子就在这进阶了. 一进公 ...
- pytest_fixture--scope="session"
import pytest@pytest.fixture(scope="session")def login(): print("\n输入用户名密码登陆! configt ...
- wpf中datagrid绑定数据源发生改变
1.若datagrid绑定的数据源是同一个的话,即使里面的数据不同.页面也不会刷新,则需要重置数据源,再绑定.处理如下: datagrid1.ItemsSource=ListModule; 若List ...
- C语言结构体指针
#include <stdio.h> int main() { /*************************************************** *结构体指针:指向 ...
- 转载:vs2010 问题 >LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
原文链接:http://www.cnblogs.com/newpanderking/articles/3372969.html >LINK : fatal error LNK1123: 转换到 ...
- Batch - FINDSTR
总结 Searches for strings in files. 在文件中寻找特定的字符串 官方文档 C:\Users\cuixunxu>FINDSTR /? Searches for str ...
- ruby on rails笔记
一.新建rails项目步骤: 1.生成新项目 rails new demo cd demo vi Gemfile 末尾end前增加 gem 'execjs' gem 'therubyracer ...
- PHP ftp_rmdir() 函数
定义和用法 The ftp_rmdir() 函数删除 FTP 服务器上的一个目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_rmdir(ftp_connectio ...
- vue中利用scss实现整体换肤和字体大小设置
一.前言 利用Sass预处理实现换肤和字体大小调整. 思路及达到的效果:字体大小的适配使用window.devicePixelRatio的值和需要调整的差量进行控制.页面初始化是的字体适配可以根据de ...
- JavaScript闭包和回调详解
一.闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包有三个特性: 1.函数嵌套函数; 2.函数内部可以引用外部的参数和变量; 3.参 ...