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. uva 10012

    题目意思:  给定m个圆的半径,现在要求找到一个矩形使得每一个球都以地面相切,要求输出最小的矩阵的长度 #include <iostream> #include <algorithm ...

  2. 技巧:Linux 动态库与静态库制作及使用详解

    技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...

  3. CPU天梯图

    一幅图,了解CPU

  4. cocos2d-x 头文件中添加方法变量导致编译报错

    代码如下: HelloWorldScene.h #ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__ #include " ...

  5. Onlylady介绍

    Onlylady介绍 Onlylady介绍

  6. Easyui获取数据库date数据的显示

    众所周知Oracle数据库中的date与众不同,在Easyui中显示数据库的date类型如果不经过转化为显示为Object.因此需要经过处理. 1.首先你要写转化date的JavaScript < ...

  7. 一条sql

    包含全部:SELECT u.id,u.user_name,usa.fixed_amount,d.uloadtype,d.min_loan_money FROM fanwe_user_autobid u ...

  8. 50个Android开发技巧(10 为TextView加入样式)

    首先来看一个控件的例子: (原文地址:http://blog.csdn.net/vector_yi/article/details/24428085) 手机上类似这种场景你一定已经见过非常多次了,但有 ...

  9. 2013国内IT行业薪资对照表【技术岗】

    (本文为转载,具体出处不详) 说薪水,是所有人最关心的问题.我只 想说如果想在薪水上面满意,在中国,没有哪里比垄断国企好.电力.烟草.通信才是应该努力的方向.但是像我们这种搞研发的进IT行业似乎是注定 ...

  10. [Angular 2] Interpolation: check object exists

    In Angular2, sometime we use @Output to pass data to parent component, then parent may pass the data ...