监听器
监听器的概述
监听器就是一个实现了特定接口的类,这个java类用于监听另一个java类的方法电泳或者属性的改变。当被监听对象发生上述时间后,监听器的某个方法将会立即被执行。
监听器的分类
- 监听三个与对象的创建和销毁(3个)
-
- ServletContextListener
- ServletContextListener会对ServletContext的初始化和解析做出响应
- 该接口含有两个方法
-
ServletContext的创建和销毁
- 创建
- 当tomcat服务器启动时,服务器就会为每个web工程创建一个ServletContext对象
- 销毁
- 当服务器关闭时,就会将ServletContext对象进行销毁
- 创建
- 案例实践
-
package weblistenner; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * @author ztr * @version 创建时间:2021年4月20日 下午7:18:21 * 类说明 */ /** * ServletContextListenner的企业用途 * 1加载框架的配置文件: * spring框架提供了一个核心监听器ContextLoadListener * 2定时任务调度 * * * * 项目名称:web05 * 类名称:ServletContextlistenner * 类描述: * 创建人:ztr * 创建时间:2021年4月20日 下午7:23:33 * @version */ public class ServletContextlistenner implements ServletContextListener{ @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("ServletContext对象被销毁了"); } @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("ServletContext对象被创建了"); } }
在web.xml中配置监听器
-
<listener> <listener-class> weblistenner.ServletContextlistenner </listener-class> </listener>
- 当启动tomcat服务器时,将会在控制台上输出:ServletContext对象被创建了
- 当关闭服务器时,将会在控制台上输出:ServletContext对象被销毁了
-
- HttpSessionListener
- 该接口含有两个方法
- session对象的创建和销毁
- 创建
- 调用getSession()方法是创建
- 销毁
- session调用了 session.invalidate()方法
- session过期
- 创建
- 案例
-
package weblistenner; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * @author ztr * @version 创建时间:2021年4月20日 下午7:25:40 * 类说明 */ /** * * * 项目名称:web05 类名称:HttpSessionListenner 类描述: 创建人:ztr 创建时间:2021年4月20日 下午7:25:43 * * @version 访问html不会创建Session * 访问jsp会创建Session 因为jsp会被翻译成servlet且通过起源码可以得知 * javax.servlet.http.HttpSession session = null; * session = pageContext.getSession(); * 访问Servlet也不会创建Session因为其默认没有调用getSession方法 */ public class HttpSessionListenner implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent sec) { System.out.println("Httpsession被创建"); } @Override public void sessionDestroyed(HttpSessionEvent sec) { System.out.println("Httpsession被销毁"); } }
- 在web.xml中配置监听器
-
<listener> <listener-class> weblistenner.HttpSessionListenner </listener-class> </listener>
<--
配置session的过期时间
-->
<session-config>
<session-timeout>1</session-timeout>
</session-config> - 再创建demo1.jsp(其可以不包含任意代码)
-
- 启动服务器,并访问demo1,.jsp
- 此时控制台会输出:Httpsession被创建
- 当浏览器不进行任何操作时,在一分钟后session将会过期,控制台会输出:Httpsession被销毁
- session对象的创建和销毁
- 该接口含有两个方法
- ServletRequsetListener监听器
- 该接口含有两个方法
-
Request的创建和销毁
- 创建
-
当浏览器向客服端发送请求时
-
- 销毁
- 当服务器响应了浏览器发出的请求之后,便会进行销毁
- 创建
-
案例
-
package weblistenner; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; /** * @author ztr * @version 创建时间:2021年4月20日 下午7:44:00 * 类说明 * 访问HTML,JSP,Servlet都会创建Request对象 * 因为这些都是客户端向服务器发出的请求 */ public class MySErvletRequestListeber implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent arg0) { System.out.println("servletrequest被销毁"); } @Override public void requestInitialized(ServletRequestEvent arg0) { System.out.println("servletrequest被创建"); } }
- 在web.xml中进行监听器的配置
-
<listener> <listener-class> weblistenner.MySErvletRequestListeber </listener-class> </listener>
- demo1.jsp
- 启动tomcat服务器,并访问demo1.jsp
- 控制器会输出:servletrequest被创建,servletrequest被销毁
- ServletContextListener
- 监听三个域对象的属性变更(属性的更改和移除,替换)(3个)
- ServletContextAttrubuteListener
- 该接口含有以下方法
- 案例
-
MyHttpsessionAttributeListener
-
package weblistenner; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; /** * @author ztr * @version 创建时间:2021年4月21日 下午8:09:44 * 类说明 */ public class MyHttpsessionAttributeListener implements HttpSessionAttributeListener{ @Override public void attributeAdded(HttpSessionBindingEvent arg0) { System.out.println("向session添加了属性"); } @Override public void attributeRemoved(HttpSessionBindingEvent arg0) { System.out.println("向session移除了属性"); } @Override public void attributeReplaced(HttpSessionBindingEvent arg0) { System.out.println("向session替换了属性"); } }
- 在web.xml中配置监听器
-
<listener> <listener-class> weblistenner.MyHttpsessionAttributeListener </listener-class> </listener>
- demo2.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> <% //向session中添加属性 session.setAttribute("name", "梨花"); //属性的替换 session.setAttribute("name","张三"); //移除属性 session.removeAttribute("name"); %> </body> </html>
- 启动tomcat服务器,并在浏览访问demo2.jsp
- 控制台输出:
- 向session添加了属性
向session替换了属性
向session移除了属性
- 向session添加了属性
- servletRequestAttribute和ServletSessionAttribute和上述的方法一致。
- ServletContextAttrubuteListener
监听HttpSession中javaBean的状态改变(钝化,活化,绑定,解除绑定)
-
-
钝化:session持久化到一个存储设备中
-
活化:随session对象从一个存储设备中恢复
-
绑定:将java类绑定到session中
-
解绑:从session中解绑
-
-
Servlet规范中定义了两个特殊的监听的接口来帮助java类了解自己session域中的状态
- HttpSessionBindingListener
- HttpSessionActiveListener
- 实现这两个接口的类不需要在web.xml中进行配置
- 配置session的序列化和饭序列化
- 在context.xml中配置
-
<?xml version="1.0" encoding="UTF-8"?> <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="mysession"/> </Manager> </Context>
对高配置文件的说明:
- 当浏览器超过一分钟未与服务器进行交互时,将session序列化到存储设备中,一减轻服务器的的内存压力,当浏览器再次访问时,在将session进行反序列化
- context.xml可以配置在以下位置
- Toamcat/conf/context.xml
- Tomcat.conf/Catalina/localhost/context.xml
- 配置在工程目录下的/META-INF/cintext.xml
- 案例java类的绑定与解除绑定
-
javaBean的详解
- 就是实现了固定的规范,通过get和set方法来设置属性
-
package bean; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; /** * @author ztr * @version 创建时间:2021年4月21日 下午8:25:07 * 类说明 * java类的绑定和解除绑定的测试 */ public class Bean1 implements HttpSessionBindingListener{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void valueBound(HttpSessionBindingEvent arg0) { System.out.println("绑定"); } @Override public void valueUnbound(HttpSessionBindingEvent arg0) { System.out.println("解除绑定"); } }
-
-
- demo3.jsp
-
<%@page import="bean.Bean1"%>
<%@ 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>
<%
Bean1 bean = new Bean1();
//将java类绑定到session中
//需要注意的是setArrtibute中的参数是java类
session.setAttribute("bean", bean);
//将java类从session中移除
session.removeAttribute("bean");
%>
</body>
</html> - 启动tomcat服务器,并在浏览器中访问demo3.jsp
- 控制台输出
- 绑定
解除绑定
- 绑定
- 案例-java类的钝化和活化
-
- Bean2.java
-
package bean; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; /** * @author ztr * @version 创建时间:2021年4月21日 下午8:53:26 * 类说明 */ public class Bean2 implements HttpSessionActivationListener,Serializable{ /** * */ private static final long serialVersionUID = 1L; private String name; @Override public void sessionDidActivate(HttpSessionEvent arg0) { System.out.println("别活化"); } @Override public void sessionWillPassivate(HttpSessionEvent arg0) { System.out.println("别钝化"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
- demo4.jsp
-
<%@page import="bean.Bean2"%> <%@ 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> <% Bean2 bean2 = new Bean2(); bean2.setName("fds"); session.setAttribute("bean2",bean2); %> </body> </html>
- demo5.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> ${bean2.name } </body> </html>
- 启动tomcat服务器,并在浏览器中访问demo4.jsp
-
笨鸟先飞