JavaWeb之Listener监听器
监听在Java体系中运用的很广泛,在安卓开发、JavaWeb开发中到处存在,在其他语言也有类似的,如果有了解过设计模式那很容易理解实现的原理。不过对于开发者来说,使用观察者模式只需实现相应的接口就好,所以很方便。在Servlet2.5中有8种的Listener,Session、Request、Context的创建与销毁、属性变化对应6种还有2个是对Session内对象的监听。
一、监听对象的创建与销毁
1.ServletRequestListener:监听Request的创建和监听

每次请求都会执行requestInitialized(ServletRequestEvent sre)方法,request处理完毕自动销毁前会执行requestDestroyed(ServletRequestEvent sre)方法。
ServletRequestEvent的API可以看下图,里面有一个getServletContext()方法可以获得值改变后的getServletContext

2.HttpSessionListener:监听Session的创建和监听

Session创建时执行sessionCreated(HttpSessionEvent se)方法,当Session销毁失效时执行sessionDestroyed(HttpSessionEvent se)方法。下面再看下HttpSessionEvent对象。

从API可以看到可以通过getSession()方法获取改变后的session对象。
3.ServletContextListener:监听Context的创建和销毁

通知将开始 Web 应用程序初始化过程。在初始化 Web 应用程序中的所有过滤器或 servlet 之前,应该通知所有 ServletContextListener 关于上下文初始化的信息。通知即将关闭 servlet 上下文。在通知所有 ServletContextListener 上下文销毁之前,所有 servlet 和过滤器都已销毁。下图是ServletContextEvent类。

可以通过getServletContext()方法来获得改变后的ServletContext对象。
二、监听对象的属性变化
1.HttpSessionAttributeListener:监听Session的改变,Session的增加、删除和替换

下面再查下API看看HttpSessionBindingEvent对象

可以通过该对象获取session的name和值value。
2.ServletRequestAttributeListener:监听Request属性的改变

下面是ServletRequestAttributeEvent对象

可以通过属性的Name和Value。
3.ServletContextAttributeListener:用于监听上下文属性的改变

下图是ServletContextAttributeEvent类

也是获取Name和Value,和上面的基本类似。
三、监听Session内的对象
这两个与其他的就有点不一样了。
1.HttpSessionBindingListener
首先看它的接口

当对象被放到Session里时会执行valueBound(HttpSessionBindingEvent event)方法,当对象从Session中移除时会执行valueUnbound(HttpSessionBindingEvent event)方法,不过对象要实现这个接口。
2.HttpSessionActivationListener

服务器关闭时会将Session的内容保存到硬盘,这个过程叫钝化。服务器重启时会将Session内容从内容中加载,钝化会执行sessionDidActivate(HttpSessionEvent se)方法,重新加载会执行sessionWillPassivate(HttpSessionEvent se),对象也是要实现这个接口。
四、实验
上面算是把8个监听对象理论学习了下,下面利用上面的来做个实验。
1.创建
还是和Filter一样,以HelloWorld为基础,不重新创建包了,直接在com.test.cyw包中创建一个Listener,实现了6个接口。同时新建了一个Person类实现了Session内对象监听的两个接口

点击下一步可以选择要实现哪些监听接口.除了上面介绍的几个接口,还有几个新的接口,这里不再一一介绍,不过都是实现接口。


2.实现
1.创建一个Person类继承HttpSessionActivationListener, HttpSessionBindingListener实现这两个接口
package com.test.cyw; import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent; public class Person implements HttpSessionActivationListener, HttpSessionBindingListener { public Person(String name, int age) { Name = name;
Age = age;
} public String getName() {
return Name;
} public void setName(String name) {
Name = name;
} public int getAge() {
return Age;
} public void setAge(int age) {
Age = age;
} private String Name;
private int Age;
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HttpSessionBindingListener_valueBound Name:"+arg0.getName()+"Value:"+arg0.getValue()); } @Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HttpSessionBindingListener_valueUnbound Name:"+arg0.getName()+"Value:"+arg0.getValue());
} @Override
public void sessionDidActivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HttpSessionActivationListener_sessionDidActivate");
} @Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HttpSessionActivationListener_sessionWillPassivate");
} }
2.在MyListener中实现其他的6种接口,不打印记录
package com.test.cyw; import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* Application Lifecycle Listener implementation class MyListener
*
*/
@WebListener
public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener,HttpSessionAttributeListener,ServletRequestAttributeListener,ServletContextAttributeListener { /**
* Default constructor.
*/
public MyListener() {
// TODO Auto-generated constructor stub
} /**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HttpSessionListener_sessionCreated");
} /**
* @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
*/
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletRequestListener_requestDestroyed");
} /**
* @see ServletRequestListener#requestInitialized(ServletRequestEvent)
*/
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletRequestListener_requestInitialized");
} /**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HttpSessionListener_sessionDestroyed");
} /**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContextListener_contextDestroyed ContextParam:"+arg0.getServletContext().getInitParameter("ImageType"));
} /**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContextListener_contextInitialized ContextParam:"+arg0.getServletContext().getInitParameter("ImageType"));
} /**
* @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
*/
public void attributeAdded(HttpSessionBindingEvent arg0)
{
System.out.println("HttpSessionAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue());
}
/**
* @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
*/
public void attributeRemoved(HttpSessionBindingEvent arg0)
{
System.out.println("HttpSessionAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
} /**
* @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
*/
public void attributeReplaced(HttpSessionBindingEvent arg0)
{
System.out.println("HttpSessionAttributeListener_attributeReplaced Name:"+arg0.getName()+" Value:"+arg0.getValue());
} @Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletRequestAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue());
} @Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletRequestAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
} @Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletRequestAttributeListener_attributeReplaced Name:"+arg0.getName()+" Value:"+arg0.getValue());
} @Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContextAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue());
} @Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContextAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
} @Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContextAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue());
} }
3.在test.jsp中设置request、response的属性、创建person对象并添加到session中,创建session并对其进行增改删。这里需要使用jsp的import来引入person类。
<body>
<% Person person=new Person("CuiYW",25); %>
<%
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID"); %> </body>
4.配置
上面虽然实现了各种监听,但怎么让tomcat知道呢,还是需要在配置文件web.xml中配置。对于Session内对象的监听就不需要配置了。
<listener>
<listener-class>com.test.cyw.MyFilter</listener-class>
</listener>
5.结果
先启动Tomcat然后浏览器请求test.jsp然后关闭tomcat,可以在console中看到如下输出。

JavaWeb之Listener监听器的更多相关文章
- 转-JavaWeb三大组件之Listener监听器
JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...
- javaweb学习总结—监听器(Listener)
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一 ...
- Listener监听器与Filter过滤器
1.Listener [1]监听器简介 > Listener是JavaWeb的三大组件之一,Servlet.Filter.Listener > Li ...
- 第16 天 JavaWEB过滤器和监听器技术
Day16 JavaWEB过滤器和监听器技术 复习: 1.大结果集分页mysql的实现,是使用那个关键字,从user表中取第一页的数据,长度为10,sql语句怎么写? 2.分页查询的起始位置(star ...
- 超全面的JavaWeb笔记day20<监听器&国际化>
JavaWeb监听器 三大组件: l Servlet l Listener l Filter Listener:监听器 1. 初次相见:AWT 2. 二次相见:SAX 监听器: l 它是一个接口,内容 ...
- JavaWEB过滤器和监听器技术
过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...
- JavaWeb——过滤器及监听器
什么是过滤器? 过滤器示意图 Filter是如何实现拦截的? Filter的生命周期 Filter的创建 Filter的销毁 FilterConfig接口 Servlet过滤器有关接口 过滤器配置 F ...
- .jsp文件的使用和理解以及一些小练习和Listener监听器
什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...
- 十:JavaWeb中的监听器(一)
2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域 ...
随机推荐
- MVC下form表单一次上传多种类型的图片(每种类型的图片可以上传多张)
form表单一次上传多种类型的图片(每种类型的图片可以上传多张) controller中的action方法 public ActionResult UploadImage( ) { in ...
- Android 自定义Activity栈对Activity统一管理
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6307239.html public class AppManager { private static St ...
- 为什么python适合写爬虫?(python到底有啥好的?!)
我用c#,java都写过爬虫.区别不大,原理就是利用好正则表达式.只不过是平台问题.后来了解到很多爬虫都是用python写的.因为目前对python并不熟,所以也不知道这是为什么.百度了下结果: 1) ...
- ESRI ArcGIS 产品线资源网站大集合
友情提示:国外网站国内访问速度较慢,可以配合VPN等进行加速访问. 首先给出官方网站,以下所有链接均可在官方找到. http://www.esri.com 紧接着是产品线: http://www.es ...
- arm交叉编译器科普
交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch - 体系架构,如ARM,MIPS vendor - 工具链提供商 os - 目标操作系统 ea ...
- C++编程练习(4)----“实现简单的栈的链式存储结构“
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...
- C#操作XML方式
前言 前一篇XML读取,现在咱们继续XML操作相关 C#中也有三种操作(增.删.改.查)XML文件方法如下: 使用 XmlDocument(DOM模式) 使用 XmlTextWriter(流模式) 使 ...
- Python - Python2与Python3合理共存Windows平台
Install Python2 and Python3 Python 2.7.13 - Windows x86-64 MSI installer Python 3.6.0 - Windows x86- ...
- Ansible_自动化运维《Ansible之初识-1》
1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...