目录
一、监听器概述
1.1、概念
1.2、作用
1.3、图示
1.4、总结
二、servlet监听器
2.1、概念
2.2、作用
2.3、相关接口
2.3.1、监听对象创建/销毁的监听器接口
2.3.2、监听对象属性的变化
2.3.3、session相关监听器
三、代码示例
3.1、生命周期
3.1.1、ServletReques事件监听器
3.1.2、ServletContext事件监听器的生命周期
3.1.3、HttpSession事件监听器的生命周期
3.2、属性监听器
3.2.1、HttpSessionAttributeListener
3.2.2、ServletContextAttributeListener
3.2.3、ServletRequestAttributeListener
3.3、HttpSessionBindingListener 监听器
监听器是一个实现特定接口的普通Java类。
用于监听特定对象的创建、销毁、属性变化、方法调用等。
自己写的代码(无需监听),不是自己写的代码( 不知道对象的创建和销毁的时机 需要监听)
学习这个东西先明确它是啥,能干啥,通过什么方式达到什么目的。概述部分先明确它是啥。
文字是思想的载体,写随笔今后力求以简短的词句,呈现知识最终的思想,做到排版清晰,描述准确,不使下次阅读以繁琐;学而不思则罔,思而不学则殆,写随笔算是进一步对这个东西开发者思维的揣摩,算是一个思考的过程;好记性不如烂笔头,写随笔留下一个印象的节点。说来说去,学习这种编程语言给我的感觉就是活在别人定制的规则下一样,若不按照它的规则就是一把红色的差,感觉好不爽。
监听三个域对象创建和销毁、属性的变化、监听绑定到 HttpSession 域中的某个对象的状态
- Interface ServletRequestListener 监听request对象的创建或销毁
- Interface HttpSessionListener 监听session对象的创建或销毁
- Interface ServletContextListener 监听servletContext对象的创建或销毁
- Interface ServletRequestAttributeListener 监听request对象属性变化: 添加、移除、修改
- Interface HttpSessionAttributeListener 监听session对象属性变化: 添加、移除、修改
- Interface ServletContextAttributeListener 监听servletContext对象属性变化
- Interface HttpSessionBindingListener 监听对象绑定到session上的事件
- Interface HttpSessionActivationListener (了解) 监听session序列化及反序列化的事件
servlet事件监听器的生命周期就是监听ServletContext HttpSession ServletRequest三个对象域的创建和销毁
1、编写普通Java类实现ServletRequestListener接口
package cn.itcase.lifecycle;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
* 监听request对象的创建和销毁示例
*
* ServletRequestListener接口用于监听 ServletRequest 对象的创建和销毁。
* Request 对象被创建时,监听器的requestInitialized方法将会被调用。
* Request 对象被销毁时,监听器的requestDestroyed方法将会被调用
*
* servletRequest域对象创建和销毁的时机:
*创建:用户每一次访问,都会创建一个reqeust
*销毁:当前访问结束,request对象就会销毁
* @author RONG_YAO
*
*
*/
public class RequestListener implements ServletRequestListener {
// 对象销毁该方法被调用
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// 通过事件源参数arg0 获取request中保存的数据
Object obj = arg0.getServletRequest().getAttribute("arg0");
System.out.println(obj); // 输出request对象域中保存的数据
System.out.println("ServletRequest事件监听器销毁方法被调用:Requestlistener.requestDestoryed()");
}
// 对象创建该方法将会被调用
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("ServletRequest事件监听器创建方法被调用");
}
}
2、在web.xml中配置监听器 类路径全地址:包名+类名
demo02
cn.itcase.lifecycle.RequestListener
index.jsp
3、测试时可用jsp页面当做sevlet 在request对象域中设置参数
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'RequsetListener.jsp' starting page
测试ServletRequest事件监听器的生命周期
<% request.setAttribute("arg0","HelloWorld");%>
4、效果
1、编写一个普通Java类,实现ServletContextListener接口
package cn.itcase.lifecycle;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* ServletContext事件监听器的生命周期
*
* 当 ServletContext 对象被创建时,contextInitialized (ServletContextEvent sce)方法将被调用 当
* ServletContext 对象被销毁时,contextDestroyed(ServletContextEvent sce)方法将被调用
*
* servletcontext创建和销毁时机 创建:服务器启动针对每一个web应用创建servletcontext
* 销毁:服务器关闭前先关闭代表每一个web应用的servletContext
*
* @author Administrator
*
*/
public class ContextListener implements ServletContextListener {
// 销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
Object obj = arg0.getServletContext().getAttribute("arg0");
System.out.println(obj);
System.out
.println("ServletContext事件监听器调用被销毁:ContextLister.contextDestoryed");
}
// 创建
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out
.println("ServletContext事件监听器被创建:ContextListener.contextIntialized");
}
}
2、在web.xml中配置ServletContext监听器
cn.itcase.lifecycle.ContextListener
3、测试时用jsp页面当做sevlet 无需写servlet程序
测试ServletContext事件监听器的生命周期
<%
pageContext.setAttribute("arg0", "helloworld");
%>
1.编写普通Java类实现HttpSessionListener接口
package cn.itcase.lifecycle;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* HttpSession事件监听器生命周期示例
*
* HttpSessionListener接口用于监听HttpSession的创建和销毁
* 创建一个Session时,sessionCreated(HttpSessionEvent se) 方法将会被调用。
* 销毁一个Session时,sessionDestroyed (HttpSessionEvent se) 方法将会被调用。
*
* Session域对象创建和销毁的时机
* 创建:用户每一次访问时,服务器创建session
* 销毁:如果用户的session 30分钟没有使用,服务器就会销毁session,web.xml里面也可以配置session失效时间
* @author Administrator
*
*/
public class SessionListener implements HttpSessionListener {
// 创建时该方法被调用
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("HttpSession事件监听器被创建");
}
// 销毁时该方法被调用
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("HttpSession事件监听器被销毁");
}
}
Session对象域 的setAttribute/getAttribute 略
如果下次要用 参考以前写过的篇博客:https://mp.csdn.net/postedit/90279303
2、web.xml中HttpSession事件监听器的配置
cn.itcase.lifecycle.SessionListener
监听三个对象域的属性变化(属性的增加域移除)
1.编写一个普通Java类实现HttpSessionAttributeListener接口
package cn.itcase.lifecycle;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* 监听session属性变化的示例
*
* 该事件监听器 实现了HttpSessionAttributeListener接口中定义的三个属性变化的方法:
*
* 1.添加:当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded ()方法进行响应,
* 这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
*
* 2.移除:当删除被监听对象中的一个属性时,web 容器调用事件监听器的 attributeRemoved()方法进行响应
*
* 3.替换:当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced()方法进行响应
*
*【 注意】:实现另外两个接口(ServletContextAttributeListener、ServletRequestAttributeListener),监听
*相应对象的属性(添加,移除,替换)变化 同上面
*
* setAttribute("name",Object) 保存数据
* getAttribute("name") 获取数据
* removeAttribute("name") 清除数据
*
* @author Administrator
*
*/
public class SessionAtt implements HttpSessionAttributeListener {
// 属性添加方法 向被监听的对象中添加属性,web容器容器调用该方法
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
// 1.通过事件类型参数arg0 获取session对象
HttpSession session = arg0.getSession();
// 2.获取添加的属性
Object obj = session.getAttribute("Name");
Object obj1 = session.getAttribute("age");
// 3.打印测试
System.out.println("SessinAtt.attributeAdded方法被调用:");
System.out.println( obj);
System.out.println(obj1);
}
// 属性移除 当删除被监听对象中的一个属性时,web 容器调用事件监听器的该该方法
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// 获取属性
Object session = arg0.getSession().getAttribute("age");
System.out.println("SessionAtt.attributeRemoved()方法被调用");
System.out.println("属性已经移除:"+session); // 打印结果为null
}
// 属性替换
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// 1.通过事件类型参数arg0 获取sesison对象
HttpSession session = arg0.getSession();
// 2.获取替换前的值
Object old = arg0.getValue();
System.out.println("SessionAtt.attributeReplaced()方法被调用");
// 2.1 测试替换前的值
System.out.println("替换属性旧值:" + old);
// 3.获取新值
Object obj= session.getAttribute("userName");
// 3.1 测试替换后的值
System.out.println("替换属性新值:" + obj);
// 4. 测试
System.out.println("属性已替换");
}
}
2.servlet
测试事件监听器的属性变化
<%
// 设置属性
session.setAttribute("Name", "张三");
session.setAttribute("age", "17");
session.setAttribute("userName", "李四");
// 移除属性
session.removeAttribute("age");
// setAttribute在那个域中就从那个域中getAttribute()和removeAttribute()
// 其余连个写法参考这篇博客:https://mp.csdn.net/postedit/90279303
//保存数据默认情况下保存在page中
// pageContext.setAttribute("message","page's message");
// pageContext.setAttribute("message","session's message",PageContext.SESSION_SCOPE);// 保存到Session域中
// session.setAttribute("Name", "张三");
// pageContext.setAttribute("message","Context's message",PageContext.APPLICATION_SCOPE); // 保存到context域中
//application.setAttribute("name","张三");
// pageContext.setAttribute("message","requset's message",PageContext.REQUEST_SCOPE);// 保存到request域中
//requset.setAttribute("message","request's message"); //等价于上面代码
%>
package cn.itcase.session;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class ContextAtt implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("属性添加");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("属性移除");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("属性替换");
}
}
package cn.itcase.session;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class ServletRequest implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("ServletRequest属性添加");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("属性移除");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("属性替换");
}
}
监听对象绑定到session上的事件
package cn.itcase.session;
import java.util.List;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 为JavaBean 对象了解自己在 Session 域中状态Servlet 规范定义了两个特殊的监听器接口:
*1.HttpSessionBindingListener 监听对象绑定到session上的事件
*2.HttpSessionActivationListener 监听session序列化及反序列化的事件
*【注意】此两中接口无需在web.xml文件中进行配置(注册)
*
*保存在 Session 域中的对象可以有多种状态:
*1.绑定到 Session 中;
*2.从 Session 域中解除绑定;
*3.随 Session 对象持久化到一个存储设备中(钝化);
*4.随 Session 对象从一个存储设备中恢复(活化);
** @author Administrator
*
*/
public class Admin implements HttpSessionBindingListener {
private int id;
private String Name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Admin(){
}
public Admin(int id,String Name,String password){
super(); // 调用无参构造器
this.id = id;
this.Name = Name;
this.password = password;
}
//把javaBean对象绑定到session域对象
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("Admin对象放入Session域");
}
//把JavaBean对象从session域对象中解绑
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("Admin对象移出Session域");
}
}
<%@ page language="java" import="java.util.*,cn.itcase.session.Admin" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'BIndSession.jsp' starting page
<%
session.setAttribute("Info",new Admin());
session.removeAttribute("userInfo");
%>
监听session序列化及反序列化的事件