1、web.xml的配置

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>testServletListener</display-name>
<listener>
<listener-class>test_servlet_package.MyRequestListener</listener-class>
</listener>
<listener>
<listener-class>test_servlet_package.MySessionListener</listener-class>
</listener>
<listener>
<listener-class>test_servlet_package.MyServletContextListener</listener-class>
</listener>
<!-- 配置欢迎界面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

2、RequestListener

 package test_servlet_package;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/*
Servlet事件监听器
在Servlet技术中已经定义了一些事件,
并且我们可以针对这些事件来编写相关的事件监听器,从而对事件作出相应处理。
Servlet事件主要有3类:Servlet上下文事件、会话事件与请求事件
下面具体讲解这3类事件的监听器实现。 1.对Servlet上下文进行监听
可以监听ServletContext对象的创建和删除以及属性的添加、删除和修改等操作。该监听器需要使用到如下两个接口类:
● ServletContextAttributeListener:监听对ServletContext属性的操作,如增加、删除、修改操作。
● ServletContextListener:监听ServletContext,
当创建ServletContext时,激发contextInitialized (ServletContextEvent sce)方法。
当销毁ServletContext时,激发contextDestroyed(ServletContext- Event sce)方法。 2.监听Http会话
可以监听Http会话活动情况、Http会话中属性设置情况,也可以监听Http会话的active、paasivate情况等。该监听器需要使用到如下多个接口类:
● HttpSessionListener:监听HttpSession的操作。
当创建一个Session时,激发session Created (SessionEvent se)方法;
当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
● HttpSessionActivationListener:用于监听Http会话active、passivate情况。
● HttpSessionAttributeListener:监听HttpSession中属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;
当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;
当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。 3.对客户端请求进行监听
对客户端的请求进行监听是在Servlet 2.4规范中新添加的一项技术,使用的接口类如下:
● ServletRequestListener接口类。
● ServletRequestAttrubuteListener接口类 */
public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{
public void requestDestroyed(ServletRequestEvent arg0) {
//对销毁客户端请求进行监听
print("reqeust destroyed");
}
public void requestInitialized(ServletRequestEvent arg0) {
//对实现客户端请求进行监听
print("Request init");
ServletRequest sr = arg0.getServletRequest(); //初始化客户端请求
print(sr.getRemoteAddr()); //获得请求客户端的地址
}
public void attributeAdded(ServletRequestAttributeEvent arg0) {
//对属性的添加进行监听
print("attributeAdded('"+arg0.getName()+"','"+arg0.getValue()+"')");
}
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
//对属性的删除进行监听
print("attributeRemoved('"+arg0.getName()+"','"+arg0.getValue()+"')");
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
//对属性的更新进行监听
print("attributeReplaced('"+arg0.getName()+"','"+arg0.getValue()+"')");
}
private void print(String message){
//调用该方法在txt文件中打印出message字符串信息
PrintWriter out = null;
try{
out = new PrintWriter(new FileOutputStream("d:\\output.txt",true));
out.println(new java.util.Date()+" RequestListener: "+message);
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
/*
对客户端请求进行监听的技术是在Servlet 2.4版本之后才出现的。一旦监听程序能够获得客户端请求,
就可以对所有客户端请求进行统一处理。例如,一个Web程序如果在本机访问,就可以不登录,如果是远程访问,
即需要登录。这是通过监听客户端请求,从请求中获取到客户端地址,并通过地址来作出相应的处理。
程序说明:该监听器类实现了ServletRequestListener和ServletRequestAttributeListener两接口类,
ServletRequestListener接口类中定义的两个方法对客户端请求的创建和销毁进行监听;
ServletRequestAttributeListener接口类对请求中的属性添加、修改和删除进行监听。
*
*/
}

3、ServletContextListener

 package test_servlet_package;

 import java.io.FileOutputStream;
import java.io.PrintWriter; import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener,ServletContextAttributeListener{
private ServletContext context = null; //定义一个ServletContext对象变量,赋为null
public void contextInitialized(ServletContextEvent s) {
//TODO 该方法实现了ServletContextListener接口定义的方法,对ServletContext进行初始化
this.context = s.getServletContext(); //初始化一个ServletContext对象
print("ServletContext初始化......"); //打印出该方法的操作信息
}
public void contextDestroyed(ServletContextEvent s) {
//TODO 该方法实现了ServletContextListener接口类定义方法,用于释放ServletContext对象
this.context = null;
print("ServletContext被释放......");
}
public void attributeAdded(ServletContextAttributeEvent sa) {
//TODO 当上下文添加属性时,将调用该方法。这里只是将添加的属性信息打印出来
print("增加ServletContext对象的一个属性:attributeAdded('"+sa.getName()+"',' "+sa.getValue()+"')");
}
public void attributeRemoved(ServletContextAttributeEvent sa) {
//TODO 当把ServletContext中的某个属性删除时,调用该方法
print("删除ServletContext对象的某一个属性:attributeRemoved('"+sa.getName()+"'");
}
public void attributeReplaced(ServletContextAttributeEvent sa) {
//TODO 当上下文进行属性值更新时,将调用该方法
print("更改ServletContext对象的某一个属性:attributeReplaced('"+sa.getName()+"','"+sa.getValue()+"')");
}
private void print(String message){
//调用该方法在txt文件中打印出message字符串信息
PrintWriter out = null;
try{
out = new PrintWriter(new FileOutputStream("D:\\output.txt",true));
out.println(new java.util.Date()+" ContextListener: "+message);
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
/*
程序说明:该监听器类实现了ServletContextAttributeListener和ServletContextListener两个接口类中的5个方法:
● contextInitialized(ServletContextEvent s)方法用来初始化ServletContext对象。
● contextDestroyed(ServletContextEvent s)方法在上下文中删除某个属性时调用。
● attributeAdded(ServletContextAttributeEvent sa)方法在上下文中添加一个新的属性时调用。
● attributeReplaced(ServletContextAttributeEvent sa)方法在更新属性时调用。
● attributeRemoved(ServletContextAttributeEvent sa)方法在上下文中删除某个属性时会被调用。
在使用这个监听器之前还需要在Web模块中的web.xml配置文件中进行声明,代码如下:
<listener>
<listener-class>servlet.MyServletContextListener</listener-class>
</listener>
* */ }

4、SessionBindingListener

 package test_servlet_package;

 import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; public class MySessionBindingListener implements HttpSessionBindingListener{ @Override
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println(arg0.getName() + arg0.getValue());
} @Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println(arg0.getName() + arg0.getValue());
} }

5、SessionListener

 package test_servlet_package;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionActivationListener,HttpSessionAttributeListener,HttpSessionListener,ServletContextListener{
ServletContext context = null;
int users = 0;
public void sessionWillPassivate(HttpSessionEvent arg0) {
//监听Http会话的passivate情况
print("sessionWillPassivate("+arg0.getSession().getId()+")");
}
public void sessionDidActivate(HttpSessionEvent arg0) {
//监听Http会话的active情况
print("sessionDidActivate("+arg0.getSession().getId()+")");
}
public void attributeAdded(HttpSessionBindingEvent arg0) {
//监听Http会话中的属性添加
print("attributeAdded('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
//监听Http会话中的属性删除
print("attributeRemoved('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
//监听Http会话中的属性更改操作
print("attributeReplaced('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
}
public void sessionCreated(HttpSessionEvent arg0) {
//Http会话的创建监听
users++; //创建一个会话,把users变量加1
print("sessionCreated('"+arg0.getSession().getId()+"'),目前拥有"+users+"个用户");
context.setAttribute("users",new Integer(users)); //把会话数设置到ServletContext的属性users中
}
public void sessionDestroyed(HttpSessionEvent arg0) {
//Http会话的释放监听
users--;//释放一个会话,把users变量减1
print("sessionDestroyed('"+arg0.getSession().getId()+"'),目前拥有"+users+"个用户");
context.setAttribute("users",new Integer(users)); //把会话数设置到ServletContext的属性users中
}
public void contextInitialized(ServletContextEvent arg0) {
//该方法实现了ServletContextListener接口定义的方法,对ServletContext进行初始化
this.context = arg0.getServletContext();//初始化ServletContext对象
print("ServletContext初始化......");//打印出该方法的操作信息
}
public void contextDestroyed(ServletContextEvent arg0) {
//监听Servlet上下文被释放
this.context = null; //释放ServletContext对象
print("ServletContext被释放......");//打印出该方法的操作信息
}
private void print(String message){
//调用该方法在txt文件中打印出message字符串信息
PrintWriter out = null;
try{
out = new PrintWriter(new FileOutputStream("d:\\output.txt",true));
out.println(new java.util.Date()+" SessionListener: "+message);
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
/*
(1)该程序实现了HttpSessionListener接口类中的两个方法:
● sessionCreated(HttpSessionEvent arg0)方法进行Http会话创建的监听,如果Http会话被创建将调用该方法。
● sessionDestroyed(HttpSessionEvent arg0)方法对Http会话销毁进行监听,如果某个Http会话被释放将调用该方法。
(2)实现HttpSessionActivationListener接口类中的如下两个方法:
● sessionDidActivate(HttpSessionEvent arg0)方法对Http会话处于active情况进行监听。
● sessionWillPassivate(HttpSessionEvent arg0)方法对Http会话处于passivate情况进行监听。
(3)实现HttpSessionAttributeListener接口类中的如下3种方法:
● attributeAdded(HttpSessionBindingEvent arg0)方法对Http会话中属性添加进行监听。
● attributeReplaced(HttpSessionBindingEvent arg0)方法对Http会话中属性修改进行监听。
● attributeRemoved(HttpSessionBindingEvent arg0)方法对Http会话中属性删除进行监听。
(4)另外,该程序中还实现了ServletContextListener接口类,该类的实现方法已经在12.2.1小节中有所介绍。
同样需要在web.xml配置文件进行该监听器的声明,该监听器实现了在线会话人数的统计,
当一个会话创建时,users变量将加1;当销毁一个会话对象的时候,users变量将减1。
*/ }

6、测试

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="test_servlet_package.MySessionBindingListener"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>index.jsp</title>
</head>
<body>
<%
out.println("Test ServletContextListener");
application.setAttribute("userid", "zzb"); //添加一个属性
application.setAttribute("userid", "zzb2"); //替换掉已经添加的属性
application.removeAttribute("userid"); //删除该属性
%>
<%
out.println("Test SessionListener");
session.setAttribute("username", "zzb1"); //在Http会话中设置一个用户username属性
session.setAttribute("username", "zzb2"); //修改之上添加的username属性 session.removeAttribute("username"); //删除创建的username属性
MySessionBindingListener mySessionBindingListener = new MySessionBindingListener();
session.setAttribute("onlineUserListener", mySessionBindingListener); session.invalidate(); //passivate Http会话
%>
<%
out.println("Test RequestListener");
request.setAttribute("username", "zzb1"); //在请求中设置一个用户username属性
request.setAttribute("username", "zzb2"); //修改之上添加的username属性
request.removeAttribute("username");
%>
</body>
</html>

总结:测试监听器的小案例、方便查询复习

最新文章

  1. 在SqlServer查询分析器里 访问远程数据库 进行数据查询更新等操作(openrowset)
  2. Android ViewHolder工具
  3. C# 多线程---------&lt;一&gt;
  4. Android Activity间传值
  5. Xp输入法不见了
  6. 软件推荐----截图软件Snagit
  7. Particle Filters
  8. OpenCV3计算机视觉Python语言实现笔记(三)
  9. 用SSH登录远程的机器,在远程机器上执行本地机器上的脚本
  10. Pytorch 资料汇总(持续更新)
  11. HDU3031 To Be Or Not To Be 左偏树 可并堆
  12. SQL-23 对所有员工的当前(to_date=&#39;9999-01-01&#39;)薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
  13. mysql配置文件修改
  14. JNDI 在 J2EE 中的角色
  15. 使用gradle 编译生成 apk出现的问题
  16. 03: shell简单监控脚本
  17. DATASNAP远程方法返回TSTREAM正解
  18. web项目中的 log4net的配置
  19. MQ中将消息发送至远程队列的配置
  20. 利用MSF批量打RMI漏洞

热门文章

  1. Window mode
  2. 自己定义JSTL函数
  3. Java迭代器原理
  4. python langid实现语种识别
  5. debug模式下dlgdata.cpp line 43 断言失败
  6. Java三大器之过滤器(Filter)的工作原理和代码演示
  7. 载入本地Html文件
  8. WAMP设置
  9. 冰点文库下载器V3.1.4
  10. zabbix监控第二块网卡是否连通