本文共 5114 字,大约阅读时间需要 17 分钟。
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中注册侦听程序
servlet.OnlineCounterListener
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文件注册监听器
HttpSessionListenercn.et.RequstCycleListener
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数据 * @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()); }}1 *
ServletContextListenercn.et.MySessionListener
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("上下文对象产生"); }}
HttpSessionAttributeListener 其它两个有与之类似cn.et.MyServletContext
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); } }
cn.et.MySessionActivationListener