java Web三大组件--监听器
监听器概述
监听器(Listener)是一种特殊的Servlet技术,它可以监听Web应用的上下文信息、Servlet请求信息和Servlet会话信息,即ServletContext、ServletRequest、HttpSession。并根据不同的情况,在后台调用相应的处理程序。利用监听器对Web应用进行监听和控制,来增强Web应用的事件处理能力。
监听器要用到javax.servlet.jar中的一组监听接口和事件类,根据监听对象的不同,监听器可被划分为3种:
1)ServletContext事件监听器:用于监听应用程序环境对象。
2)HttpSession事件监听器:用于监听用户会话对象。
3)ServletRequest事件监听器:用于监听请求消息对象。
这3种监听器共包含了8个监听接口、6个监听事件类。
| 监听对象 | 监听接口 | 监听事件类 |
| ServletRequest | ServletRequestListener | ServletRequestEvent |
| ServletRequestAttributeListener | ServletRequestAttributeEvent | |
| HttpSession | HttpSessionListener | HttpSessionEvent |
| HttpSessionActivationListener | ||
| HttpSessionAttributeListener | HttpSessionBindingEvent | |
| HttpSessionBindingListener | ||
| ServletContext | ServletContextListener | ServletContextEvent |
| ServletContextAttributeListener | ServletContextAttributeEvent |
监听器的启动顺序
1)当有多个监听器时,按各监听器在web.xml中配置的顺序进行先后顺序启动。
2)相较于过滤器、Servlet的启动顺序是:
监听器>过滤器>Servlet
Listener分类
1)监听ServletContext对象(对应jsp内置对象——application对象)
对ServletCOntext对象实现监听,可以监听到ServletContext对象中属性的变化(增删改操作),也可以就监听到ServletContext对象本身的变化(创建和销毁)。常见监听方法:
| 接口名称 | 接口方法 | 激发条件 |
| ServletContextAttributeListener | public void attributeAdded(ServletContextAttributeEvent scab); | 增加属性 |
| public void attributeRemoved(ServletContextAttributeEvent scab); | 删除属性 | |
| public void attributeRepalced(ServletContextAttributeEvent scab); | 修改属性 | |
| ServletContextListener | public void contextInitialized(ServletContextEvent sce); | 创建对象 |
| public void contextDestroyed(ServletContextEvent sce); | 销毁对象 |
2)监听会话(HttpSession对象)(对应jsp内置对象——session对象):
对HttpSession对象实现监听,可以监听到HttpSession对象中属性的变化(增删改操作),也可以就监听到HttpSession对象本身的变化(创建和销毁),以及该对象的状态,还可以监听HttpSession对象是否绑定到该监视器对象上。常见监听方法:
| 接口名称 | 接口方法 | 激发条件 |
| HttpSessionAttributeListener | public void attributeAdded(HttpSessionBindingEvent se); | 增加属性 |
| public void attributeRemoved(HttpSessionBindingEvent se); | 删除属性 | |
| public void attributeReplaced(HttpSessionBindingEvent se); | 修改属性 | |
| HttpSessionListener | public void sessionCreated(HttpSessionEvent se); | 创建对象 |
| public void sessionDestroyed(HttpSessionEvent se); | 销毁对象 | |
| HttpSessionActivationListener | public void sessionDidActivate(HttpSessionEvent se); | 会话刚被激活 |
| public void sessionWillPssivate(HttpSessionEvent se); | 会话将要钝化 | |
| HttpSessionBindingListener | public void valueBound(HttpSessionBindingEvent se); | 调用setAttribute() |
| public void valueUnbound(HttpSessionBindingEvent se); | 调用removeAttribute() |
注意1:
活化(Activate)和钝化(Passivate)是Web容器为了更好地利用系统资源或者进行服务器负载平衡等原因而对特定对象采取的措施。
会话对象的钝化是指暂时将会话对象通过序列化的方法存储到硬盘上;
活化与钝化相反,是把硬盘上存储的会话对象重新加载到Web容器中。
Tomcat中的两种钝化管理器:org.apache.catalina.session.StandardManger和org.apache.catalina.session.Persistentmanger
注意2:
session的销毁有两种情况:
(1)session超时,web.xml配置:
<session-config>
<session-timeout>120</session-timeout><!--session120分钟后超时销毁-->
</session-config>
(2)手工使session失效
public void invalidate();//使session失效方法。session.invalidate();
3)监听请求(ServletRequest对象)(对应jsp内置对象——request对象)
对ServletRequest对象实现监听,可以监听到ServletRequest对象中属性的变化(增删改操作),也可以就监听到ServletRequest对象本身的变化(创建和销毁)。常见监听方法:
| 接口名称 | 接口方法 | 激发条件 |
| ServletRequestAttributeListener | public void attributeAdded(ServletRequestAttributeEvent srae); | 增加属性 |
| public void attributeRemoved(ServletRequestAttributeEvent srae); | 删除属性 | |
| public void attributeReplaced(ServletRequestAttributeEvent srae); | 修改属性 | |
| ServletRequestListener | public void requestInitialized(ServletRequestEvent sre); | 创建对象 |
| public void requestDestroyed(ServletRequestEvent sre); | 销毁对象 |
监听器设计步骤(实例)
实例:实现在线人数统计。
当一个浏览器第一次访问网站时,服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器用户注销或访问超时的时候,服务器会销毁相应的HttpSession对象,触发HttpSession销毁事件,同时调用所注册的HttpSessionListener事件监听器的sessionDestroyed方法。这样,只需在HttpSessionListener实现类的sessionCreated方法中让计数器加1,在sessionDestroyed方法中让计数器减1,就可以实现网站在线人数的统计功能。(在参考博客中还有其他方法统计网站在线人数,在此不再赘述)
创建实现对应接口的监听器类:
package com.listener; import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class OnlineListener implements HttpSessionListener { //定义静态变量存储在线人数
private static int onlineCount=0; @Override
public void sessionCreated(HttpSessionEvent arg0) {
onlineCount++;
} @Override
public void sessionDestroyed(HttpSessionEvent arg0) {
if(onlineCount>0) onlineCount--; } //自定义一个返回在线人数的方法
public static int getOnlineCount(){
return onlineCount;
} }
配置web.xml文件(配置相对简单,只需配置监听器所在的类,无需配置映射地址)
在servlet 3.0版本及更高版本中,可以使用注解的方式将实现了某个监听器接口的类声明为监听器,即在类名上标注@WebListener。
<!-- 配置监听器 -->
<listener>
<listener-class>com.listener.OnlineListener</listener-class>
</listener>
创建显示在线人数的jsp页面(注意要导入监听器类所在的包)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.listener.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>在线人数显示页面</title>
</head>
<body>
<h2>当前的在线人数:<%=OnlineListener.getOnlineCount() %></h2>
</body>
</html>
然后可用不同浏览器访问这一网址,查看运行结果。
参考博客:http://www.cnblogs.com/coderland/p/5902874.html
参考书籍:《Java EE框架开发技术与案例教程 》
java Web三大组件--监听器的更多相关文章
- java web(五):java web三大组件之另外两个和八大监听器
java的三大组件指Servlet.Filter.Listener.八大监听器指八个接口.前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置, Listener监听那些事件. ...
- java web 三大组件
JavaWeb三大组件 Servlet,Filter,Listener. Servlet Servlet的作用 在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器 ...
- Java Web三大组件之过滤器(Filter)
什么是过滤器?有什么用? 过滤器JavaWeb三大组件之一,它与Servlet很相似.不过滤器是用来拦截请求的,而不是处理请求的.过滤,顾名思义,就是留下我们想要的,丢掉我们不需要的.例如:某个网站的 ...
- java Web三大组件--过滤器
参考博客:http://www.cnblogs.com/coderland/p/5902878.html https://www.cnblogs.com/HigginCui/p/5772514.htm ...
- web三大组件的加载顺序
Web三大组件:过滤器组件 监听器组件 Servlet组件 过滤器的顶级接口:javax.servlet.Filter 监听器的顶级接口:javax.servlet.ServletContextL ...
- 第一章 java nio三大组件与使用姿势
本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...
- java web多组件协作实现用户登录验证
实现步骤: 1.创建用户登录提交界面 2.创建处理用户登录请求servlet组件Main 3.创建代表登录成功响应的servlet的组件LoginSuccess 4.创建代表登录失败响应的servle ...
- web三大组件
1.Servlet Servlet是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的Servlet上进行处理. Servlet的任务有: 接收请求数据 ...
- Java NIO 三大组件之 Buffer
NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...
随机推荐
- html 转义处理
比如要把:<span>test</span> 这段代码当做文本原样输出在页面上,如果按照正常的方式,肯定会被转义,在页面上只能看到 text.那么要想达到预想的效果,应该怎么办 ...
- Struts框架(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)
代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...
- 7-Flink的分布式缓存
分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取. 此缓存的工作机制如下:程序注 ...
- NuGet包和功能
Microsoft.AspNetCore.Razor.Tools:提供TagHelper的智能感知提示和代码加粗高亮显示. Microsoft.AspNetCore.Session:管理会话状态的中间 ...
- jquery的jsonp的使用
客户端 $(function(){ $.ajax({ type: "get", async: false, url: "http://test.com/json_data ...
- #21 Python异常
前言 运行程序时经常遇到各种错误,例如:ImportError(导入模块错误).IndexError(索引错误).NameError(变量错误).SyntaxError(语法错误).Indentati ...
- 十分钟了解ZAB(Zookeeper Atomic Broadcast)协议
Zookeeper基于ZAB(Zookeeper Atomic Broadcast),实现了主备模式下的系统架构,保持集群中各个副本之间的数据一致性. ZAB协议定义了选举(election).发现( ...
- shell编程基础(六): 透彻解析查找命令find
find 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只要你具有相应的权限. ...