问题:

在 Servlet 技 术 中 我 们 学 习 了 request 、 session 、application 作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也就无法再指定的时机对数据和对象进行操作,比如 session 销毁的时候,在线人数-1。

解决:

使用监听器

概念:

Servlet 监听器是 Servlet 规范中定义的一种特殊类,用于监听

ServletContext、HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

ServletRequest和HttpServletRequest的区别:

HttpServletRequest和ServletRequest都是接口

HttpServletRequest继承自ServletRequest

HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。如

getHeader(), getMethod(),getSession()等等。

客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。

对象包含了客户端请求信息包括:

请求的地址,

请求的参数,

提交的数据,

上传的文件客户端的ip甚至客户端操作系统都包含在其内。

当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest对象,使用这个对象可以取得所有HTTP请求中的信息,可以在Servlet中进行处理,也可以转发给其他的Servlet/Jsp处理。
ServletRequestListener用于监听ServletRequest对象的创建和销毁,一个ServletRequest可以注册多个ServletRequestListener接口,request创建时调用requestInitialized(),request销毁时调用requestDestroyed()

监听对象:

Request

Session

Application

监听内容:

创建、销毁、属性改变事件

监听作用:

在事件发生之前,之后进行一些处理,比如统计在线人数

使用:

监听 request

监听 session

监听 application

案例:

统计网站在线人数


创建和使用步骤

一 创建一个普通java类实现指定的接口(从下列接口中选择)

1.监听request的创建和销毁:ServletRequestListener

requestInitialized(ServletRequestEvent sre)---创建

requestDestroyed(ServletRequestEvent sre)--销毁

形参:

  1. ServletRequestEvent可以获取当前监听到的request对象,
  2. 对request对象的中的资源进行操作。

1,1.监听request作用域数据的变更:ServletRequestAttributeListener

attributeAdded(ServletRequestAttributeEvent srae)--添加

attributeRemoved(ServletRequestAttributeEvent srae) --移除

attributeReplaced(ServletRequestAttributeEvent srae) --修改

形参:

  1. ServletRequestAttributeEvent可以获取当前被监听到的request中的数据。
  2. geName()返回监听到的数据的键
  3. getValue()返回监听的到的数据的值。

2.监听session的创建和销毁:HttpSessionListener

可用来做当前在线人数的统计功能

sessionCreated(HttpSessionEvent se)--创建

sessionDestroyed(HttpSessionEvent se)--销毁

形参:

  1. 获取当前被监听到的session对象
  2. 监听session的作用域数据的变更:

2.1 attributeAdded(HttpSessionBindingEvent event)--增加

2.2 attributeRemoved(HttpSessionBindingEvent event)--移除

2.3 attributeReplaced(HttpSessionBindingEvent event)--修改

形参:

  1. 获取当前监听到的session中的数据 getName()返回数据的键名
  2. getValue()返回数据的值

3.监听application对象的创建和销毁:ServletContextListener

可用来统计页面访问人数的操作或者投票操作

contextInitialized(ServletContextEvent sce)

contextDestroyed(ServletContextEvent sce)

形参:

  1. 获取application对象

2. 监听application对象的数据的变更:ServletContextAttributeListener

2.1 attributeAdded(ServletContextAttributeEvent event) --新增

2.2 attributeRemoved(ServletContextAttributeEvent event)--移除

2.3 attributeReplaced(ServletContextAttributeEvent event)--修改

形参:

  1. 获取当前被监听的数据 getName()返回数据的键名
  2. getValue()返回数据的值

二 在项目中的web.xml中配置监听器,让监听器生效

<listener><listener-class>监听器类的包名和类名</listener-class>
</listener>
示例:<listener><listener-class>com.lin.listener.MyListener</listener-class>
</listener>


在线人数的案例操作

每当有一个访问连接到服务器时,服务器就会创建一个session 来管理会话。那么我们就可以通过统计session 的数量来获得当前在线人数。

所以使用到的是HttpSessionListener √监听器。

public class MyListener implements HttpSessionListener,ServletContextListener{//监听Application对象@Overridepublic void contextInitialized(ServletContextEvent sce) {//声明计数对象int count=0;//获取Application对象ServletContext sc = sce.getServletContext();sc.setAttribute("count",count);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stub}//监听Sesion对象@Overridepublic void sessionCreated(HttpSessionEvent se) {//获取Application对象中的计数器ServletContext sc = se.getSession().getServletContext();int count=(int) sc.getAttribute("count");//计数器自增++count;//然后再将计数器存储到application中sc.setAttribute("count", count);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {//获取Application对象中的计数器ServletContext sc = se.getSession().getServletContext();int count=(int) sc.getAttribute("count");//计数器自减--count;//然后再将计数器存储到application中sc.setAttribute("count", count);}}

监听程序当前无法识别连接符中请求的服务_[Servlet] 18 监听器相关推荐

  1. ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务-Oracle连接错误

    连接Oracle时突然报"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误 检查OracleServiceORCL服务是否启动! win10:此电脑→管理 ...

  2. ORA-12514 监听程序当前无法识别连接描述符中的服务

    今天在用oracle的时候遇到了这样一个问题:"ORA-12514 监听程序当前无法识别连接描述符中的服务",网了看了好多别人的办法都没有解决,自己就试着解决了一下,嘿,还真解决了 ...

  3. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

    在安装完Oracle10g后,使用PL/SQL工具连接,提示如下的问题: ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 解决办法是手动修改监听配置文件: # listen ...

  4. windows 2008 64位oracle11g部署问题(3)之ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务...

    oracle11g安装完毕了,监听也起来了,发现通过客户端 本地网络服务名配置(如下图)链接oracle11g服务器,确报ORA-12514的错误,该如何解决呢? 1. 找到listener.ora监 ...

  5. windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法 参考文章: (1)windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求 ...

  6. ora-12514: tns: 监听程序当前无法识别连接描述符中请求的服务 问题解决

    通过PlSQL Developer 访问oracle出现: ora-12514: tns: 监听程序当前无法识别连接描述符中请求的服务 通过重启服务的方式启动数据库,也不能连接上oracle数据库   ...

  7. oracle中srv添加监听服务,Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务...

    Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务 解决过程: 1. 找到listener.ora监听文件,具体位置:D:\app\Administrator ...

  8. oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  9. ora-12514TNS 监听程序当前无法识别连接描述符中请求服务的解决

    这里写自定义目录标题 今天需要连一个新库,地址账户密码输进去之后报: ora-12514TNS 监听程序当前无法识别连接描述符中请求服务. 照着网上各种教程折腾了一天也没弄好.网上主要的解决办法是配置 ...

最新文章

  1. android sdk 源码解析
  2. android控件---自定义带文本的ImageButton
  3. Spring Boot 2.0与Java 9
  4. 这篇博士论文致谢句句诛心......
  5. MSsql server里日期不能直接存入date字段,要转换一下
  6. 基于JAVA+SpringBoot+Mybatis+MYSQL的园区招商管理系统
  7. windows下vbs脚本隐藏控制台
  8. mysql sql参数化查询_mybatis的sql参数化查询
  9. grub的boot loader安装在磁盘上的位置
  10. 长度游程编码的JAVA源代码,java游程编码
  11. 使用librosa库对音频信号进行采样以及分帧处理
  12. python判断素数(质数):for-else循环的理解与示例应用
  13. Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)
  14. NODE_多文件上传
  15. 佳能 MG3080 打印机换墨盒
  16. 删除打开方式中的选项
  17. spark代码 spark-submit提交yarn-cluster模式
  18. 【高中数学选修2-3】排列,组合,二项式定理,杨辉三角
  19. 安装完sdk后,在cmd运行adb,发现不行。
  20. 邻接表/图/DFS/BFS

热门文章

  1. 安卓获取mysql数据封装方法_android SQLite数据库封装
  2. 贝叶斯网络学习Python环境搭建(pgmpy)
  3. 【LeetCode】剑指 Offer 60. n个骰子的点数
  4. 【转】浅析Java中的final关键字
  5. 利用 Chrome 原生功能截图网页全图
  6. Hibernate操作数据库步骤(包括语法)
  7. chrome调试本地项目, 引用本地javascript文件
  8. BZOJ 2653 middle
  9. HDU 4255 A Famous Grid 素数+BFS
  10. [JAVA实现]微信公众号网页授权登录,java开发面试笔试题