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. IIS not allow PUT and DELETE method

    refer : http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis ...

  2. LINK : fatal error LNK1000: Internal error during IncrBuildImage

    一.下微软的补丁:KB948127补丁来解决,http://code.msdn.microsoft.com/KB948127.貌似安装了也不起作用二.如果下载的补丁没安装成功或下载失败,可以用下面的方 ...

  3. vim 中按键映射问题

    按键映射关键字的组成开始让我摸不着头脑,查了资料,然后来做一个log 按键绑定命令:模式前缀(缺省为normal) + 递归前缀(缺省为空) + map 前缀表示生效范围,递归前缀表示是否递归查找命令 ...

  4. [LeetCode] 35. Search Insert Position 解决思路

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  5. APP纯黑盒测试---某些可以试试的操作

    一.多次快速点击一处功能入口: 该测试方法可以在某些应用中打开俩次目标界面,举一些具体一点的例子: 1.比如现在很多APP需要登陆,如果打开了俩次登录页面,就容易造成登录成功后应用跳转界面又是登录界面 ...

  6. S-Nim

    http://acm.hdu.edu.cn/showproblem.php?pid=1536 SG经典题,不多说 // File Name: hdu1536.cpp // Author: bo_jwo ...

  7. php防sql注入、xss

    php自带的几个防止sql注入的函数http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2013/0318/12234.html addslashe ...

  8. [深入React] 8.refs

    我们可以从 this.refs.xxx 获取到对象,有俩种情况: <input type="text" ref="name"/> 取到的是DOM元素 ...

  9. NSDateFormatter整理

    dd/MM/yyyy hh:mmaaa                          10/05/2010 03:49PM yyyy:MM:dd G 'at' HH:mm:ss zzz       ...

  10. 简析MFC中CString用作C字符串

      MFC中CString是一个方便的字符串操作的类, 然而很多函数需要传递字符指针, 这就需要进行CString和普通字符串的转换. 1.CString用作C字符串常量. 直接使用强制类型转换即可, ...