Servlet监听器

Servlet监听器

是Servlet2.3版本后新增功能

能够在不修改原有Servlet基础上,监听程序中Servlet各个对象:ServletContext、HttpSession、HttpServletRequest对象中存取数据的变化。

可以监听客户端的请求,服务器端的操作

主要包括:事件模型和监听器两部分组成

事件模型

事件是java中的一个重要的概念,指某个代码运行过程中的一个状态,如:HttpSession创建,属性值的改变等都可以用事件来描述

事件:java.util.EventObject

       getSource()-Object

事件侦听程序:

(标志)接口:java.util.EventListener

实现listener接口

事件源:

注册侦听程序

触发事件侦听程序

生成事件对象

调用已注册的侦听程序,处理事件

典型的时间监听过程

创建一个Context生命周期事件来管理数据库的连接,这个监听器有如下的功能。

1.这个监听器监视着程序的启动

2.这个应用程序写入日志到数据库中并且把连接对象存储在Context中

3.Servlet使用连接对象来执行SQL

4.监听器监听应用程序的关闭

5.在关闭应用程序之前,先关闭连接对象

各类事件对应的监听器接口


具体对应关系


HttpSessionListener

事件(类):HttpSessionEvent

getSession

侦听器(接口):HttpSessionListener

sessionCreated(HttpSessionEventse)

sessionDestroyed(HttpSessionEventse)

HttpSessionListener

示例:

实现接口HttpSessionListener

注册侦听

在WEB.XML中注册侦听程序

<listener>
	<listener-class>
		servlet.OnlineCounterListener
	</listener-class>
</listener>

HttpSessionListener

示例:利用HttpSessionListener实现网站

在线人数统计功能

public class OnlineCounter {
  private static long online = 0;
  public static long getOnline() { return online; }
  public static void raise() { online++; }
  public static void reduce() { online--;}
}

public class OnlineCounterListener implements HttpSessionListener { 
    public void sessionCreated(HttpSessionEvent hse) { 
        System.out.println("in session create");
        OnlineCounter.raise(); 
    } 
    public void sessionDestroyed(HttpSessionEvent hse) { 
        OnlineCounter.reduce(); 
    } 
}

测试

<%
    out.println("onlineCount:"+OnlineCounter.getOnline());
%>

事件定义三要素

1.事件源头

2.动作

3.触发回调用(触发动作后调用什么东西   类似于js的οnclick="回调")

监听器

事件源头(HttpServletRequst、HttpSession、ServletContext)

动作(生命周期阶段(对象产生、销毁)、数据变化(setAttribute、removeAttribute))


例:

ServletRequestListener

创建一个文件继承 接口ServletRequestListener

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
/**
 * 监听request对象的产生和销毁
 * request的生命周期  
 * 		浏览器发起请求 产生request对象  
 * 		响应后request对象被销毁
 * @author Administrator
 *
 */
public class RequstCycleListener implements ServletRequestListener {
	/**
	 * 监听request对象销毁
	 */
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("request 请求被销毁");
	}
	/**
	 * 监听request对象产生
	 */
	public void requestInitialized(ServletRequestEvent sre) {
		HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
		System.out.println("request 请求产生了 "+request.getRequestURL());
	}

}
web.xml文件注册监听器
 <!-- 注册监听器 request -->
  <listener>
    <listener-class>cn.et.RequstCycleListener</listener-class>
  </listener>

HttpSessionListener

package cn.et;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * 监听session对象的产生、销毁
 * 	session的生命周期
 * 		session原理是通过容器在调用getSession方法时 自动通过cookie写入sessionid的方式来控制
 * 		cookie默认的有效期是浏览器关闭之前,当前session的有效期是当前这一次浏览器访问
 * 		session数据存放在容器中  容器无法监听 浏览器的关闭  会通过web.xml
 *		   <session-config>
 *		  	<session-timeout>1</session-timeout>
 *		  </session-config>
 *		来决定定时清除,长期未访问的session数据
 * @author Administrator
 *
 */
public class MySessionListener implements HttpSessionListener {
	/**
	 * 监听session对象 的创建
	 */
	public void sessionCreated(HttpSessionEvent se) {
		HttpSession session = se.getSession();
		System.out.println("session产生了:"+session.getId());
	}
	/**
	 * 监听session对象 的销毁
	 */
	public void sessionDestroyed(HttpSessionEvent se) {
		HttpSession session = se.getSession();
		System.out.println("session被销毁了:"+session.getId());
	}

}
<!-- 注册监听器 session -->
  <listener>
    <listener-class>cn.et.MySessionListener</listener-class>
  </listener>
ServletContextListener

package cn.et;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
 * 监听ServletContext对象
 * 
 * ServletContext生命周期
 * 	伴随应用的发布(产生)和关闭(销毁)
 * 
 * 数据存储逻辑(setAttribute 和 getAttribute)
 * 	所有的servlet都需要共享  数据需要保留时间很长 写入ServletContext
 * 	数据使有状态的  不同用户用于不同的数据  写入HttpSession
 * 	传递的参数  或者  请求转发跳转数据传递  写入HttpServletRequest   应用最多
 */
public class MyServletContext implements ServletContextListener {
	/**
	 * 监听ServletContext对象 的创建
	 */
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("上下文对象被销毁");
		
	}
	/**
	 * 监听ServletContext对象 的销毁
	 */
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("上下文对象产生");
	}

}
 <!-- 注册监听器 context -->
  <listener>
    <listener-class>cn.et.MyServletContext</listener-class>
  </listener>

HttpSessionAttributeListener 其它两个有与之类似

package cn.et;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class MySessionActivationListener implements HttpSessionAttributeListener {
	/**
	 * session.setAttribute("sex","boy");
	 */
	public void attributeAdded(HttpSessionBindingEvent event) {
		String key = event.getName();
		String value = event.getValue().toString();
		System.out.println("set:"+key+"="+value);
	}
	/**
	 * session.removeAttribute("sex","boy");
	 */
	public void attributeRemoved(HttpSessionBindingEvent event) {
		String key = event.getName();
		String value = event.getValue().toString();
		System.out.println("remove:"+key+"="+value);
	}
	/**
	 * 替换
	 * 比如session中存在sex=boy
	 * session.removeAttribute("sex","girl");
	 */
	public void attributeReplaced(HttpSessionBindingEvent event) {
		String key = event.getName();
		String value = event.getValue().toString();
		System.out.println("替换:"+"set:"+key+"="+value);
	}

	

}
 <listener>
    <listener-class>cn.et.MySessionActivationListener</listener-class>
  </listener>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值