您的位置:首页 > 编程语言 > Java开发

JavaWeb——监听器

2018-03-06 13:51 661 查看

一、监听器概述

1、它是一个接口,内容由我们来实现

2、它需要注册,例如注册在按钮上

3、监听器中的方法会在特殊事件发生时被调用

我们用一个简单的例子来说明监听器的工作原理:

在监听器中有三个名词:事件源,事件,监听器

比如在一个酒店里发生了打架事件,警察来捉人。

事件源:打架的人

事件:打架

监听器:警察

监听器中的方法:捉人(一个监听器可以有多个方法,对不同的事件调用不同的方法)

二、JavaWeb中的监听器

事件源及其对应的监听:

ServletContext


(1)生命周期监听:
ServletContextListener
,它有两个方法,一个是在出生时调用,一个在死亡是调用

(2)属性监听:
ServletContextAttributeListener
,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,一个在移除属性时调用

HttpSession


(1)生命周期监听:
HttpSessionListener
,它有两个方法,一个是在出生时调用,一个在死亡是调用

(2)属性监听:
HttpSessionAttributeListener
,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,一个在移除属性时调用

ServletRequest


(1)生命周期监听:
ServletRequestListener
,它有两个方法,一个是在出生时调用,一个在死亡是调用

(2)属性监听:
ServletRequestAttributeListener
,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,一个在移除属性时调用

生命周期监听器举例:这里的例子是
ServletContextListener
,因为
ServleContext
在服务器开启时创建,在服务器关闭时销毁


package com.jiayifan;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

public class AListener implements ServletContextListener {

public void contextDestroyed(ServletContextEvent sce)  {
System.out.println("哈哈,我离开了!!!!");
}

public void contextInitialized(ServletContextEvent sce)  {
System.out.println("哈哈,我来了!!!!!");
}
}


在web.xml中配置监听器:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>Dome1</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.jiayifan.AListener</listener-class>
</listener>
</web-app>


web.xml的配置就省略了,jsp页面的代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
application.setAttribute("lalala", "hahaha");
%>
</body>
</


程序运行结果:





事件对象:

ServletContextEvent


HttpSeesion


ServletRequestEvent


我们可以通过事件对象获取事件源,比如我们可以通过
ServletContextEvent
来获取
ServletContext
对象。

属性监听器示例:

package com.jiayifan;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

public class BListener implements ServletContextAttributeListener {
//添加属性时调用
public void attributeAdded(ServletContextAttributeEvent scae)  {
System.out.println("你添加了一个名字为" + scae.getName() + "值为" + scae.getValue() + "的属性");
}
//移除属性时调用
public void attributeRemoved(ServletContextAttributeEvent scae)  {

}
//修改属性时调用
public void attributeReplaced(ServletContextAttributeEvent scae)  {

}

}


程序运行截图:



上面列举的是三大域的监听器,而JavaWeb中有8个监听器,上面已经列举了其中的6个,因为上面的6个比较简单,而且基本的用法也极其类似,所以放在一块讲解,下面再来介绍一下其余的两个。

三、感知监听(与HttpSession相关)

1、这个监听器添加到JavaBean上

2、这个监听器不需要在web.xml中配置

HttpSessionBindingListener
这个监听器是放在JavaBean上的,它将在该JavaBean放入HttpSeeion中时调用方法,或者在被移除HttpSession时调用方法


程序示例:

package com.jiayifan;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class User implements HttpSessionBindingListener{
private String name;
private String password;
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public User() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("啊,session添加了我");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("哇,session放弃了我");
}
}


jsp页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"

c9dd
pageEncoding="UTF-8" import="com.jiayifan.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.setAttribute("user", new User());
session.removeAttribute("user");
%>
</body>
</html>


程序运行截图:



四、钝化活化监听器(HttpSessionActivationListener)

1、这个监听器添加到JavaBean上

2、这个监听器不需要在web.xml中配置

因为这个监听器并不常用,并且不好演示,所以这里只讲一下概念。

session的序列化和反序列化:

当我们关闭服务器时,服务器会将session保存到本地,这种操作就是session的序列化,在服务器又开启时,服务器又将session从本地读取出来,这样的操作就是session的反序列化。

session的钝化和活化:

当服务器的访问量很高时,如果有session很长时间都没有被访问,服务器就会把session保存到本地,然后把内存中的session移除来扩大内存,这就是session的钝化,当用户又访问该session时,服务器又将session从本地读取到内存中,这是session的活化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java web 监听器