热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

java中Servlet监听器的工作原理及示例详解

这篇文章主要介绍了java中Servlet监听器的工作原理及示例详解。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。感兴趣的可以来了解一下

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

监听器原理

监听原理

1、存在事件源
2、提供监听器
3、为事件源注册监听器
4、操作事件源,产生事件对象,将事件对象传递给监听器,并且执行监听器相应监听方法

监听器典型案例:监听window窗口的事件监听器
例如:swing开发首先制造Frame**窗体**,窗体本身也是一个显示空间,对窗体提供监听器,监听窗体方法调用或者属性改变:
* 关闭窗体时,调用windowListener 的windowclosing() , 传递windowEvent参数,表示窗体关闭事件对象
* 事件对象操作事件源,获得事件源状态

自定义监听器

以上内容可以用下图解释:

通过person.addPersonListener(new PersonListener(){})使事件源与监听器间产生联系。

事件源(在事件源方法中创建事件对象):

监听器(参数是事件对象)

事件对象(通过事件对象可以获得事件源)

测试方法

对上的匿名类补充:匿名内部类的作用是创建一个实现接口的匿名类对象,含义是创建一个继承自PersonListener的匿名类的对象),通过new表达式返回的引用被自动向上转型为对PersonListener的引用

Servlet监听器

(不需要配置,但是监听器仍需要进行注册)
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。

Servlet监听器分为三大类
1、数据域对象创建和销毁监听器
2、数据域对象和属性变更监听器
3、绑定到 HttpSession 域中的某个对象的状态的事件监听器

(一)数据域对象创建销毁监听器 — 监听三个与对象 (三个监听器)

1、ServletContextListener : 用来监听ServletContext对象的创建和销毁

监听创建
监听销毁
* ServletContext对象代表全局唯一对象,每个web工程会产生一个ServletContext,服务器启动创建,服务器关闭销毁

编写监听器
步骤一:编写类实现特定监听器接口
步骤二:注册监听器,不是通过事件源,而是在web.xml 进行配置
(监听器和Servlet、Filter不同,不需要url配置,监听器执行不是由用户访问的,监听器 是由事件源自动调用的)

servletContext域对象何时创建和销毁:

  • 创建:服务器启动针对每一个web应用创建servletcontext
  • 销毁:服务器关闭前先关闭代表每一个web应用的servletContext

ServletContextListener主流应用:
第一个:在服务器启动时,对一些对象进行初始化,并且将对象保存ServletContext数据范围内(因为在监听器内可以获得事件源对象) — 全局数据

  • 例如:创建数据库连接池

第二个:对框架进行初始化 例如:Spring框架初始化通过ServletContextListener (因为监听器代码在服务器启动时执行)

  • Spring框架(配置文件随服务器启动加载) org.springframework.web.context.ContextLoaderListener

第三个:实现任务调度,启动定时程序 (Timer、TimerTask) 使一个程序,定时执行

比如说每天晚上十二点给过生日的人进行生日祝福,中国移动对账户进行同步,会在服务器使用较少的时间,例如凌晨之类,启动一段程序,进行同步

java.util.Timer 一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
Timer提供了启动定时任务方法 schedule
* schedule(TimerTask task, Date firstTime, long period) 用来在指定一个时间启动定时器,定期循环执行
* schedule(TimerTask task, long delay, long period) 用来在当前时间delay多少毫秒后启动定时器
停止定时器,timer.cancel取消任务

2、HttpSession 数据对象创建和销毁监听器 —– HttpSessionListener

监听Session对象创建
监听Session对象销毁

Session何时创建:request.getSession()
Session何时销毁:关闭服务器,Session过期,session.invalidate
*Session过期时间通过web.xml配置(tomcat配置文件中),默认时间30分钟

配置:

HttpSession监听器

现有如下JSP页面:

1.jsp

2.jsp

访问1.jsp时会执行监听器原因:因为如果观察jsp的源码,封闭式英语培训jsp会被预处理成.java代码(在tomcat中work文件夹下,参见http://blog.csdn.net/megustas_jjc/article/details/53462025),我们打开这个.java代码的源码:

其中的getSession的实现实际就是request.getSession()

3、HttpServletRequest对象的创建和销毁监听器 —- ServletRequestListener

—-监听request对象创建
监听request对象销毁

Request何时创建:请求发起时创建
Request何时销毁:响应结束时销毁

例如:每次刷新界面都会创建销毁一次

注意(创建销毁次数由请求次数决定):
使用forward —- request创建销毁几次 —– 一次
使用sendRedirect —- request创建销毁两次 (两次请求)

(二)ServletContext/HttpSession/ServletRequest中保存数据 创建、修改、移除监听器

ServletContextAttributeListener 监听ServletContext中属性变化
HttpSessionAttributeListener 监听HttpSession中属性变化
ServletRequestAttributeListener 监听ServletRequest中属性变化

attributeAdded 监听属性添加 —- 当数据范围对象没有该属性,第一次添加时调用执行
attributeRemoved 监听属性移除 —- 从一个数据范围对象删除一个已经存在属性执行
attributeReplaced 监听属性替换 —– 当一个数据范围已经存在一个属性,向数据范围添加相同名称属性触发替换方法

例如,此处我们用HttpSessionAttributeListener举例(ServletContextListener与ServletRequestListener同理):

JSP页面

监听器

注册

注意:获得返回值通过session.getAttribute(se.getName())

(三)被绑定Session对象,自我状态感知监听器

保存在 Session 域中的对象可以有多种状态:绑定到 Session 中;从 Session 域中解除绑定;随 Session 对象持久化到一个存储设备中(钝化);随 Session 对象从一个存储设备中恢复(活化)

被存放Session的Java对象,感知自我四种状态变化
1、被绑定
2、被解除绑定
3、被钝化 —– 数据从内存序列化硬盘
4、被活化 —- 数据从硬盘重新加载回内存

HttpSessionBindingListener实现接口的java对象,感知自己被绑定到Session或者从Session中解除绑定
HttpSessionActivationListener实现接口的java对象,感知从内存被钝化硬盘上,雅思托福的区别从硬盘活化到内存中
实现这两个接口的类不需要 web.xml 文件中进行注册,都是由Session自主完成的,例如在存储对象的时候会自动调用绑定

HttpSessionBindingListener

* 绑定对象方法 —-
* 解除绑定方法 —–、当Session对象销毁时,当中所有绑定对象解除绑定

JSP页面:

HttpSessionActivationListener

* 感知对象被活化
* 感知对象被钝化
使用场景:Session保存数据,很长一段时间没用,但是不能销毁Session对象,不想占用服务器内存资源 —– 钝化(将服务器内存中数据序列化硬盘上)

JSP界面

读取数据

注意

钝化和活化应该由tomcat服务器 自动进行 —- 配置tomcat

配置context有几个位置?
1、tomcat/conf/context.xml 对所有虚拟主机 所有web工程生效
2、tomcat/conf/Catalina/localhost/context.xml 对当前虚拟主机所有web工程生效
3、当前工程/META-INF/context.xml 对当前工程有效

钝化后 it315目录在哪里?在“tomcat/work/Catalina/localhost/项目名”目录中

java对象如果想实现序列化,需要实现Serializable接口(因此上述Bean2实现Serializable接口,才可以被钝化,并之后进行活化并读取)

到此这篇关于java中Servlet监听器的工作原理及示例详解的文章就介绍到这了,更多相关java Servlet监听器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
author-avatar
你走之后你的美我如何收拾_686
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有