JSP中的监听器  
  Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止、Session会话的开始和销毁、用户请求的开始和结束等等。有时程序员需要在这些事件发生的时机执行一些处理,以完成特定的任务(如通过监控Session的开始和结束,可统计网站的在线人数)。事实上,这些事件是可以编码处理的,Servelt API提供了大量的监听器Listener来监听Web程序中发生的这些事件,程序员只要实现恰当的特定的事件监听器,就可以对该事件进行处理。

使用监听器需要两个步骤:
第一,实现特定的Listener类,编写事件处理;
第二,通过web.xml(或者Annotation)配置启用该Listener。

总共有8个Listener接口,分为3类
1. 与ServletContext有关的Listener接口: 
  ServletContextListener  
  ServletContextAttributeListener 
2. 与HttpSession有关的Listener接口:  
  HttpSessionListener  
  HttpSessionAttributeListener
  HttpSessionActivationListener 
  HttpSessionBindingListener 
3. 与ServletRequest有关的Listener接口:  
  ServletRequestListener
  ServletRequestAttributeListener

监听器接口 实现方法 事件 执行时机
ServletContextListener   contextInitialized()
contextDestroyed()
ServletContextEvent   加载Web应用时(如启动服务器后),会调用contextInitialized(),
移除Web应用时(服务器停止),会调用contextDestroyed ()方法。
ServletContextAttributeListener  attributeAdded()  
attributeReplaced()  
attributeRemoved()
ServletContextAttributeEvent  向application设置属性、置换、移除属性时依次调用这 三个方法
HttpSessionListener   sessionCreated()
sessionDestroyed () 
HttpSessionEvent    在HttpSession对象创建和销毁时会依次调用这两个方法
HttpSessionAttributeListener  attributeAdded()
attributeReplaced()
attributeRemoved()
HttpSessionBindingEvent  向Session设置属性、置换、移除属性时依次调用这三个方法 
HttpSessionActivationListener  sessionDidActivate()  
sessionWillPassivate()
HttpSessionEvent  当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以,这两个方法分别执行于Activeate之后与Passivate之前
HttpSessionBindingListener  valueBound()
valueUnbound() 
HttpSessionBindingEvent 

在HttpServletRequest对象创建和销毁时会依次调用这两个方法

ServletRequestListener  requestInitialized()
requestDestroyed()
RequestEvent   向request对象设置属性、置换、移除属性时依次调用这三个方法
ServletRequestAttributeListener attributeAdded()  
attributeReplaced()  
attributeRemoved()
ServletRequestAttributeEvent  其实例被加入至session对象的属性中,则调valueBound(),
若从session对象的属性中移除,则调valueUnbound();
实现 HttpSessionBindingListener接口的类无需在web.xml配置

例1:ServletContextAttributeListener接口(需要实现三个方法)

MyServletContextAttributeListener.java

public class MyServletContextAttributeListener implements ServletContextAttributeListener {public void attributeAdded(ServletContextAttributeEvent arg0) {
// application范围属性添加时调用
System.out.println("添加application范围属性,属性名"+arg0.getName()+",属性值"+arg0.getValue());
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// application范围属性替换时调用
System.out.println("替换application范围属性,属性名"+arg0.getName()+",替换后的属性值"+arg0.getValue());
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// application范围属性移除时调用
System.out.println("移除application范围属性,属性名"+arg0.getName());
}
}

web.xml

  <listener>
<description>MyServletContextAttributeListener</description>
<listener-class>com.servlet.MyServletContextAttributeListener</listener-class>
</listener>

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>设置application范围属性</title>
</head>
<body>
<%
application.setAttribute("name", "James");
application.setAttribute("name", "123");
application.removeAttribute("name");
%>
</body>
</html>

控制台输出:

添加application范围属性,属性名name,属性值James
替换application范围属性,属性名name,替换后的属性值James
移除application范围属性,属性名name

例2:HttpSession Listener
1.HttpSessionListener接口,负责监听session的创建与销毁
MyHttpSessionListener.java 需要实现两个函数

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {//session启动时调用
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session= arg0.getSession();
System.out.println("创建session,ID为"+session.getId());
}
//session销毁时调用
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("销毁session");
}
}

HttpSessionAttributeListener接口 负责监听session内属性的创建、修改、删除
MyHttpSessionAttributeListener.java

@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("移除session范围属性");
}
public void attributeAdded(HttpSessionBindingEvent arg0) {
HttpSession session = arg0.getSession();
System.out.println("添加session范围属性"+session.getAttribute("name"));
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
HttpSession session = arg0.getSession();
System.out.println("修改session范围属性"+session.getAttribute("name"));
} }

web.xml,设定Listener的映射

  <listener>
<description>MyHttpSessionListener</description>
<listener-class>com.servlet.MyHttpSessionListener</listener-class>
</listener>
<listener>
<description>MyHttpSessionAttributeListener</description>
<listener-class>com.servlet.MyHttpSessionAttributeListener</listener-class>
</listener>

HttpSession.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>关于session</title>
</head>
<body>
<%
session.setAttribute("name", "张三");
session.setAttribute("name", "李四");
session.removeAttribute("name");
session.invalidate();
%>
</body>
</html>

控制台显示:

添加session范围属性张三
修改session范围属性李四
移除session范围属性
销毁session

JavaWeb学习笔记--Listener的更多相关文章

  1. JavaWeb学习笔记总结 目录篇

    JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...

  2. javaweb学习笔记整理补课

    javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...

  3. 【JAVAWEB学习笔记】06_jQuery基础

    接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...

  4. javaweb学习笔记(二)

    一.javaweb学习是所需要的细节 1.Cookie的注意点 ① Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任意值,创建后允许被修改. ② 关于Cookie中的setMaxAg ...

  5. Javaweb学习笔记(一)

    一.javaweb学习是所需要的细节 1.发送响应头相关的方法 1).addHeader()与setHeader()都是设置HTTP协议的响应头字段,区别是addHeader()方法可以增加同名的响应 ...

  6. JavaWeb学习笔记(二十一)—— 监听器Listener

    一.监听器概述 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对 ...

  7. JavaWeb学习笔记之Servlet(一)

    1. 引子: 当我们开始进入JavaWeb开发的学习时,我们就必须要和Servlet和HTTP这两个词进行打交道了,尤其是Servlet.即使到了后面使用JSP (我们知道JSP其本身就是一个Serv ...

  8. Javaweb学习笔记——上传下载文件

    一.前言 在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为comm ...

  9. 【JAVAWEB学习笔记】13_servlet

    JavaWeb核心之Servlet 教学目标 案例一.完成用户登录功能 案例二.记录成功登录系统的人次 一.Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序, ...

随机推荐

  1. hdu 4541 Ten Googol

    http://acm.hdu.edu.cn/showproblem.php?pid=4541 打表找规律 #include <cstdio> #include <cstring> ...

  2. 向PE文件中添加一个Section

    背景 之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存 ...

  3. Yii创建前台和后台登录表单和通过扩展 CWebUser 增加信息到 Yii::app()->user

    我参考了这篇文章来构建项目的前台和后台的目录结构.感谢Andy的这篇文章.按照所有的步骤,您将有单独的前台和后台面板,如: http://localhost/index.php // 前台 http: ...

  4. 【HDOJ】2577 How to Type

    DP. /* 2577 */ #include <cstdio> #include <cstring> #include <cstdlib> #define MAX ...

  5. AngularJs中文社区学习资料

    AngularJs中文社区学习资料,供学习: http://angularjs.cn/tag/AngularJS

  6. HDU-5532(LIS-nlogn)

    思路: 解法一: 新的认识get+1,对于一个数组,可以通过记录他'<'和'>'来判断数组的升降序状态,这种方法只需要n的复杂度就可以解决问题,需要注意的一点是,每次删除一个结点在消失两个 ...

  7. libvirt TLS

    博客原文 http://hi.baidu.com/wwfmarcpjkbdiod/item/7b43c89e949d7fbbcd80e590 构建Libvirt的x509证书远程tls连接http:/ ...

  8. Linux下的bc计算器

    bc = basic calculator scale:设置精度,默认为0 obase:设置输出进制,默认为10 ibase:设置输入进制,默认为10 原文:http://www.linuxidc.c ...

  9. (转)keytools命令

    结合网络资源,对keytool使用总结,以备后用: Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件 ...

  10. lesson6:jmeter和badboy配合使用

    由于jmeter不支持脚本的录制,只能手动设置,在某些集成型的压力测试时,使用不是很方便,这时可以和badboy一起配合使用,badboy支持网页操作的录制功能,并能把录制的操作导出为jmeter的脚 ...