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. 刷题53. Maximum Subarray

    一.题目说明 题目是53. Maximum Subarray,求最长连续子序列最大和.难度是Easy! 二.我的解答 Easy的题目,居然没做出来. 后来看了用dp方法,其中dp[i]表示以第i个元素 ...

  2. crashpad 应用程序异常解决方案

    衡量某个应用程序的稳定性的一个重要指标即它自身的崩溃率的统计,但是如何判断应用程序崩溃,且上报崩溃产生的dmp文件进行分析? google提供了一套开源的系统 Crashpad,详细了解参见 http ...

  3. Pycharm激活码(失效更新)

    该方法不需要修改Hosts, 如果修改过请删除后再激活. 获取激活码: http://idea.medeming.com/jet/images/jihuoma.txt http://idea.mede ...

  4. gem5-gpu 运行 PARSEC2.1

    PARSEC是针对共享内存多核处理器(CPU)的一套基准测试程序,详细介绍见wiki:http://wiki.cs.princeton.edu/index.php/PARSEC,主要参考:http:/ ...

  5. delphi 讲的比较详细的多线程(推荐)

    在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:http: ...

  6. delphi中json转dataset

    unit uJSONDB; interface uses SysUtils, Classes, Variants, DB, DBClient, SuperObject, Dialogs; type T ...

  7. ssh服务启动失败 /var/empty must be owned by root and not group or world-writable.

    输入 /etc/rc.d/init.d/sshd start 启动sshd服务,报如下错误: /var/empty must be owned by root and not group or wor ...

  8. postman带上token对接口进行测试

    根据验证码进行登陆,登录之后返回token.然后请求其他接口时在header头中带上token访问其他接口进行测试 账户信息输入验证码 登陆成功,看到返回的token 我们这个项目可以刷新一下toke ...

  9. 指令——free

    free指令 一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. free指令作用:查看内存使用情 ...

  10. laravel.url

    通过php artisan route:list 可以看到当前应用的路由情况, 在前端页面中如果要修改一个实体,需要用到实体.update,涉及的uri为实体/{实体},所用的http方法为put. ...