监听器:
监听器的常见应用场景:
监听器的开发步骤:
案例:监听器的基本实现 WebListenerDemo
MyFirstListener.java:
package com.imooc.listener;
/**
* 全局对象监听器
* @author lcs
*/
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyFirstListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("context destroyed... ...");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("context initialized... ...");
}
}
在web.xml进行配置:
<!-- 配置监听器类路径 -->
<listener>
<listener-class>com.imooc.listener.MyServletContextListener</listener-class>
</listener>
多监听器启动顺序:
根据web.xml文件的注册顺序进行启动,根据其逆序进行关闭
监听器分类:
按监听对象:
按监听事件:
域对象自身的创建和销毁事件监听器:
ServletContext:
ServletContextListener:
package com.imooc.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
String appName = (String)sce.getServletContext().getAttribute("app_name");
String version = (String)sce.getServletContext().getAttribute("version");
System.out.println("MyServletContextListener destroyed,appName:" + appName + ",version:" + version);
}
@Override
public void contextInitialized(ServletContextEvent sce) {
String appName = sce.getServletContext().getInitParameter("app_name");
String version = sce.getServletContext().getInitParameter("version");
sce.getServletContext().setAttribute("app_name", appName);
sce.getServletContext().setAttribute("version", version);
System.out.println("MyServletContextListener init,appName:" + appName + ",version:" + version);
}
}
web.xml对其进行的配置:
<!-- 初始化参数 -->
<context-param>
<param-name>app_name</param-name>
<param-value>Listener Web</param-value>
</context-param>
<context-param>
<param-name>version</param-name>
<param-value>1.0</param-value>
</context-param>
<listener>
<listener-class>com.imooc.listener.MyServletContextListener</listener-class>
</listener>
HttpSession:
HttpSessionListener.java:
package com.imooc.listener;
import java.util.Date;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent hse) {
String sessionId = hse.getSession().getId();
Date createTime = new Date(hse.getSession().getCreationTime());
System.out.println("session id:"+sessionId+"\n创建时间:"+createTime);
}
@Override
public void sessionDestroyed(HttpSessionEvent hse) {
String sessionId = hse.getSession().getId();
System.out.println("session destroyed,session id:"+sessionId);
System.out.println("销毁时间:"+new Date());
}
}
在web.xml文件进行的配置:
<listener>
<listener-class>com.imooc.listener.MyHttpSessionListener</listener-class>
</listener>
<!-- 设置session对象的有效期,单位是分钟,强制在期限过后对session对象进行销毁 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
在不同浏览对其进行访问:
在服务器控制台会输出:
两个session信息
session id:A325711922A990D9C392AED2EF0CA12F
创建时间:Thu Apr 25 15:33:52 CST 2019
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
session id:0F0377034FFF83F4AFCF295999C8DE89
创建时间:Thu Apr 25 15:34:02 CST 2019
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
request listener,request destroyed... ...
session destroyed,session id:0F0377034FFF83F4AFCF295999C8DE89
等待一分钟以后:两个session分别会销毁
销毁时间:Thu Apr 25 15:35:29 CST 2019
session destroyed,session id:A325711922A990D9C392AED2EF0CA12F
销毁时间:Thu Apr 25 15:35:29 CST 2019
ServletRequest:
ServletRequest:
ServletRequestListener.java:
package com.imooc.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request listener,request destroyed... ...");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
String path = request.getRequestURI();
String par = request.getParameter("par");
System.out.println("request listener,path:" + path + ",par is :" + par);
}
}
在web.xml里的配置信息:
<listener>
<listener-class>com.imooc.listener.MyServletContextAttributeListener</listener-class>
</listener>
输出结果:
点击初始化:
会在服务器控制台输出
request listener,path:/WebListenerDemo/,par is :null
session id:E8CC834C80F59C4D8B3EEC39E91A92B6
创建时间:Thu Apr 25 15:49:24 CST 2019
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/servlet_request.jsp,par is :request_par
request listener,request destroyed... ...
属性创建、替换和消除监听器:
以ServletContextAttributeListener为例:
package com.imooc.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
//增加属性
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("ServletContext#attAdded#name:" + scae.getName() + "#value:" + scae.getValue());
}
@Override
//移除属性
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("ServletContext#attRemoved#name:" + scae.getName() + "#value:" + scae.getValue());
}
@Override
//替换属性
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("ServletContext#attReplaced#name:" + scae.getName() + "#value:" + scae.getValue());
}
}
在web.xml配置属性:
<listener>
<listener-class>com.imooc.listener.MyServletContextAttributeListener</listener-class>
</listener>
attribute_init.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
application.setAttribute("servletcontextPar", "servletcontext_par");
%>
<!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></title>
</head>
<body>
<h1>attribute_add_listener_test</h1>
</body>
</html>
输出结果:
点击属性初始化:
跳转到页面:
在服务器后台输出:属性已被添加
Session对象状态监听器:
执行过程:
测试代码:
User.java:继承了HttpSessionBindingListener,不需要在web.xml进行注册
package com.imooc.model;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener {
private String username;
private String password;
@Override
public void valueBound(HttpSessionBindingEvent hsbe) {
String name = hsbe.getName();
System.out.println("value bound,name:"+name);
}
@Override
public void valueUnbound(HttpSessionBindingEvent hsbe) {
String name = hsbe.getName();
System.out.println("value unbound,name:"+name);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
首页代码:
<label>
<span>BindingListener测试</span>
<a href="bound.jsp" target="_blank">绑定测试</a>
<a href="unbound.jsp" target="_blank">解绑测试</a>
</label>
bound.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.setAttribute("user", new com.imooc.model.User());
%>
<!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></title>
</head>
<body>
<h1>binding_listener_test</h1>
</body>
</html>
unbound.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.removeAttribute("user");
%>
<!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></title>
</head>
<body>
<h1>unbinding_listener_test</h1>
</body>
</html>
测试结果:
分别点击:绑定测试、解绑测试
先后挑战到两个页面:
项目:Java过滤器监听器项目
github地址: