Web应用中监听者的通知顺序按照DD中的定义顺序:

XML:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>TestBootWeb</display-name>
<servlet>
<servlet-name>TestServlet1</servlet-name>
<servlet-class>com.stono.servlet.listenerorder.TestServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet1</servlet-name>
<url-pattern>/a.do</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.stono.servlet.listeners.MyHttpSessionListener2</listener-class>
<listener-class>com.stono.servlet.listeners.MyHttpSessionAttributeListener</listener-class>
<listener-class>com.stono.servlet.listeners.MyHttpSessionListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Listener:

package com.stono.servlet.listeners;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
/* 必须调用一下session.getAttributeNames();才可以激活这个事件; */
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionListener.sessionCreated(HttpSessionEvent)");
}
@Override
/* 调用session.invalidate()的时候激活这个事件; */
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionListener.sessionDestroyed(HttpSessionEvent)");
}
}
package com.stono.servlet.listeners;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener2 implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionListener2.sessionCreated(HttpSessionEvent)");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionListener2.sessionDestroyed(HttpSessionEvent)");
}
}
package com.stono.servlet.listeners;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
/* 调用session.setAttribute的时候触发事件; */
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionAttributeListener.attributeAdded(HttpSessionBindingEvent)");
String name = arg0.getName();
Object value = arg0.getValue();
System.out.println("name:" + name + ";value:" + value);
}
@Override
/* 调用session.invalidate()方法之后触发这个事件; */
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionAttributeListener.attributeRemoved(HttpSessionBindingEvent)");
String name = arg0.getName();
Object value = arg0.getValue();
System.out.println("name:" + name + ";value:" + value);
}
@Override
/* 第二次调用session.setAttribute的时候会触发此事件,但是arg0.getValue()还是返回之前的值 */
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("com.stono.servlet.listeners.MyHttpSessionAttributeListener.attributeReplaced(HttpSessionBindingEvent)");
String name = arg0.getName();
Object value = arg0.getValue();
System.out.println("name:" + name + ";value:" + value);
}
}

Servlet:

package com.stono.servlet.listenerorder;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class TestServlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setAttribute("a", "a");
PrintWriter writer = resp.getWriter();
writer.println("this is from com.stono.servlet.listenerorder.TestServlet1");
}
}

输出:

com.stono.servlet.listeners.MyHttpSessionListener2.sessionCreated(HttpSessionEvent)
com.stono.servlet.listeners.MyHttpSessionListener.sessionCreated(HttpSessionEvent)
com.stono.servlet.listeners.MyHttpSessionAttributeListener.attributeAdded(HttpSessionBindingEvent)
name:a;value:a
com.stono.servlet.listeners.MyHttpSessionListener.sessionDestroyed(HttpSessionEvent)
com.stono.servlet.listeners.MyHttpSessionListener2.sessionDestroyed(HttpSessionEvent)
com.stono.servlet.listeners.MyHttpSessionAttributeListener.attributeRemoved(HttpSessionBindingEvent)
name:a;value:a

Web应用中监听者的通知顺序按照DD中的定义顺序的更多相关文章

  1. SystemUI中监听app启动,修改app中的状态栏背景色

    参考 http://www.2cto.com/kf/201206/137225.html 从Android4.4开始,app可以自定义status bar 背景. 对于一些第三方app定义的状态栏背景 ...

  2. 如何在组件中监听vuex数据变化(当vuex中state变化时,子组件需要进行更新,怎么做?)

    todo https://blog.csdn.net/qq_37899792/article/details/97640434

  3. Javaweb上下文监听者ServletContextListener

    一个监听类,不是一个servlet或JSP,它能监听ServletContext一生中的两个关键事件:初始化(创建)和撤销.这个类实现了javax.servlet.ServletContextList ...

  4. EntityFramework之监听者判断SQL性能指标

    前言 当我们利用EF这个ORM框架时,我们可能会利用LINQ或者原生的SQL语句来进行数据操作,此时我们无法确定我们的代码是否会给数据库带来一定的负载,当给数据库带来一定的压力时,由于项目中对数据进行 ...

  5. 在C++11中实现监听者模式

    参考文章:https://coderwall.com/p/u4w9ra/implementing-signals-in-c-11 最近在完成C++大作业时,碰到了监听者模式的需求. 尽管C++下也可以 ...

  6. Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法

    Android-服务中监听电源键和Home键的广播  http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...

  7. Java Listener pattern 监听者模式

    Java Listener pattern 监听者模式 2016-5-12 监听者模式(观察者模式)能降低对象之间耦合程度.为两个相互依赖调用的类进行解耦. 便于进行模块化开发工作.不同模块的开发者可 ...

  8. 在java.util中有EventListener接口:所有事件监听者都要实现这个接口。

    在java.util中有EventListener接口:所有事件监听者都要实现这个接口. java.util中有EventObject类:所有的事件都为其子类.   事件范例在\CoreJava\Gi ...

  9. 【原】不定义Order属性,通过切面类的定义顺序来决定通知执行的先后顺序

    [结论] 在多个切面类的“切入点相同”并且每个切面都“没有定义order属性”的情况下,则切面类(中的通知)的执行顺序与该切面类在<aop:config>元素中“声明的顺序”相关,即先声明 ...

随机推荐

  1. JSONObject转换JSON之将Date转换为指定格式(转)

    项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的 ...

  2. 如何使用UDP进行跨网段广播(转)

    源:http://blog.chinaunix.net/uid-22670933-id-3716646.html 广播域首先我们来了解一下广播域的概念.广播域是网络中能接收任一台主机发出的广播帧的所有 ...

  3. Highcharts选项配置详细说明文档

    Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...

  4. HDU 1589 Find The Most Comfortable Road 最小生成树+枚举

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. Cantor表 1083

    题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 - 2/1 2/ ...

  6. javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  7. Varnish CentOS 6.4 x64

    CentOS 6.4 x64 Varnish 安装配置     Varnish的官方网址为http://varnish-cache.org   首先下载Varnish 稳定版本3.0.3   wget ...

  8. JS中获取和操作iframe

    一.需求与遇到的问题 在网站的后台管理中使用了iframe框架布局,包括顶部菜单.左侧导航和主页面.需求是:点击主页面上的一个按钮,在顶部菜单栏的右侧显示“退出”链接,点击可退出系统. 我的思路是:在 ...

  9. 3D VR卡镜的使用方法

    先把它展开 然后把它卡在手机中间 介绍一个VR游戏资源 Chair In a Room,这是一个立体沉浸式的3D游戏,原理是陀螺仪传感器随着手机转动可以观察整个三维房间 如图所示,点击进入,将两眼放到 ...

  10. java 正则匹配int型

    private static Pattern DIGIT_PATTERN = Pattern.compile("=\\d++"); Matcher goodsTypeMatcher ...