监听器
admin
2024-02-25 14:55:05
0
今天学习了新的知识监听器 监听器就是监听某个对象的的状态变化的组件,是基于观察者模式设计的 Listener监听器是Servlet中一种比较特殊的类,能帮助监听web中的特定事件,如ServletContext、 HttpSession、ServletRequest 的创建和销毁;变量的创建、销毁和修改等;也可以在某些动作前后增 加处理,实现监控。servlet2.5规范中共有 8 种Listener 监听器的相关概念: 事件源:被监听的对象  ----- 三个域对象 request  session  servletContext 监听器:监听事件源对象  事件源对象的状态的变化都会触发监听器 注册监听器:将监听器与事件源进行绑定 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 程序员编写代 码 基础编程 需要监听session的创建和销毁 监听什么操作使用对应的接口 while(w!=-1){ sb.append(instr.substring(0,w)); sb.append(newstr); instr=instr.substring(w+oldstr.length()); w=instr.indexOf(oldstr); } sb.append(instr); return sb.toString().getBytes(); } } 在web.xml中配置监听器 session对象的销毁操作 注解开发方式 监听器原理 Listener监听器就是一个实现特定接口的普通Java程序,这个程序专门用于监听一个java对象的方法调用 或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。 被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。 对应接口 1、ServletContextListener完成 Servlet 上下文整体监听 contextInitialized(ServletContextEvent event)监听application上下文初始化。 public class MyListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { //session对象创建时回调 的方法 System.out.println("创建session,对应的时间对象为"+se+",对应的事件 源"+se.getSession()); } @Override public void sessionDestroyed(HttpSessionEvent se) { //session对象销毁时回 调的方法 System.out.println("销毁session,对应的时间对象为"+se+",对应的事件 源"+se.getSession()); } } com.yan.listeners.MyListener session.invalidate(); @WebListener public class MyListener implements HttpSessionListener { 2contextDestroyed(ServletContextEvent event)监听application上下文关闭。 2、ServletContextAttibuteListener完成 Servlet 上下文内容监听 attibuteAdded(ServletContettributeEevent event)监听对象加入application的范围时。 atributeReplaced(ServetContexttributeEvent event)监听在application范围对象取代另一个对象 时 atributeRemoved(erleCotettributcEvent event)监听对象从 application 的范围移除时。 3、HttpSessionListener完成session整体监听 sessionCreated(HttpSessionEvent event)监听 session 初始化。 sessionDetoyed(HtpSessionEvent event)监听 session 销毁。 4、HttpSessionActivationListener完成session激活钝化状态监听 sessionDidActivate(HtpSessionEvent event)监听 session 变为有效状态。 sessionWillPassivae(HttpSessionEvent event)监听 session 变为无效状态。 5、HttpSessionAttributeListener完成session内容监听 attributeAdded(HttpSessionBindingEvent event)监听对象加入 session 中 attributeReplaced(HttpSessionBindingEvent event)监听 session 中有对象取代另一个对象时 attributeRemoved(HttpSessionBindingEvent event)监听对象从 session 中移除时。 6、HttpSessionBindingListener完成session绑定监听 valueBound(HttpSessionBindingEvent event)监听对象加入 session 中 valueUnBound(HttpSessionBindingEvent event)监听对象从 session 中移除。 7、ServletRequestListener完成 ServletRequest 监听 requestInitalized(ServletRequestEvent event)监听 ServletRequest 已经被初始化 requestDestroyed(ServletRequestEvent event)监听 ServletRequest 已经被销毁 8、ServletRequestAttributeListener完成 ServletRequest 内容监听 attributeAdded(ServletRequestAttributeEvent event)监听对象加入 request 中 attributeReplaced(ServletRequestAttributeEvent event)监听 request 中有对象取代另一个对象 attributeRemoved(ServletRequestAttributeEvent event)监听对象从 request 中移除时。 监听request ServletRequestListener是用户响应监听器,用于对Request请求进行监听,包括创建和销毁 简单使用servletRequestListener来实现web浏览量的变化 在servletRequest对象被建立的时候调用初始化方法,从内存中读取servletContext对象的count属性, 而后输出历史访问量。 同时在此基础上加一重新设置servletContext对象的count属性的内容,当 servletRequest对象被销毁的时候调用销毁时的方法打印出当前浏览量,这样就简单的实现了web浏览的量的累加计数 public class ListenerTest implements ServletRequestListener { @Override 请求监听 监听客户端请求,本地机无许登陆 特殊:绑定监听 HttpSessionBindingListener完成session绑定监听 valueBound(HttpSessionBindingEvent event)监听对象加入 session 中 valueUnBound(HttpSessionBindingEvent event)监听对象从 session 中移除。 前者为数据绑定。所谓对session进行数据绑定,就是调用session.setAttribute()把 HttpSessionBindingListener保存进session中。 后者为取消绑定 valueUnbound的触发条件是以下三种情况: 1. 执行session.invalidate()时。 2. session超时,自动销毁时。 3. 执行session.setAttribute(“onlineUserListener”, “其他对象”);或 session.removeAttribute(“onlineUserListener”);将listener从session中删除时。 因此,只要不将listener从session中删除,就可以监听到session的销毁。) public void requestDestroyed(ServletRequestEvent arg0) { System.out.println("requestDestroyed" + "," + new Date()); System.out.println("当前访问次数:" + arg0.getServletContext().getAttribute("count")); } @Override public void requestInitialized(ServletRequestEvent arg0) { System.out.println("requestInitialized" + "," + new Date()); Object count = arg0.getServletContext().getAttribute("count"); Integer cInteger = 0; if (count != null) { cInteger = Integer.valueOf(count.toString()); } System.out.println("历史访问次数::" + count); cInteger++; arg0.getServletContext().setAttribute("count", cInteger); } } public class LoginListener implements ServletRequestListener { public void requestDestroyed(ServletRequestEvent arg0) { } public void requestInitialized(ServletRequestEvent arg0) { ServletRequest req=arg0.getServletRequest(); if(req.getRemoteAddr().startsWith("127")) req.setAttribute("isLog", new Boolean(true)); } } public class OnlineUserBindingListener implements HttpSessionBindingListener { 总结 监听器Listener就是在application、session、request三个对象创建、销毁或者往其中添加修改删 除属性时自动执行代码的功能组件 Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等 Listener实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的 启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工 作、设置一些基本的内容、比如一些参数或者是一些固定的对象等 注解开发 Servlet3之前的版本都是在web.xml中配置的,而Servlet3之后的版本则使用更为便捷的注解方式来配置。此外,不同版本的Servlet所需的Java/JDK版本也不相同,Servlet3要求JDK1.6,对应Tomcat7 @WebServlet注解定义在 Servlet 的类声明之前,用于定义 Servlet 组件。使用该注解,就无须在 web.xml 文件中对 Servlet 进行配置 name(String) 等价于 ,如果没有显式指定,则为类的全限定名 value(String[]) 该属性等价于urlPatterm属性。两个属性不能同时使用 urlPatterns(String[]) 等价于 标签 loadOnStartup(int) 指定Servlet的加载顺序,等价于 标签 initParams(WebInitParam[]) 指定一组Servlet初始化参数,等价于 标签 asyncSupported(boolean) 声明Servlet是否支持异步操作模式,等价于 标签 description(String) 该Servlet的描述信息,等价于 标签 String username; public OnlineUserBindingListener(String username){ this.username=username; } public void valueBound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 把用户名放入在线列表 List onlineUserList = (List) application.getAttribute("onlineUserList"); // 第一次使用前,需要初始化 if (onlineUserList == null) { onlineUserList = new ArrayList(); application.setAttribute("onlineUserList", onlineUserList); } onlineUserList.add(this.username); } public void valueUnbound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 从在线列表中删除用户名 List onlineUserList = (List) application.getAttribute("onlineUserList"); onlineUserList.remove(this.username); System.out.println(this.username + "退出。"); } } @WebFilter注解用于声明过滤器,该注解将会在部署时被容器处理,容器根据具体的属性配置将相应的 类部署为过滤器。 filterName(String)指定过滤器的name属性,等价于 value(String[])该属性等价于urlPatterns属性。但是两者不应该同时使用 urlPattemns(String[]) 指定一组过滤器的URL匹配模式。等价于 标签 servletNames(String[]) 指定过滤器将应用于哪些 Servlet initParams(WebInitParam]) 指定一组过滤器初始化参数,等价于 标签 asyncSupported(Boolean) 声明过滤器是否支持异步操作模式,等价于 标签 description(String) 该过滤器的描述信息,等价于 标签 @WebListener用于声明监听器,还可以用于充当给定 Web 应用上下文中各种 Web 应用事件的监听器的类。可以使用 @WebListener 来标注一个实现ServletContextListener、 ServletContextAttributeListener、ServletRequestListener、ServletRequestAttributeListener、 HttpSessionListener和HttpSessionAttributeListener 的类。@WebListener 注释有一个 value 的属 性,该属性为可选属性,用于描述监听器信息。使用该注释就不需要在 web.xml 文件中配置标签了。 @WebInitParam注解等价于 web.xml 文件中的和的子标签该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数。 @MultipartConfig注解主要是为了从 request 对象中获取 Part 文件对象。一般用于文件上传的 Servlet上。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...