监听在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监听器的更多相关文章

  1. 转-JavaWeb三大组件之Listener监听器

    JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...

  2. javaweb学习总结—监听器(Listener)

    监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一 ...

  3. Listener监听器与Filter过滤器

    1.Listener     [1]监听器简介         > Listener是JavaWeb的三大组件之一,Servlet.Filter.Listener         > Li ...

  4. 第16 天 JavaWEB过滤器和监听器技术

    Day16 JavaWEB过滤器和监听器技术 复习: 1.大结果集分页mysql的实现,是使用那个关键字,从user表中取第一页的数据,长度为10,sql语句怎么写? 2.分页查询的起始位置(star ...

  5. 超全面的JavaWeb笔记day20<监听器&国际化>

    JavaWeb监听器 三大组件: l Servlet l Listener l Filter Listener:监听器 1. 初次相见:AWT 2. 二次相见:SAX 监听器: l 它是一个接口,内容 ...

  6. JavaWEB过滤器和监听器技术

    过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...

  7. JavaWeb——过滤器及监听器

    什么是过滤器? 过滤器示意图 Filter是如何实现拦截的? Filter的生命周期 Filter的创建 Filter的销毁 FilterConfig接口 Servlet过滤器有关接口 过滤器配置 F ...

  8. .jsp文件的使用和理解以及一些小练习和Listener监听器

    什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...

  9. 十:JavaWeb中的监听器(一)

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

随机推荐

  1. Android 自定义通用的loadingview

    介绍 好久没有写博客啦,最近在接近新年了,年前的工作都要收尾,所以特别忙,周末抽空写了个通用的加载view,写篇博客分享出来. 功能 1.显示加载视图,加载失败的时候显示加载失败视图,数据为空时显示数 ...

  2. HDU4496(并查集)

    D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  3. Memcached在windows下的安装和使用

    1.下载memcached安装文件及c#开发所需的dll 2.解压<memcached-1.2.6-win32-bin.zip>,并cmd,定位到解压目录. 3.安装服务:输入命令 mem ...

  4. webSocket错误收集

    关于 使用WebSocket报如下错误, Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': already in ...

  5. 简述jpg、gif、png-8、png-24的区别,分别使用场景

    gif.jpg.png格式的图片在网站制作中的区别 Gif 格式特点: 1.透明性:gif是一种布尔透明类型,即它可以使全透明,也可是全不透明,但是它并没有半透明的(alpha透明). 2.动画:gi ...

  6. App开发外包必须注意的四大骗局

    在app外包过程中有很多需要注意的事项,今天专门挑选注意事项中的"骗局"这个话题来与大家分享一些的常见骗局及其细节. 无论是从新闻还是身边的朋友,我们都经常可以听见"xx ...

  7. springMVC整合Junit4进行单元测试

    springMVC整合Junit4进行单元测试 标签: springMVC整合Junit4junit单元测试教程springMVC入门教程   spring(10)  版权声明:本文为博主原创文章,未 ...

  8. Repeater中使用倒计时

    <asp:Label ID="lblTime" runat="server" Text='<%# FormatDateString(Eval(&qu ...

  9. 如何发布第一个WP8.1程序(VisualStudio2015)

    学习WP开发有一段时间了,近一个月开始着手开发程序,并在开发程序中不断地学习(有一定的基础后,边开发程序,边学习是很好的,能练习运用所学的知识,并能在遇到问题后上网上资料不断地学习,很有效果,因为老是 ...

  10. 更新几篇之前写在公众号上的文章:线性可分时SVM理论推导;关联分析做捆绑销售和推荐;分词、去停用词和画词云

    适合阅读人群:有一定的数学基础. 这几篇文章是16年写的,之前发布在个人公众号上,公众号现已弃用.回过头来再看这几篇文章,发现写的过于稚嫩,思考也不全面,这说明我又进步了,但还是作为学习笔记记在这里了 ...