博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet监听器
阅读量:4102 次
发布时间:2019-05-25

本文共 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文件注册监听器
cn.et.RequstCycleListener
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 *		   
*
1
*
* 来决定定时清除,长期未访问的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()); }}
cn.et.MySessionListener
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("上下文对象产生");	}}
cn.et.MyServletContext
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);	}	}
cn.et.MySessionActivationListener
你可能感兴趣的文章
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
HTML&CSS进阶
查看>>
Servlet进阶和JSP基础
查看>>
servlet&jsp 的使用以及jsp的历史遗留用法
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>