1,什么是监听器?
其主要的功能就是监听Web的各种操作,当相关的操作触发后将产生的事件,并对此事件进行处理;
2,对application监听!
对application监听,实际上就是对ServletContext(Servlet上下文)监听,主要使用ServletContextListener和ServletContextAttributeListener两个接口;
- ServletContext状态监听:ServletContextListener接口;
对Servlet上下文状态监听可以使用javax.servlet.ServletContextListener接口,此接口的方法如下:
No | 方法 | 类型 | 描述 |
1 | public void contextInitialized(ServletContextEvent sce) | 普通 | 容器启动时触发 |
2 | public void contextDestoryed(ServletContextEvent sce) | 普通 | 容器销毁时触发 |
在ServletContext监听操作中,一旦触发了ServletContextListener接口中定义的事件后,可以通过ServletContextEvent进行事件的处理,此事件定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public ServletContext getServletContext() | 普通 | 取得ServletContext对象 |
可以通过getServletContext()方法取得一个ServletContext对象的实例,
一个简单的ServletContextListenerDemo:
package com.keith.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerDemo implements ServletContextListener {
/**
* context销毁时触发
*/
public void contextDestroyed(ServletContextEvent event) {
System.out.println("容器销毁时触发--->"+event.getServletContext().getContextPath());
}
/**
* context加载的时候触发
*/
public void contextInitialized(ServletContextEvent event) {
System.out.println("容器初始化---> "
+ event.getServletContext().getContextPath());
}
}
在web.xml里这样配置:
<listener> <listener-class>com.keith.listener.ServletContextListenerDemo</listener-class> </listener>
在web服务器关闭或者重启的时候会输出:容器初始化---> /jsp(jsp是我的工程名);信息;
- ServletContext属性监听:ServletContextAttributeListener接口
对Servlet上下文属性操作监听,可以使用javax.servlet.ServletContextAttributeListener接口,对此接口定义的方法:
No | 方法 | 类型 | 描述 |
1 | public void attributeAdded(ServletContextAttribute Event scab) | 普通 | 增加属性时触发 |
2 | public void attributeRemoved(ServletContextAttribute Event scab) | 普通 | 删除属性时触发 |
3 | public void attributeReplaced(ServletContextAttribute Event scab) | 普通 | 替换属性(重复设置)时触发 |
在上下文属性监听中,一旦触发了SerlvetContextAttributeListener接口中定义的事件后,可以通过ServletContextAttributeEvent进行事件的处理,此事件定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public String getName() | 普通 | 取得设置的属性名称 |
2 | public Object getValue() | 普通 | 取得设置的属性内容 |
对ServletContext属性的监听例子:ServletContextAttributeListenerDemo:
package com.keith.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class ServletContextAttributeListenerDemo implements
ServletContextAttributeListener {
/**
* 增加属性时触发
*/
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("---增加属性时--》属性名称:"+event.getName()+", 属性内容:"+event.getValue());
}
/**
* 移除属性时触发
*/
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("---移除属性时--》属性名称:"+event.getName()+", 属性内容:"+event.getValue());
}
/**
* 替换属性时触发
*/
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("---替换属性时--》属性名称:"+event.getName()+", 属性内容:"+event.getValue());
}
}
web.xml:
<listener> <listener-class>com.keith.listener.ServletContextAttributeListenerDemo</listener-class> </listener>
在页面我们可以这样测试,观察控制台:
<%
this.getServletContext().setAttribute("time:","2011年");
%>
<%
this.getServletContext().removeAttribute("time");
%>
3,对session监听
在监听器中,针对于session的监听操作主要使用HttpSessionListener,HttpSessionAttributeListener和HttpSessionBindingListener接口:
- session状态监听:HttpSessionListener接口:
当需要对创建或销毁session的操作进行监听时,可以试想javax.servlet.http.HttpSessionListener接口,此接口定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public void sessionCreated(HttpSessionEvent se) | 普通 | session创建时调用 |
2 | public void sessionDestoryed(HttpSessionEvent se) | 普通 | session销毁时调用 |
当session创建或销毁后,将产生HttpSessionEvent事件,此事件定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public HttpSession getSession() | 普通 | 取得当前的session |
session状态监听:
package com.keith.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class HttpSessionListenerDemo implements HttpSessionListener {
/**
* session创建时触发
*/
public void sessionCreated(HttpSessionEvent event) {
System.out.println("Session创建,SESSION ID == "+event.getSession().getId());
}
/**
* session销毁时触发
*/
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("session销毁,SESSION ID == "+event.getSession().getId());
}
}
web.xml:
<listener>
<listener-class>com.keith.listener.HttpSessionListenerDemo</listener-class>
</listener>
当访问一个动态页面的时候,观察后台!、
session的销毁操作:
当一个新用户打开一个新的动态页面时,服务器会为新用户分配一个session,并且触发HttpSessionListener接口中的sessionCreated()事件,但是在session有2种销毁方法:
1,调用HttpSession接口中的invalidate()方法,让一个session失效;
2,配置session的时间,在web.xml中这样配置的session的有效时间:
<session-config>
<session-timeout>5</session-timeout>
</session-config>
session在5分钟后失效;默认的时间是30分钟;
- session属性监听:HttpSessionAttributeListener接口;
在session监听中也可以对session的属性进行监听,这一点与监听servletContext属性的道理一样,要对session的属性操作监听,可以使用javax.servlet.http.HttpSessionAttribute Listener接口完成;此接口的定义方法如下:
No | 方法 | 类型 | 描述 |
1 | public void attributeAdded(HttpSessionBindingEvent se) | 普通 | 增加属性时触发 |
2 | public void attributeRemoved(HttpSessionBindingEvent se) | 普通 | 删除属性时触发 |
3 | public void attributeReplaced(HttpSessionBindingEvent se) | 普通 | 替换属性时触发 |
当进行属性操作时,将根据属性的操作触发HttpSessionAttributeListener接口中的方法,每个操作方法都将产生HttpSessionbindingEvent事件,此事件定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public HttpSession getSession() | 普通 | 取得session |
2 | public String getName() | 普通 | 取得属性名称 |
3 | public Object getValue() | 普通 | 取得属性的内容 |
对session的属性操作监听:HttpSessionAttributeListenerDemo:
package com.keith.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener{
/**
* 属性增加时触发
*/
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId()+",增加了属性---》属性名称:"+event.getName()+",属性内容:"+event.getValue());
}
/**
* 属性移除时触发
*/
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId()+",移除了属性---》属性名称:"+event.getName()+",属性内容:"+event.getValue());
}
/**
* 属性替换时触发
*/
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId()+",替换了属性---》属性名称:"+event.getName()+",属性内容:"+event.getValue());
}
}
web.xml:
<listener> <listener-class>com.keith.listener.HttpSessionAttributeListenerDemo</listener-class> </listener>
在页面中对session的setAttribute()/removeAttribute()进行测试;
- session属性监听:HttpSessionBindingListener接口,以上的session监听接口都需要在web.xml文件中配置后才起作用,但是在Web中也提供了一个javax.servlet.http.HttpSessionBindingListener接口,通过此接口实现的监听程序可以不用配置直接使用,此接口定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public void valueBound(HttpSessionBindingEvent event) | 类型 | 绑定对象到session时触发 |
2 | public void valueUnbound(httpSessionBindingEvent event) | 类型 | 从session中移除对象时触发 |
以上的2个方法都将产生HttpSessionBindingEvent事件,下面通过此接口实现一个用户登陆信息监听的操作:
LoginUser:
package com.keith.listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class LoginUser implements HttpSessionBindingListener {
private String name;
public LoginUser() {
}
public LoginUser(String name) {
this.setName(name);
}
/**
* 在session中绑定
*/
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("---在session中保存LoginUser对象(name = "+this.getName()+"),session id = "+event.getSession().getId());
}
/**
* 在session中移除
*/
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("---从session中移除LoginUser对象(name = "+this.getName()+"),session id = "+event.getSession().getId());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在session.jsp中:
<%
LoginUser user = new LoginUser("keith");
session.setAttribute("info",user);
%>
访问session.jsp时,看控制台的输出(统一方法测试下移除session时控制台的输出);
4,对request监听
对request操作监听,主要使用ServletRequestListener和ServletRequestAttributeListener两个接口;
- 请求状态监听:ServletRequestListener接口:
当需要对用户的每次请求进行监听时,可以使用javax.servlet.ServletRequestListener接口,此接口的定义方法如下:
No | 方法 | 类型 | 描述 |
1 | public void requestInitalized(ServletRequestEvent sre) | 普通 | 请求开始时调用 |
2 | public void requestDestroyed(ServletRequestEvent sre) | 普通 | 请求结束时调用 |
ServletRequestListener接口一旦监听到事件后,将产生ServletRequestEvent的事件处理对象,此事件定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public ServletRequest getServletRequest() | 普通 | 取得ServletRequest对象 |
2 | public ServletContext getServletContext() | 普通 | 取得ServletContext对象 |
对用户的request进行监听:ServlteRequestListenerDemo:
package com.keith.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class ServlteRequestListenerDemo implements ServletRequestListener{
/**
* request初始化时触发
*/
public void requestDestroyed(ServletRequestEvent event) {
System.out.println("request初始化。http://"+event.getServletRequest().getRemoteAddr()+event.getServletContext().getContextPath());
}
/**
* request销毁时触发
*/
public void requestInitialized(ServletRequestEvent event) {
System.out.println("request销毁。http://"+event.getServletRequest().getRemoteAddr()+event.getServletContext().getContextPath());
}
}
web.xml:
<listener> <listener-class>com.keith.listener.ServlteRequestListenerDemo</listener-class> </listener>
当我们访问工程的时候,看下控制台的输出!
- request属性监听:ServletRequestAttributeListener接口
对request范围属性的监听可以使用javax.servlet.ServletRequestAttributeListener接口,此接口定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public void attributeAdded(ServletRequestAttributeEvent srae) | 普通 | 属性增加时触发 |
2 | public void attributeReplaced(ServletRequestAttributeEvent srae) | 普通 | 属性替换时触发 |
3 | public void attributeRemoved(ServletRequestAttributeEvent srae) | 普通 | 属性删除时触发 |
加入监听器后,request属性的操作都会产生ServletRequestAttributeEvent事件,此事件定义的方法如下:
No | 方法 | 类型 | 描述 |
1 | public String getName() | 普通 | 取得设置的属性名称 |
2 | public Object getValue() | 普通 | 取得设置的属性内容 |
监听器request属性操作---ServletRequestAttributeListenerDemo
package com.keith.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class ServletRequestAttributeListenerDemo implements
ServletRequestAttributeListener {
/**
* 增加属性时触发
*/
public void attributeAdded(ServletRequestAttributeEvent event) {
System.out.println("---增加request属性--》属性名称:"+event.getName()+",属性内容:"+event.getValue());
}
/**
* 属性移除时触发
*/
public void attributeRemoved(ServletRequestAttributeEvent event) {
System.out.println("---删除request属性--》属性名称:"+event.getName()+",属性内容:"+event.getValue());
}
/**
* 替换属性时触发
*/
public void attributeReplaced(ServletRequestAttributeEvent event) {
System.out.println("---替换request属性--》属性名称:"+event.getName()+",属性内容:"+event.getValue());
}
}
web.xml:
<listener> <listener-class>com.keith.listener.ServletRequestAttributeListenerDemo</listener-class> </listener>
request.jsp:
<%
request.setAttribute("name","keith");
request.setAttribute("date",new Date());
%>
看下控制台的输出!