一 listener介绍
1.1 什么是监听器
Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext
1.监听web对象创建与销毁的监听器
ServletContext创建与销毁要监听ServletContextListener
Httpsession的创建与与销毁监听HttpSessionListener
HttpServletRequest创建与销毁监听ServletRequestListener
2.监听web对象属性变化包括属性的(添加,删除,替换(key值一样的时候,调用两次set就会触发这个事件))
ServletContex的属性变化的监听ServletContextAttributeListener
Httpsession的属性变化的监听HttpSessionAttributeListener
HttpServletRequest的属性的变化的监听ServletRequestAttributeListener
3.监听session绑定javaBean(向session中set对象的时候触发)
HttpSessionBindingListener
HttpSessionActivationListener
1.2 监听器的作用
1.监听web对象创建与销毁.
2.监听web对象的属性变化
3.监听session绑定javaBean操作.
1.3 监听机制相关概念
1.事件----一件事情
2.事件源---产生这件事情的源头
3.注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。
4.监听器---对某件事情进行处理监听的一个对象
1.4 监听器的创建步骤
1创建监听器接口
2重写接口方法.
3配置web.xml
4测试监听器
二 listener对象创建与销毁
2.1 ServletContextlistener
2.1.1 创建监听器接口
public class MyServletContexListner implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ServletContext上下文死亡");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ServletContext上下文初始化的");
}
}
2.1.2 重写接口方法
2.1.3 配置web.xml
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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">
<listener>
<listener-class>xiao.it.java.MyServletContexListner</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.1.3 测试监听器
启动tomcat或是停止tomcat
如上所示,web server启动的时候,应用的上下文被初始化了,所以出现了ServletContext上下文初始化,当web server停止的时候出现了ServletContext上下文死亡。这个就相当于我们的application对象。
2.2 HttpSessionListener
2.1创建监听器接口
public class MyHttpsessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("session被创建了");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session被销毁了");
}
}
2.2重写接口方法.
2.3配置web.xml
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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">
<!--
<listener>
<listener-class>xiao.it.java.MyServletContexListner</listener-class>
</listener>
-->
<listener>
<listener-class>xiao.it.java.MyHttpsessionListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.4测试监听器
2.4.1 session创建监听
1访问地址的时候session被创建,刷新的时候已经不会再创建了,因为浏览器中已经有sessionId了,所以已经不会再创建了
2 getSession的时候
2.4.1 session销毁监听
1 默认超时30分钟
2 关闭服务器
3 调用session的invalidate()方法销毁
4 setMaxInactiveInterval(int interval) 可以设置超时时间
2.3 HttpServletRequestListener
2.3.1创建监听器接口
public class MyHttpServletRequestListener implements ServletRequestListener{
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("request销毁了");
}
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("request创建了");
}
}
2.3.2重写接口方法.
2.3.3配置web.xml
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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">
<listener>
<listener-class>xiao.it.java.MyHttpServletRequestListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.3.4测试监听器
访问浏览器对象
创建的时候主要是在访问浏览器的时候,会调用service()方法,service()方法调用开始或者销毁的时候会销毁request对象。
三 listener对象属性维护
3.1 ServletContextAttributeListener
3.1.1创建监听器接口
public class MyServletContextListener implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent serv) {
System.out.println("servletcontext添加");
}
public void attributeRemoved(ServletContextAttributeEvent par) {
System.out.println("servletcontext删除");
}
public void attributeReplaced(ServletContextAttributeEvent param) {
System.out.println("servletcontext替换");
}
}
3.1.2重写接口方法.
3.1.3配置web.xml
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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">
<listener>
<listener-class>xiao.it.java.MyServletContextListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3.1.4测试监听器
<%@ 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>
<%
getServletContext().setAttribute("dsa", "dsa");
%>
</body>
</html>
如上图所示当页面初始化的时候就变更了,同名刷新用户
3.2 HttpSessionAttributeListener
同上
3.3 ServletRequestAttributeListener
同上
四 session监听绑定javabean
4.1 HttpSessionBindingListener
4.1.1 绑定对象
public class User implements HttpSessionBindingListener{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("用户被绑定");
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("用户被解除绑定");
}
}
4.1.2 实现绑定方法
4.1.3 测试绑定
<%@page import="xiao.its.ajax.User"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
request.getSession().setAttribute("u", new User());
%>
4.2 HttpSessionActivationListener
活化钝化:是指实现了序列化接口的对象,放到session中的时候,如果当前对象没有实现序列化接口的话,那么当服务器停止的时候,就不会被钝化到tomcat的D:\xampp\tomcat\work\Catalina\localhost\指定项目路径下,tomcat启动以后,加载session对象的页面就不能直接从缓存活化对象。只有实现了序列化接口对象才能被钝化,重新启动以后对象才能活化到页面上显示。
4.1 邦定对象
public class User implements Serializable, HttpSessionBindingListener,HttpSessionActivationListener{
private static final long serialVersionUID = 8729714622867334210L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("用户被绑定");
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("用户被解除绑定");
}
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("活化");
}
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("钝化");
}
}
4.2 实现绑定的方法
4.3 测试活化,钝化
1 关闭tomcat的时候
2 启动tomcat的时候
五 监听器小例子
业务:把所有收集到的session进行迭代,每个5秒定时销毁session
5.1 ServletContextlistener
public class MyServletContexListner implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ServletContext上下文死亡");
}
public void contextInitialized(ServletContextEvent arg0) {
final List sessions=Collections.synchronizedList(new ArrayList());
ServletContext servletContext = arg0.getServletContext();
servletContext.setAttribute("sessions", sessions);
Timer t=new Timer();
t.schedule(new TimerTask() {
public void run() {
for(Iterator ite=sessions.iterator();ite.hasNext();){
HttpSession session = (HttpSession) ite.next();
session.invalidate();
ite.remove();
}
}
}, 1000, 5000);
}
}
5.2 HttpSessionlistener
public class MyHttpsessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
ServletContext servletContext = session.getServletContext();
List attribute = (List) servletContext.getAttribute("sessions");
attribute.add(session);
System.out.println("session被创建了");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session被销毁了");
}
}
5.3 web.xml配置
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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">
<listener>
<listener-class>xiao.it.java.MyServletContexListner</listener-class>
</listener>
<listener>
<listener-class>xiao.it.java.MyHttpsessionListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>