1. 介绍

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

2. 监听器分类

        (1)ServletContextListener监听器,监听ServletContext的初始化和销毁。

    • contextInitialized:初始化contextInitialized的时候出发。
    • contextDestroyed:销毁ServletContextde的时候触发。

        (2)ServletContextAttributeListener监听器,监听ServletContext属性的操作。

    • attributeAdded:新增ServletContext属性的时候触发。
    • attributeRemoved:删除ServletContext属性的时候触发。
    • attributeReplaced:改写ServletContext属性的时候触发。

        (3)HttpSessionListener监听器,监听HttpSession的初始化和销毁。

    • sessionCreated:初始化HttpSession的时候触发。
    • sessionDestroyed:销毁HttpSession的时候触发。

        (4)HttpSessionAttributeListener监听器,监听HttpSession属性的操作。

    • attributeAdded:新增HttpSession属性的时候触发。
    • attributeRemoved:删除HttpSession属性的时候触发。
    • attributeReplaced:改写HttpSession属性的时候触发。

        (5)ServletRequestListener监听器,监听ServletRequest的初始化和销毁。

    • requestInitialized:初始化ServletRequest的时候触发。
    • requestDestroyed:销毁ServletRequest的时候触发。

        (6)ServletRequestAttributeListener监听器,监听ServletRequest属性的操作。

    • attributeAdded:新增ServletRequest属性的时候触发。
    • attributeRemoved:删除ServletRequest属性的时候触发。
    • attributeReplaced:改写ServletRequest属性的时候触发。

3. 测试监听器触发时机

        首先,我们要新建一个Web Project。然后分别建立这六种监听器,并加上输出到控制台的代码:

  • ServletContextListener

package com.servlet.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyContextListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("--------------ContextListener Destoryed");
} @Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("--------------ContextListener Initialized");
} }
  • ServletContextAttributeListener

package com.servlet.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener; public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("--------------ServletContextAttributeEvent Add "+arg0.getValue().toString());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("--------------ServletContextAttributeEvent Remove "+arg0.getValue().toString());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("--------------ServletContextAttributeEvent Replace "+arg0.getValue().toString());
}
}
  • HttpSessionListener

package com.servlet.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener{ @Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("--------------HttpSessionListener Created");
} @Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("--------------HttpSessionListener Destoryed");
} }
  • HttpSessionAttributeListener

package com.servlet.listener;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener { @Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("--------------HttpSessionAttributeListener Add "+arg0.getValue().toString());
} @Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("--------------HttpSessionAttributeListener Remove "+arg0.getValue().toString());
} @Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("--------------HttpSessionAttributeListener Replace "+arg0.getValue().toString());
}
}
  • ServletRequestListener

package com.servlet.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; public class MyServletRequestLister implements ServletRequestListener{ @Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("--------------ServletRequestLister Destoryed"); } @Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("--------------ServletRequestLister Initialized"); }
}
  • ServletRequestAttributeListener

package com.servlet.listener;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener; public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("--------------ServletRequestAttributeEvent Add "+arg0.getValue().toString());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("--------------ServletRequestAttributeEvent Remove "+arg0.getValue().toString());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("--------------ServletRequestAttributeEvent Replace "+arg0.getValue().toString());
}
}

        然后我们为程序加上要访问的Servlet:

package com.servlet.action;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { private static final long serialVersionUID = -5826456046908414493L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--------------HelloServlet get param "+req.getParameter("userName")); System.out.println("--------------Before HelloServlet add session attribute ");
req.getSession().setAttribute("userName", "userName1");
System.out.println("--------------After HelloServlet add session attribute "); System.out.println("--------------Before HelloServlet replace session attribute ");
req.getSession().setAttribute("userName", "userName2");
System.out.println("--------------After HelloServlet replace session attribute "); System.out.println("--------------Before HelloServlet remove session attribute ");
req.getSession().removeAttribute("userName");
System.out.println("--------------After HelloServlet remove session attribute ");
} @Override
public void destroy() {
System.out.println("--------------HelloServlet Destory");
} @Override
public void init() throws ServletException {
System.out.println("--------------HelloServlet Init");
super.init();
}
}

        然后我们在web.xml中做如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<listener>
<listener-class>com.servlet.listener.MyContextListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyServletRequestLister</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyServletContextAttributeListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyHttpSessionAttributeListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyServletRequestAttributeListener</listener-class>
</listener> <servlet>
<!-- 名称可以随意更换,但是必须和<servlet-mapping>中<servlet-name>保持一致 -->
<servlet-name>Hello</servlet-name>
<!-- 对应的实现了servlet接口的类的全名 -->
<servlet-class>com.servlet.action.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 名称可以随意更换,但是必须和<servlet>中<servlet-name>保持一致 -->
<servlet-name>Hello</servlet-name>
<!-- 要访问的URL -->
<url-pattern>/Hello</url-pattern>
</servlet-mapping> <session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>

        最后将我们的程序部署到tomcat中,启动tomcat,访问:http://127.0.0.1:8080/MyServletWeb/Hello?userName=LYC。可以看到打印结果为:

三月 17, 2016 9:03:46 下午 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
三月 17, 2016 9:03:46 下午 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.62
三月 17, 2016 9:03:46 下午 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory D:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\MyServletWeb
--------------ContextListener Initialized
--------------ServletContextAttributeEvent Add org.apache.jasper.compiler.TldLocationsCache@170ed6ab
三月 17, 2016 9:03:46 下午 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory D:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\MyServletWeb has finished in 828 ms
三月 17, 2016 9:03:46 下午 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:03:47 下午 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
三月 17, 2016 9:03:47 下午 org.apache.catalina.startup.Catalina start
INFO: Server startup in 888 ms
--------------ServletRequestLister Initialized
--------------HelloServlet Init
--------------ServletRequestAttributeEvent Replace true
--------------HelloServlet get param LYC
--------------Before HelloServlet add session attribute
--------------HttpSessionAttributeListener Add userName1
--------------After HelloServlet add session attribute
--------------Before HelloServlet replace session attribute
--------------HttpSessionAttributeListener Replace userName1
--------------After HelloServlet replace session attribute
--------------Before HelloServlet remove session attribute
--------------HttpSessionAttributeListener Remove userName2
--------------After HelloServlet remove session attribute
--------------ServletRequestLister Destoryed
三月 17, 2016 9:03:59 下午 org.apache.catalina.core.StandardServer await
INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
三月 17, 2016 9:03:59 下午 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
三月 17, 2016 9:04:00 下午 org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
--------------HelloServlet Destory
--------------ContextListener Destoryed
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["ajp-bio-8009"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["ajp-bio-8009"]

JavaWeb之监听器的更多相关文章

  1. JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用

    JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...

  2. JavaWeb基础—监听器Listener

    javaWeb三大组件: servlet listener(用的不多) filter 什么叫监听器: 初次相见:AWT 二次相见:SAX(XML解析时)Bundle 绑定 监听器是一个接口,内容由我们 ...

  3. JavaWeb中监听器

     一.事件源:三大域! ServletContext 生命周期监听:ServletContextListener,它有两个方法,一个在创建时调用,一个在销毁时调用: void contextIniti ...

  4. JavaWeb 之监听器

    1. JavaWeb 监听器概述 在 JavaWeb 被监听的事件源为: ServletContext, HttpSession, ServletRequest, 即三大域对象. 监听域对象" ...

  5. Javaweb基础--->监听器listener(转发)

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

  6. IT兄弟连 JavaWeb教程 监听器1

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

  7. 深入分析JavaWeb Item38 -- 监听器(Listener)高速学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其它对象身上发生的事件或状态改变进行监听和对应处理的对象,当被监视的对象发生情况时,马上採取对应的行动.监听器事实上就是一个实现特定接口的普 ...

  8. 深入分析JavaWeb Item39 -- 监听器(Listener)学习进阶

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  9. javaweb之监听器详解

    在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...

  10. JavaWeb -- sevlet 监听器

    1.三个域对象的监听(创建和销毁) servletContext,  session, request 监听器 ServletContext监听器: public class MyServletCon ...

随机推荐

  1. P1079 延迟的回文数

    P1079 延迟的回文数 转跳点:

  2. HiBench成长笔记——(9) 分析源码monitor.py

    monitor.py 是主监控程序,将监控数据写入日志,并统计监控数据生成HTML统计展示页面: #!/usr/bin/env python2 # Licensed to the Apache Sof ...

  3. 2-10 就业课(2.0)-oozie:13、14、clouderaManager的服务搭建

    3.clouderaManager安装资源下载 第一步:下载安装资源并上传到服务器 我们这里安装CM5.14.0这个版本,需要下载以下这些资源,一共是四个文件即可 下载cm5的压缩包 下载地址:htt ...

  4. 二进制中1的个数(n=(n&n-1))

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题:利用Java系统提供的函数Integer.toBinaryString(n),将整数转化为二进制,之后再将二进制的0用 ...

  5. Docker commit 命令

    docker commit :从容器创建一个新的镜像. 语法 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] OPTIONS说明: -a :提 ...

  6. 嵊州普及Day1T2

    题意:走迷宫.求走到a[n][n]需要多久. 考场上想的dfs,听老师说最多50分.代码懒得码了,知道是走迷宫就好. 正解:bfs,时间复杂度O(n). 见代码: #include<iostre ...

  7. c# quartz

    quartz调度核心元素: Scheduler:任务调度器,是实际执行任务调度的控制器.在spring中通过SchedulerFactoryBean封装起来. Trigger:触发器,用于定义任务调度 ...

  8. HDU - 6195 cable cable cable

    题意:如下图,有K个光源,一个光源可同时照射一个显示屏,问从M个显示屏中任选K个,可以使每个显示屏都被不同光源照亮最少需要多少连接电缆. 分析:画图分析可知 1.选1~K个显示屏和选M-K+1~M个显 ...

  9. Codeforces735D Taxes(哥德巴赫猜想)

    题意:已知n元需缴税为n的最大因子x元.现通过将n元分成k份的方式来减少缴税.问通过这种处理方式需缴纳的税费. 分析: 1.若n为素数,不需分解,可得1 2.若n为偶数,由哥德巴赫猜想:一个大于2的偶 ...

  10. POJ 3252:Round Numbers

    POJ 3252:Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10099 Accepted: 36 ...