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>