监听器
a 监听对象的创建和销毁
四个范围对象:PageContext request session application
监听器监听的对象主要监听 request session application
对应的监听器监听对象
request-------- ServletRequestListener
session--------HttpSessionListener
application--------ServletContextListener
每个监听器各自提供了两个方法,监听开始、监听结束的方法
实现一个监听器
public class ServletListener implements ServletRequestListener,HttpSessionListener,ServletContextListener{
//监听application(ServletContext)
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("监听ServletContext,创建ServletContext对象...:"+servletContextEvent);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("监听ServletContext,销毁ServletContext对象...:"+servletContextEvent);
}
//监听request对象
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("监听ServletRequest,销毁ServletRequest对象...:"+servletRequestEvent);
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("监听ServletRequest,创建ServletRequest对象...:"+servletRequestEvent);
}
//监听session对象
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("监听HttpSession,创建HttpSession对象...:"+httpSessionEvent);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("监听HttpSession,销毁HttpSession对象...:"+httpSessionEvent);
}
}
配置监听器
<!--配置监听器-->
<listener>
<listener-class>cn.tju.Listener.ServletListener</listener-class>
</listener>
ServletContext 在servlet容器启动时,自动创建
ServletContext 在servlet容器关闭时,自动销毁i
当访问浏览器第一次访问一个页面时:
1 首先创建一个request对象
2 服务端对客户端创建一个session对象
3 请求结束销毁request对象
输出结果
监听ServletRequest,创建ServletRequest对象
监听HttpSession,创建HttpSession对象
监听ServletRequest,销毁ServletRequest对象
1在session.jsp点击超链接发起一次新的请求
2在sessionInvalidate.jsp 销毁session对象
3 请求结束
输出
监听ServletRequest,创建ServletRequest对象
监听HttpSession,销毁HttpSession对象
监听ServletRequest,销毁ServletRequest对象
b 监听对象中属性的变更
request-------- ServletRequestAttributeListener
session--------HttpSessionAttributeListener
application--------ServletContextAttributeListener
每一个接口有三个方法
增加 删除 替换
实现属性监听器
public class Attribute implements ServletRequestAttributeListener,HttpSessionAttributeListener,ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
String name = servletContextAttributeEvent.getName();//目前正在操作的属性名
Object value = servletContextAttributeEvent.getServletContext().getAttribute(name);
System.out.println("ServletContext增加属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
String name = servletContextAttributeEvent.getName();//目前正在操作的属性名
Object value = servletContextAttributeEvent.getServletContext().getAttribute(name);
System.out.println("ServletContext删除属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
String name = servletContextAttributeEvent.getName();//目前正在操作的属性名
Object value = servletContextAttributeEvent.getServletContext().getAttribute(name);
System.out.println("ServletContext替换属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
String name = servletRequestAttributeEvent.getName();//目前正在操作的属性名
Object value = servletRequestAttributeEvent.getServletRequest().getAttribute(name);
System.out.println("ServletRequest增加属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
String name = servletRequestAttributeEvent.getName();//目前正在操作的属性名
Object value = servletRequestAttributeEvent.getServletRequest().getAttribute(name);
System.out.println("ServletRequest删除属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
String name = servletRequestAttributeEvent.getName();//目前正在操作的属性名
Object value = servletRequestAttributeEvent.getServletRequest().getAttribute(name);
System.out.println("ServletRequest替换属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
String name = httpSessionBindingEvent.getName();//目前正在操作的属性名
Object value = httpSessionBindingEvent.getSession().getAttribute(name);
System.out.println("HttpSession增加属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
String name = httpSessionBindingEvent.getName();//目前正在操作的属性名
Object value = httpSessionBindingEvent.getSession().getAttribute(name);
System.out.println("HttpSession删除属性"+"属性名"+name+"属性值"+value);
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
String name = httpSessionBindingEvent.getName();//目前正在操作的属性名
Object value = httpSessionBindingEvent.getSession().getAttribute(name);
System.out.println("HttpSession替换属性"+"属性名"+name+"属性值"+value);
}
}
配置属性监听器
<listener>
<listener-class>cn.tju.Listener.Attribute</listener-class>
</listener>
实验页面
<%
//ServletContext对象 就是application
application.setAttribute("name","zs");
application.setAttribute("name","ls");
application.removeAttribute("name");
session.setAttribute("user","zs");
session.setAttribute("user","ls");
session.removeAttribute("user");
request.setAttribute("user2","zs");
request.setAttribute("user2","ls");
request.removeAttribute("user2");
%>
输出
ServletContext增加属性属性名name属性值zs
ServletContext替换属性属性名name属性值ls
ServletContext删除属性属性名name属性值null
HttpSession增加属性属性名user属性值zs
HttpSession替换属性属性名user属性值ls
HttpSession删除属性属性名user属性值null
ServletRequest增加属性属性名user2属性值zs
ServletRequest替换属性属性名user2属性值ls
ServletRequest删除属性属性名user2属性值null