Java中的监听器
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中的监听器的更多相关文章
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- 【转】转帖并注释:Java中的事件处理机制--事件监听器的四种实现方式
原文地址:http://blog.sina.com.cn/s/blog_4b650d650100nqws.html Java中四种事件监听器的实现方式分别为: 自身类做为事件监听器 外部类作为事件监听 ...
- java中jna使用回调实现事件监听器——观察者模式
(1)C接口中的接口头文件 #pragma once #include <iostream> #include <vector> #include <core/core. ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- Java中的进程与线程(总结篇)
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...
- java中实现定时功能
网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...
- 详细Java中的内存泄漏
1.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...
- java中基于TaskEngine类封装实现定时任务
主要包括如下几个类: 文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 ...
随机推荐
- 通过vertical-align属性实现“竖向居中”显示
自学编程大概有大半年的时间了,从15年7月开始学习使用人数最多的JAVA,到后来喜欢上了前端,但由于之间在建筑设计院的工作加班颇为频繁,每天刨去工作,基本没有多少自己个人的时间,只能每天6,7点起床, ...
- CAD增强属性块的还原(转)
来自:http://blog.3snews.net/space.php?uid=13924959&do=blog&id=70174 作者:毛毛虫 Demo下载:CAD增强属性块的还原 ...
- 文件路径太长无法删除 robocopy
方法一:新建空文件夹 D:\temp robocopy D:\temp D:\target\source\test /purge 或者在同一目录下,建一个空文件夹, test 在cmd下切换进入到当 ...
- Reverse Integer 旋转数字
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 本地注意正负号判断 ...
- 安卓app开发-05-Android xml布局详细介绍
安卓app开发-05-Android xml布局详细介绍 虽然说有 墨刀,墨客 这些图形化开发工具来做 Android 的界面设计,但是我们还是离不开要去学习做安卓原生app,学习 xml 布局还是必 ...
- 【转】fatal error C1189: #error : missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
转自:http://blog.csdn.net/friendan/article/details/46576699 fatal error C1189: #error : missing -D__S ...
- Software Testing Techniques Homework 3
1. a.This is the chart b. initial numPrimes = 4, t1 would over the loop. c. t = ( n = 1) d. node cov ...
- 2.bootstrap安装
1.下载 您可以从 http://getbootstrap.com/ 上下载 Bootstrap 的最新版本(或者 http://www.bootcss.com/ 中文网) Download Boo ...
- 从golang-gin-realworld-example-app项目学写httpapi (六)
https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/users/validators.go 验证器 ...
- 爬虫入门之scrapy模拟登陆(十四)
注意:模拟登陆时,必须保证settings.py里的COOKIES_ENABLED(Cookies中间件) 处于开启状态 COOKIES_ENABLED = True或# COOKIES_ENABLE ...