JavaWeb中八大监听器
域对象监听器
1.ServletContextListener
2.ServletContextAttributeListener
3.HttpSessionListener
4.HttpSessioniAttributeListener
5.ServletRequestListener
6.ServletRequestAttributeListener
javaBean监听器
7.HttpSessionBindingListener
8.HttpSessionActivationListener
功能说明
监听ServletContext
生死监听(生命周期监听):
ServletContextListener
出生后调用 void contextInitialized(ServletContextEvent event)
去世前调用 void contextDestroyed(ServletContextEvent event)
属性监听:
ServletContextAttributeListener
添加属性时调用 void attributeAdded(ServletContextAttributeEvent bindingevent)
替换属性时调用 void attributeReplaced(ServletContextAttributeEvent bindingevent)
删除属性时调用 void attributeRemoved(ServletContextAttributeEvent bindingevent)
监听HttpSession
生死监听(生命周期监听):
HttpSessionListener
出生后调用 void sessionCreated(HttpSessionEvent event)
去世前调用 void sessionDestroyed(HttpSessionEvent event)
HttpSessioniAttributeListener
添加属性时调用 void attributeAdded(HttpSessionBindingEvent bindingevent)
替换属性时调用 void attributeReplaced(HttpSessionBindingEvent bindingevent)
删除属性时调用 void attributeRemoved(HttpSessionBindingEvent bindingevent)
监听ServletRequest
生死监听(生命周期监听):
ServletRequestListener
出生后调用 void requestInitialized(ServletRequestEvent event)
去世前调用 void requestDestroyed(ServletRequestEvent event)
属性监听
ServletRequestAttributeListener
添加属性时调用 void attributeAdded(ServletRequestAttributeEvent bindingevent)
替换属性时调用 void attributeReplaced(ServletRequestAttributeEvent bindingevent)
删除属性时调用 void attributeRemoved(ServletRequestAttributeEvent bindingevent)
监听JavaBean在session中的存取
**作用:当类实现了该接口后,可以感知本类对象添加到session中,以及感知从session中移除,无需配置web.xml或者添加@WebListener **
HttpSessionBindingListener
bean对象被添加到Session中时调用 void valueBound(HttpSessionBindingEvent event)
bean对象被从Session中移除时调用 void valueUnbound(HttpSessionBindingEvent event)
监听JavaBean的钝化活化
作用:当实体类实现了HttpSessionActivationListener接口和Serializable接口,就可以监听Session的钝化与活化的状态了
HttpSessionActivationListener
活化后调用 void sessionWillPassivate(HttpSessionEvent event)
钝化后调用 void sessionDidActivate(HttpSessionEvent event)
域对象监听器实现步骤
1.创建类实现对应的6大Listener接口
2.要么添加@WebListener标签,要么在web.xml中添加监听器配置
<listener>
<listener-class>listener类的全类名</listener-class>
</listener>
3.这就完成了
什么是钝化活性化
钝化session,就是把session通过序列化的方式保存到硬盘文件中
活化就是把硬盘文件中的session在反序列化回内存
当session被Tomcat钝化时,session中存储的对象也被钝化,
当session被活化时,也会把session中存储的对象活化。
【本来用需要提醒的】这是将对象保存到本地,在IO中有说过,凡是都能保存到本地的对象,一定要实现序列化标记接口Serializable
如何钝化活化
tomcat-8.5.31\conf\context.xml文件中 添加如下配置 就会在
tomcat-8.5.31\work\当前项目\mysession\下生成钝化文件
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
</Manager>
案例一【ServletContext的生命周期监听】
由于差异不是很大,所以只用一个域对象的监听器举例ServletContextListener
监听器代码
package com.yuan.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* servletContext生死监听
* @author Yuan-9826
*
* 这个监听器用来存放一些 初始化代码的
*/
@WebListener
public class AListener implements ServletContextListener{
/**
* servletContext生之后运行 【最有用的监听器】
* @param sce
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("这个监听器出生了..........");
}
/**
* servletContext死之前运行
* @param sce
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("这个监听器去世了..........");
}
}
jsp代码
无---因为这里使用的是Tomcatweb服务器,启动时ServletContext域对象自动创建
启动效果
关闭效果
案例二【ServletContext的属性监听】
监听器代码
package com.yuan.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener()
public class BListener implements ServletContextAttributeListener {
/**
*添加属性时调用
* @param event
*/
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("您添加了一个名为 "+event.getName()+" ,值为 "+event.getValue()+"的属性");
}
/**
*替换属性时调用
* @param event
*/
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
}
/**
*删除属性时调用
* @param event
*/
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
}
}
jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>监听器测试</h1>
<%
request.setAttribute("request_name", "request_value");
session.setAttribute("session_name", "session_value");
application.setAttribute("application_name", "application_value");
%>
</body>
</html>
效果
要访问一下JSP页面 不然无法设置属性
案例三【javaBean监听】
监听器代码
package com.yuan.domain;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 实体类
* @author Yuan-9826
*/
public class Person implements HttpSessionBindingListener {
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("我被添加到Session中啦");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("我被Session给移除掉啦");
}
}
jsp代码1 添加person
<%@ page import="com.yuan.domain.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>添加person</h1>
<%
final Person person = new Person();
person.setId(01);
person.setName("Yuan");
session.setAttribute("session_name", person);
%>
</body>
</html>
jsp代码2 删除person
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>删除person</h1>
<%
session.removeAttribute("session_name");
%>
</body>
</html>
效果
案例四【session钝化与活化监听】
监听器代码
package com.yuan.domain;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
public class User implements Serializable, HttpSessionActivationListener {
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
/**
* 活化后调用
* @param se
*/
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("啊 我被活化了");
}
/**
* 钝化后调用
* @param se
*/
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("啊 我被钝化了");
}
}
jsp代码1
<%@ page import="com.yuan.domain.Person" %>
<%@ page import="com.yuan.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>添加user</h1>
<%
final User user = new User();
user.setId(01);
user.setName("Yuan");
session.setAttribute("session_user", user);
%>
</body>
</html>
jsp代码2
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<body>
<h1>查看person</h1>
<h3>${session.session_name}</h3>
</body>
</html>
访问之后 稍等一分钟,因为配置了最短钝化时间是1分钟
效果
成功钝化
成功监听到
再次访问showUser.jsp
成功活化
网友评论