1、application、request、session监听器
1、listener有三个
1、 ServletContextListener (监听application)
2、 ServletRequestListener (监听request)
3、 HttpSessionListener (监听session)
创建监听器必须实现这三个接口,需要监听哪个域就实现哪个
2、三个监听器各自需要实现两个方法
public class listenerTest implements ServletContextListener, ServletRequestListener, HttpSessionListener {
// session
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
// request
@Override
public void requestDestroyed(ServletRequestEvent sre) {
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
}
// application/servletContext
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
}
}
3、web.xml中配置监听器
<listener>
<listener-class>org.hp.listener.listenerTest</listener-class>
</listener>
只配置监听器的全类名就行,其他标签可选
4、监听器执行顺序
程序执行创建application对象,首先响应的就是application监听器
用户对服务器发出请求,会触发request监听器,服务器接收到请求就会创建session对象,即触发session监听器
2、属性值监听器
1、属性值监听器同样有三个
1、ServletContextAttributeListener
2、ServletRequestAttributeListener
3、HttpSessionAttributeListener
同样需要实现接口中的所有方法,每个接口中有三个方法
2、实现接口(编写监听器
// session
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
String name = se.getName();
Object val = se.getSession().getAttribute(name);
System.out.println("session监听器【创建】,属性名"+name+",属性值"+val);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
String name = se.getName();
Object val = se.getSession().getAttribute(name);
System.out.println("session监听器【移除】,属性名"+name+",属性值"+val);
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
String name = se.getName();
Object val = se.getSession().getAttribute(name);
System.out.println("session监听器【替换】,属性名"+name+",属性值"+val);
}
// request
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object val = srae.getServletRequest().getAttribute(name);
System.out.println("request监听器【创建】,属性名"+name+",属性值"+val);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object val = srae.getServletRequest().getAttribute(name);
System.out.println("request监听器【移除】,属性名"+name+",属性值"+val);
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object val = srae.getServletRequest().getAttribute(name);
System.out.println("request监听器【替换】,属性名"+name+",属性值"+val);
}
// application
@Override
public void attributeAdded(ServletContextAttributeEvent scab) {
String name = scab.getName();
Object val = scab.getServletContext().getAttribute(name);
System.out.println("application监听器【创建】,属性名"+name+",属性值"+val);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scab) {
String name = scab.getName();
Object val = scab.getServletContext().getAttribute(name);
System.out.println("application监听器【移除】,属性名"+name+",属性值"+val);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scab) {
String name = scab.getName();
Object val = scab.getServletContext().getAttribute(name);
System.out.println("application监听器【替换】,属性名"+name+",属性值"+val);
}
3、配置web.xml
<listener>
<listener-class>org.hp.listener.attributeListener</listener-class>
</listener>
和之前三个监听器一样
4、测试监听器(因为手懒前面三个没写)
首先创建一个新的jsp页面
并在页面中分别添加、替换、删除三个域中的三个属性和他们的值
<%
application.setAttribute("app", "new app");//创建
application.setAttribute("app", "old app");//替换
application.removeAttribute("app");//移除
request.setAttribute("req", "new req");//创建
request.setAttribute("req", "old req");//替换
request.removeAttribute("req");//移除
session.setAttribute("session", "new session");//创建
session.setAttribute("session", "old session");//替换
session.removeAttribute("session");//移除
%>
5、观察结果
request监听器【替换】,属性名org.apache.catalina.ASYNC_SUPPORTED,属性值false
application监听器【创建】,属性名org.apache.jasper.runtime.JspApplicationContextImpl,属性值org.apache.jasper.runtime.JspApplicationContextImpl@b554b31
application监听器【创建】,属性名org.apache.jasper.compiler.ELInterpreter,属性值org.apache.jasper.compiler.ELInterpreterFactory$DefaultELInterpreter@45b8ef89
application监听器【创建】,属性名app,属性值new app
application监听器【替换】,属性名app,属性值old app
application监听器【移除】,属性名app,属性值null
request监听器【创建】,属性名req,属性值new req
request监听器【替换】,属性名req,属性值old req
request监听器【移除】,属性名req,属性值null
session监听器【创建】,属性名session,属性值new session
session监听器【替换】,属性名session,属性值old session
session监听器【移除】,属性名session,属性值null
可以看到第一行是访问该jsp时创建的reqeust对象
第二第三行则是tomcat自动创建的application对象
以下就是这次实验的三个自定义对象
分别打印出了创建、替换和移除时的属性名和属性值