servlet的技术规范包括三个:servlet,listener,filter,今天记录一下listener的学习。

  监听器就是监听某个对象的状态变化的技术。监听器包括事件源,监听器,注册监听器以及响应行为四个部分。

  事件源即被监听的对象。

  监听器是监听事件源对象的状态变化。

  注册监听器即将监听器与事件源关联起来。

  响应行为即监听到事件源所触发的动作。

  监听器按照不同的划分方式可以分为多种

    1,按照监听的对象不同可分为HttpRequest域,HttpSession域和ServletContext域。

    2,按照监听的状态可分为监听域对象的创建与销毁,属性状态的变化。(这两点可归纳为监听三大域对象的创建与销毁及其属性的状态变化)

    3,其它监听器

  ServletContext域 HttpSession域 ServletRequest域
域对象的创建与销毁 ServletContextListener HttpSessionListener ServletRequestListener
域对象属性状态的变化 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener

  一,三大域对象的监听器

    此三大域对象的监听器的使用方法:

      • 创建类实现监听器接口
      • 实现接口中监听的方法
      • 注册监听器即在配置文件中把监听器也事件源关联起来      

    1,ServletContext域对象的监听器

      A,ServletContextListener监听器

  此监听器主要用来监听ServletContextListener的创建与销毁即服务器的创建与销毁,它的主要作用是初始化对象例如加载数据库驱动,连接池的初始化等;加载一些初始化的配置文件如spring的一些内容等;任务调度,如定时器等

下面演示一下此监听器的用法:

 package com.zw.listener;

 import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener { @Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext被创建了");
} @Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext被销毁了");
} }

创建监听器

 <?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_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>ListenerDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.zw.listener.MyServletContextListener</listener-class>
</listener>
</web-app>

注册监听器

     B,ServletContextAttributeListener监听器

    

 package com.zw.listener;

 import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener; public class MyServletContextAttributeListener implements ServletContextAttributeListener { @Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println(scae.getServletContext().getServletContextName() + "被添加了属性");
} @Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println(scae.getServletContext().getServletContextName() + "被移除了属性");
} @Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println(scae.getServletContext().getServletContextName() + "被修改了属性");
} }

创建监听器

 <?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_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>ListenerDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.zw.listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>com.zw.listener.MyServletContextAttributeListener</listener-class>
</listener>
<servlet>
<servlet-name>servletDemo1</servlet-name>
<servlet-class>com.zw.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
</web-app>

注册监听器

 package com.zw.servlet;

 import java.io.IOException;

 import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
servletContext.setAttribute("name", "张三");
servletContext.setAttribute("name", "李四");
servletContext.removeAttribute("name");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp);
} }

为ServletContext改变属性状态

      另外两个监听对象属性状态的监听器的实现方式与此相同,以下不再演示

    2,HttpSession域对象的监听器

  HttpSessioinListener监听器用来监听Session的创建与销毁,其操作方法是实现此接口然后实现其中的方法,注册监听器当访问一个JSP页面时有Session被创建,此监听器内创建Session的方法被调用;当Session过期或被销毁则此监听器Sessioni销毁的方法被调用。

  3,ServletRequest域对象的监听器

    ServletRequestListener监听器用来监听每一次请求调用请求创建时的方法,当请求结束时,调用销毁的方法;操作方法也是实现此接口,实现其中的方法,然后注册监听器。

二,其它监听器

  与Session中绑定的对象相关的监听器(对象感知监听器),该监听器分为两大类,四种状态

    A:HttpSessionBindingLinstener此监听器监听将对象绑定到Session中与将对象从Session中解顷的事件

    B:HttpSessionActivationLinstener此监听器可将Session中的对象钝化到硬盘上以及从硬盘上读取Session中的对象

  这两种监听器不需要注册,直接用一个类实现这两个接口,实现其中的方法即可。

  HttpSessionBindingLinstener监听器演示如下:

 package com.zw.listener;

 import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; public class Student implements HttpSessionBindingListener { @Override
public void valueBound(HttpSessionBindingEvent event) { System.out.println("Student被绑定到Session中了");
} @Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("Student从Session中解绑了");
} }

HttpSessionBindingLinstener

此时,把Student这个对象添加到Session中便全触被绑定的方法,当remove时便全触发解绑的方法

    HttpSessionActivationListener监听器演示如下:

 package com.zw.listener;

 import java.io.Serializable;

 import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent; public class Student implements HttpSessionActivationListener, Serializable { @Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("Student被活化了");
} @Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("Student被钝化了");
} }

HttpSessionActivationListener

此监听器监听的对象需要实现序列化接口,因为需要被存储到硬盘上,以上操作当Student被放入Sessioni中,服务器停止时便把Student对象存储到了硬盘上,当重新启动服务器时,Session中的Student便被活化了

但是钝化与活化Session里的对象,不能总停止与启动服务器,可通过配置文件指定Session多久没有操作便钝化,当用户再次使用程序时活化Session,具体操作如下:

1,在META-INF文件下创建context.xml文件,此文件名固定,此文件中的内容如下

 <?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore"
directory="zw205" />
</Manager>
</Context>

context.xml

此时经过一分钟不操作,Session中的对象便被钝化到指定的目录下了,再次操作时是从此文件内拿Session中的对象的

Java中的监听器的更多相关文章

  1. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  2. 【转】转帖并注释:Java中的事件处理机制--事件监听器的四种实现方式

    原文地址:http://blog.sina.com.cn/s/blog_4b650d650100nqws.html Java中四种事件监听器的实现方式分别为: 自身类做为事件监听器 外部类作为事件监听 ...

  3. java中jna使用回调实现事件监听器——观察者模式

    (1)C接口中的接口头文件 #pragma once #include <iostream> #include <vector> #include <core/core. ...

  4. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  5. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  6. java中实现定时功能

    网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...

  7. 详细Java中的内存泄漏

    1.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...

  8. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...

  9. java中基于TaskEngine类封装实现定时任务

    主要包括如下几个类: 文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 ...

随机推荐

  1. POJ P2828 Buy Ticket——线段树的其他信息维护

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  2. css控制一个元素点击后, 改变另外一个元素的状态

    1.点击后改变子元素.myclass:active span{ color:#00f;} 此方式在ios下不生效,chrome下正常  2.改变下一个兄弟元素.myclass:active +span ...

  3. drupal7 用到的一些钩子简介

    1.hook_user_delete($account) 可用于自定义模块中,当用户被删除时,可以自定义一些自己需要的处理动作 2.hook_mail_alter(&$message) 可用于 ...

  4. Linux ssh开启服务

    1.登陆linux系统,打开终端命令.输入 rpm -qa |grep ssh 查找当前系统是否已经安装 2.如果没有安装SSH软件包,可以通过yum  或rpm安装包进行安装 启动SSH服务2 安装 ...

  5. HTML中的Head标签学习

    在页面加载完成的时候,标签head里的内容,是不会在页面中显示出来的.它包含了像页面的<title>(标题) ,CSS(如果你想用CSS来美化页面内容),图标和其他的元数据(比如 作者,关 ...

  6. WPF使用样式更新ArcGis InfoWindow外观代码

    <Style x:Key="mainInfoWindowStyleMF" TargetType="{x:Type esri:InfoWindow}"> ...

  7. EF6 按条件更新多行记录的值

    using (var db = new MyDbContext()) { string fromUser = ""; //sender string toUser = " ...

  8. 【Android Studio使用教程1】Android Studio导入项目的几种方法

    本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试更新到该版本. Android Studio默认使用 Gradle 构建项目, Eclips ...

  9. 5 TensorFlow实战Google深度学习框架一书中的错误两处(交叉熵定义有误)

    第一处: 书中62页定义的交叉熵函数定义有误,虽然这个所谓交叉熵的数值能够减少,但是是不能提升预测性能的,因为定义就错了. 我已经将预测过程可视化,直接将交叉熵改为我的,或者用原书的,就可以看到预测结 ...

  10. 深入理解HashMap和concurrentHashMap

    原文链接:https://segmentfault.com/a/1190000015726870 前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇 ...