Listener教你快速入门(小白必看!!)
程序员文章站
2022-03-29 09:14:14
...
JavaWeb中的监听器:
事件源:有三大域
ServletContext
- 生死监听:ServletContextListener它有两个方法,一个在出生时调用,一个在死亡时调用;
- 属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。HttpSession
- 生死监听:HttpSessionListener它有两个方法,一个在出生时调用,一个在死亡时调用;
- void sessionCreated():创建session时执行
- void sessionDestoryed():销毁session时执行
- 属性监听:HttpSessiontAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。ServletRequest
- 生死监听:ServletRequestListener它有两个方法,一个在出生时调用,一个在死亡时调用;
- void requestInitialized():创建request时
- void requestDestored():销毁request时
- 属性监听:ServletRequesttAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
编写监听器:
- 写一个监听器类,必须实现某个监听器接口
- 在web.xml中配置来完成注册
public class AListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("哇,我来也!");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("哇,我要挂也!");
}
}
配置:
<listener>
<listener-class>net.xyz.web.listener.AListener</listener-class>
</listener>
ServletContextAttributeListener的相关方法:
@WebListener
public class BListener implements ServletContextAttributeListener {
/**
* Default constructor.
*/
public BListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextAttributeListener#attributeAdded(ServletContextAttributeEvent)
*/
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("您向ServletContext添加了一个名为"+scae.getName()+"值为:"+scae.getValue()+"的属性");
}
/**
* @see ServletContextAttributeListener#attributeRemoved(ServletContextAttributeEvent)
*/
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println(scae.getName()+"="+scae.getValue());//最后一次相见
}
/**
* @see ServletContextAttributeListener#attributeReplaced(ServletContextAttributeEvent)
*/
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("修改前的属性名称:"+scae.getName()+"修改前的属性的值:"+scae.getValue());
System.out.println("修改前的属性名称:"+scae.getName()+"修改后的属性值:"+scae.getServletContext().getAttribute(scae.getName()));
}
}
感知监听器(都与HttpSession相关)
- 它用来添加到JavaBean上,而不是添加到三大域上。用来监听JavaBean是否在Session中
- 这两个监听器都不需要在web,xml中注册
例:
public class User implements HttpSessionBindingListener{
private String name;
private String password;
public User() {
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("啊我被session添加了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("啊我被session无情的抛弃了");
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
}
- Session的序列化:在服务器关闭后,session的数据还存在,等待服务器开启后,session还会复活。
- Seesion 的活化与钝化:钝化:长时间不用的session服务器会把它保存到硬盘上,可以自己设置存储时间,活化:硬盘中的Session返回到内存。
HttpSessionActivationListener监听器,检测JavaBean是否被序列化
public class Person implements HttpSessionActivationListener {
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
// TODO Auto-generatListener.super.sessionWillPassivate(se);
System.out.println("我和session一起被序列化了");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("我和session又回来了");
}
}