监听器:javaweb中监听器比较常用, 将它与事件源头绑定在一起就可以通过事件对象在事件源和监听器之间传递信息了。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
javaweb中的有三种不同的监听类,分别对应三个不同的域:
下面三个接口是各个域创建销毁的时候将调用其对应的方法
ServletContext域:ServletContextListener接口
ServletRequet域:ServletRequestListener接口
session域: httpSessionListener接口
当三个域中的属性发生变化时,可以实现下面三个接口监听:
ServletContextAttributeListener接口
ServletRerquestAttributeListener接口
HttpSessionAttributeListener接口
只需要根据需求实现上述不同接口,让后在web.xml文件中配置监听器就可以是实现不同的监听器了
另外,对于session域有点不同,它还有 HttpSessionActivationListener 和 HttpSessionBindingListener 接口
这两个接口也叫session感知型接口,
HttpSessionBindingListener 接口:任何类实现了此接口,不仅可以感知自己本身是否被加入了session域中,还可以感知自己在session中的状态(是否被置换,是否被移除).
httpSessionActivaction 接口: 此接口是当被活化和钝化的时候被执行(活化:从硬盘加载到内存中,钝化:从内存移到硬盘中)。
看实例:
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/*
* 编写ServletContext域的监听器需要实现ServletContextListener接口
*
*/
public class MyServletContextListener implements ServletContextListener,ServletContextAttributeListener{
//当servletcontext对象被清除的时候,此方法会被执行
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("监听初始化事件:"+arg0);
System.out.println("ServletContext对象被销毁了");
}
//当servletContext对象被服务器创建的时候,此方法会被执行
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("监听初始化事件:"+arg0);
System.out.println("ServletContext对象被创建了");
}
/*
*
* 实现ServletContextAttributeListener接口,可以监听当ServletContext对象中的属性改变时引起相应方法的调用
*
*/
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("添加属性:"+arg0.getName()+",值:"+arg0.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("去除属性:"+arg0.getName()+",值:"+arg0.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("置换属性:"+arg0.getName()+",值:"+arg0.getValue());
}
}
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/*
*
* 每当一个请求发送到服务器的时候,都会调用requestinitialized()方法
*
*
*/
public class MyRequestLisntener implements ServletRequestListener,ServletContextAttributeListener{
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("servletRequest 被销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("servletReqsuest :"+arg0.getServletRequest().getRemoteAddr());
}
/*
* 当ServletRequest对象中的属性值发生变化的时候,相应的方法将会被调用
*
*/
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("在servletrequest中添加属性:"+arg0.getName()+"值:"+arg0.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("在servletrequest中去除属性:"+arg0.getName()+"值:"+arg0.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("在servletrequest中置换属性:"+arg0.getName()+"值:"+arg0.getValue());
}
}
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.catalina.SessionEvent;
import org.apache.catalina.SessionListener;
public class MySessionLisntener implements HttpSessionListener,HttpSessionAttributeListener{
//每当服务器有一个新的连接的时候都会让创建一个新的session,此方法会被执行
@Override
public void sessionCreated(HttpSessionEvent session) {
// TODO Auto-generated method stub
System.out.println("session:"+session.getSession().getId()+"被创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent session) {
// TODO Auto-generated method stub
System.out.println("session:"+session.getSession().getId()+"被销毁了");
}
/*
* 当session对象的属性发生变化时,相应的方法将会被调用
* @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
*/
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("在session中添加属性:"+arg0.getName()+"值:"+arg0.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("在servletrequest中去掉属性:"+arg0.getName()+"值:"+arg0.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("在servletrequest中置换属性:"+arg0.getName()+"值:"+arg0.getValue());
}
}
感知型接口:
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener{
private String name;
private String phone;
public User(String _name,String _phone)
{
this.name=_name;
this.phone=_phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
/*
*
*实现了httpSeeionBindingListener接口的类 可以感知到自己在是否加入到了session中以及在session中的状态
*不需要在web.xml文件中配置
*/
//被添加到session中
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println(arg0.getName()+"被添加到session中");
}
//从session中被去除
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println(arg0.getName()+"从session中被清除");
}
}
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
public class Customer implements HttpSessionActivationListener,Serializable {
private static final long serialVersionUID = 1L;
private String name;
public Customer(String name)
{
this.name=name;
}
public void SetName(String name)
{
this.name=name;
}
public String GetName()
{
return name;
}
/*
*
*
* 实现了HttpSessiontivaction接口的类可以随着session被活化或者钝化
* 活化:放到内存中
* 钝化:放到了硬盘中
*
*
* 这个需要在META-INF目录下创建context.xml文件
*
* 文件内容为:
*
* 1 <Context>
2 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
3 <Store className="org.apache.catalina.session.FileStore" directory="gacl"/>
4 </Manager>
5 </Context>
*
*
* 实现httpSessionActactionListener 和 httpSessionBindingListenr这个不需要在web.xml文件中配置
*
* @see javax.servlet.http.HttpSessionActivationListener#sessionDidActivate(javax.servlet.http.HttpSessionEvent)
*/
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println(name+"session:"+arg0.getSession().getId()+"被活化到硬盘中了");
}
@Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println(name+"session:"+arg0.getSession().getId()+"被钝化到硬盘中了");
}
}
至此,javaweb中的监听器就这些内容了,需要重点掌握,在整合三大框架的时候就需要用到。