监听器是一个接口,具体方法由我们实现。属于javaweb三大组件。
三大域中,每个域都有两个监听器。
分别是生命周期监听器和属性监听器
**ServletContext域
-生命周期监听期:ServletContextListener,它有两个方法。
*void contextInitialized(ServletContextEvent sce ):出生时调用
*void contextDestroyed(ServletContextEvent sce):销毁时调用
事件对象:ServletContextEvent
主要方法:
ServletContext getServletContext()
-属性监听器:ServletContextAttributeListener:它有三个方法,一个在添加属性时调用,一个在替换属性时调用,还有一个在移除属性时调用。
* void attributeAdded(ServletContextAttributeEvent event) :添加属性时调用
* void attributeRemoved(ServletContextAttributeEvent event) :移除属性时调用
* void attributeReplaced(ServletContextAttributeEvent event) :替换属性时调用
事件对象:ServletContextAttributeEvent
主要方法:
String getName();获取属性名称
Object getValue():获取属性值
ServletContext getServletContext() ;
**HttpSession域
-生命周期监听器:HttpSessionListener,它有两个方法。
*void sessionCreated(HttpSessionEvent se) :创建session时调用
*void sessionDestroyed(HttpSessionEvent se) :销毁session时调用
事件对象:HttpSessionEvent
主要方法:
HttpSession getSession() ;
-属性监听器:HttpSessionAttributeListener:它有三个方法,一个在添加属性时调用,一个在替换属性时调用,还有一个在移除属性时调用。
* void attributeAdded(HttpSessionBindingEvent event):添加属性时调用
* void attributeRemoved(HttpSessionBindingEvent event) :移除属性时调用
* void attributeReplaced(HttpSessionBindingEvent event):替换属性时调用
事件对象:HttpSessionBindingEvent
主要方法:
String getName() ;获取属性名称
Object getValue() ;获取属性值
HttpSession getSession() ;获取session对象
**ServletRequest域
-生命周期监听器:ServletRequestListener,它有两个方法。
*void requestInitialized(ServletRequestEvent sre ):创建request时调用
*void requestDestroyed(ServletRequestEvent sre) :销毁request时调用
事件对象:ServletRequestEvent
主要方法:
ServletContext getServletContext ();
ServletRequest getServletRequest() ;
-属性监听器:ServletRequestAttributeListener:它有三个方法,一个在添加属性时调用,一个在替换属性时调用,还有一个在移除属性时调用。
*void attributeAdded(ServletRequestAttributeEvent srae) :添加属性时调用
*void attributeRemoved(ServletRequestAttributeEvent srae ):移除属性时调用
*void attributeReplaced(ServletRequestAttributeEvent srae) :替换属性时调用
事件对象:ServletRequestAttributeEvent
主要方法:
String getName(); 获取属性名称
Object getValue() ;获取属性值
ServletContext getServletContext ();
ServletRequest getServletRequest() ;
1.创建一个类实现Servletontext域生命周期监听器接口,方法内容由自己实现。
public class AListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("死亡");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("出生");
}
}
2.在web.xml中注册监听器
<listener>
<listener-class>cn.cad.web.listener.AListener</listener-class>
</listener>
3.ServletContext对象在服务器开启时就创建,服务器关闭销毁。所以我们开启服务器和关闭服务器时就会看到效果。
出生
死亡
1.编写一个类实现ServletContext域的属性监听器
public class BListener implements ServletContextAttributeListener {
//添加属性时被调用
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("你添加了"+arg0.getName()+"属性,值为"+arg0.getValue());
}
//移除属性时被调用
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("你删除"+arg0.getName()+"属性,值为"+arg0.getValue());
}
//替换属性时被调用
public void attributeReplaced(ServletContextAttributeEvent arg0) {
//替换属性时的getValue方法获取的是替换之前的值,获得更改后的值可以通过getServletContext.getAttribute()获取
System.out.println("你更改了"+arg0.getName()+"属性,原值为"+arg0.getValue()+",更改后的值"+arg0.getServletContext().getAttribute("name"));
}
}
2.在web.xml注册监听器
3.我们在jsp页面中添加,替换,删除属性,即可看到效果
<body>
<%
application.setAttribute("name", "zhangsan");
%>
<%
application.setAttribute("name", "lisi");
%>
<%
application.removeAttribute("name");
%>
</body>
有两个感知监听器。
特性
-与session相关
-用来添加到javaBean上
-不需要在web.xml中注册
HttpSessionBindingListener监听器
用来添加到javaBean上。比如我们有一个User类,实现这个接口,这样当我们user对象放入session中时,user对象就能知道自己被放入session,移除时对象自己也能知道被session移除。
1.我们创建一个javaBean实现这个接口,并实现他的两个方法
public class User implements HttpSessionBindingListener{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
@Override
public void valueBound(HttpSessionBindingEvent arg0) { //与session绑定时调用
System.out.println("被放入session");
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) { //从session移除时被调用
// TODO Auto-generated method stub
System.out.println("从session移除");
}
}
2.我们在jsp测试我们的监听器
<body>
<%
//创建javaBean对象,并将其放入session域
cn.cad.web.listener.User user=new cn.cad.web.listener.User();
session.setAttribute("user", user);
%>
<%
//将javaBean对象从session域中移除
session.removeAttribute("user");
%>
</body>
3.输出结果
被放入session
从session移除
HttpSessionActivationListener监听器
HttpSessionActivationListener也是感知监听器,添加在javabean上。
可以让javaBean对象知道自己是否跟随session被序列化或者钝化到了硬盘上。但是javaBean对象必须实现该监听器接口和序列化接口,要不然保存不到硬盘上。
Session的序列化和反序列化
应用场景:
一般来说,网站服务器启动后,就不会再关闭了,但是如果服务器出现问题需要重启,而用户session还在进行相应的操作,例如购物车里添加了很多东西,必须保存session这时就需要使用序列化将session信息保存起来放在硬盘,服务器重启后,又重新加载。这样就保证了用户信息不会丢失,实现永久化保存
序列化就是将信息永久保存,例如保存到硬盘上等。
我们发现我们向session里面设置一个属性,关闭服务器,项目目录会多出一个session.ser的文件,这就是将session序列化了。
这时当我们重新开启服务器,依然可以获取session值。
怎么关闭序列化?
在tomcat的conf目录下的context.xml中添加一句
<Manager pathname="" /> 即可。
session的钝化和活化
应用场景:
当很多用户访问网站时,服务器会产生大量session,内存可能会承受不了,这时候我们将长时间不活动的session先保存在客户的硬盘上,这叫做钝化。
当用户使用session时,再从硬盘中读取session,这叫做活化。
具体的配置可以参考百度。