[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

时间:2023-12-24 11:41:31

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.域对象中属性的变更的事件监听器( 三个很少被使用 )

  1)域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器

  2)这三个监听器接口分别是  ServletContextAttributeListener  ,   HttpSessionAttributeListener   和  ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同

  3)当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象

  4)各个域属性监听器中的完整语法定义为:

      public void attributeAdded(ServletContextAttributeEvent scae)

      public void attributeReplaced(HttpSessionBindingEvent hsbe)

      public void attributeRmoved(ServletRequestAttributeEvent srae)

  

以request 为例子做测试

TestAttribute.java

 package com.jason.listener;

 import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; /**
*
* @ClassName:TestAttribute
* @Description:TODO
* @author: jason_zhangz@163.com
* @date:2016年7月17日下午9:44:56
*
*
*/
public class TestAttribute implements ServletContextAttributeListener, ServletRequestAttributeListener
,HttpSessionAttributeListener{ @Override
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub } @Override
public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub } @Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub } @Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
System.out.println("向 request 中添加了一个 属性 ... ");
} @Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
System.out.println("从 request 中移除了一个属性 ... "); } @Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
System.out.println("从request 中置换了属性 ..."); } @Override
public void attributeAdded(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub } @Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub } @Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub } }

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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 配置listener --> <listener>
<listener-class>com.jason.listener.TestAttribute</listener-class>
</listener>
/web-app>

test-attribute-listener.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>
<%
request.setAttribute("name", "jason");
System.out.println("--------------------------------------------------");
request.setAttribute("name", "zhang");
System.out.println("--------------------------------------------------");
request.removeAttribute("name");
System.out.println("--------------------------------------------------");
%> </body>
</html>

2.感知 Session 绑定的事件监听器( 使用较少 )

 > 保存在 Session 域中的对象可以有多种状态:

  1)绑定到  Session 中;从 Session 域中解除绑定

  2)随 Session 对象持久化到一个存储设备中;随 Session 对象从一个存储设备中恢复

 >Servlet 规范中定义了两个特殊的监听器接口来帮助  JavaBean  对象了解自己在 Session 域中的这些状态:HttpSessionBindingListener接口  和  HttpSessionActivationListener接口 ,实现这两个接口的类不需要 web.xml 文件中进行注册

 2.1 HttpSessionBindingListener接口:监听实现了该接口的 Java 类的对象 绑定到 session 或从 session 中解除绑定事件

  ① 实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被绑定到 Session 中和从 Session 中删除的事件

   ② 当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法

   ③ 当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法

HttpSessionBindingListener.jsp

 <%@page import="com.jason.listener.user"%>
<%@ 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>
<h3>HttpSessionBindingListener</h3>
<%
user usr = new user();
session.setAttribute("user", usr); System.out.println("---------------------"); session.removeAttribute("user");
%> </body>
</html>

user.java

 package com.jason.listener;

 import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; public class user implements HttpSessionBindingListener { @Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
System.out.println("绑定到session ");
} @Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
System.out.println("从session 中解除绑定");
} }

  2.2 HttpSessionActivationListener接口(不常用)

    1)实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件

     2)当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前,web 服务器调用该对象的  void sessionWillPassivate(HttpSessionBindingEvent event) 方法

    3)当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web 服务器调用该对象的 void sessionDidActive(HttpSessionBindingEvent event)方法