Servlet监听器示例

1.ServletContextListener ServletContext生命周期监听器


      <listener>
        <listener-class>com.zghw.servlet.demo.MyServletContextListener</listener-class>
      </listener>

package com.zghw.servlet.demo;

import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
 * ServletContextListener时生命周期监听器,如果想要知道何时Web应用程序已经初始化或即将结束销毁,
 * 可以实现ServletContextListener:
 * @author zghw
 *
 */
public class MyServletContextListener implements ServletContextListener {

	/**
	 * Web应用程序初始化后,监听ServletContext事件做些处理。
	 * ServletContextEvent封装了ServletContext对象,可以通过getServletContext方法取得
	 * ServletContext,可以使用ServletContext做些处理。
	 * 在整个Web应用程序生命周期,Servlet需要共享的资料可以设置ServletContext属性。由于ServletContext
	 * 在Web应用程序存活期间都会一直存在,所以设置为ServletContext属性的数据,除非主动移除,否则也是一直存活于
	 * Web应用程序中。
	 */
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		ServletContext servletContext=sce.getServletContext();
		Enumeration<String> params=servletContext.getInitParameterNames();
		while(params.hasMoreElements()){
			String name=params.nextElement();
			System.out.println("初始化参数:"+name+" 值: "+servletContext.getInitParameter(name));
		}
		System.out.println("执行MyServletContextListener contextInitialized");

	}
	/**
	 * Web应用程序即将销毁前,监听ServletContext事件做些处理。
	 */
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("执行MyServletContextListener contextDestroyed");
	}

}

2.ServletContextAttributeListener  ServletContext属性改变监听器


      <listener>
         <listener-class>com.zghw.servlet.demo.MyServletContextAttributeListener</listener-class>
      </listener>
package com.zghw.servlet.demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
 * 当Web应用程序中的ServletContext的属性事件发生改变时,通知监听器做些事情。
 * @author zghw
 *
 */
public class MyServletContextAttributeListener implements
		ServletContextAttributeListener {

	/**
	 * 当向ServletContext中调用setAttribute添加一个不存在的属性时,
	 * 该监听器得到事件ServletContextAttributeEvent,做一些处理
	 * ServletContextAttributeEvent继承了ServletContextEvent可以获得ServletContext
	 * 主要获得添加的值对象,进行处理。event.getName() event.getValue()
	 * key 和 value的方式出现。
	 */
	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		ServletContext servletContext=event.getServletContext();
		System.out.println(" MyServletContextAttributeListener attributeAdded 添加后 "
				+ "name="+event.getName() +", 值="+event.getValue());
	}

	/**
	 * 当属性移除时,
	 */
	@Override
	public void attributeRemoved(ServletContextAttributeEvent event) {
		System.out.println(" MyServletContextAttributeListener attributeRemoved 移除后 name="+event.getName() +", 值="+event.getValue());
	}

	/**
	 * 当属性被替换时。
	 */
	@Override
	public void attributeReplaced(ServletContextAttributeEvent event) {
		System.out.println(" MyServletContextAttributeListener attributeReplaced 替换后 name="+event.getName() +", 值="+event.getValue());
	}

}

3.HttpSessionListener HttpSession生命周期监听器

      <listener>
         <listener-class>com.zghw.servlet.demo.MyHttpSessionListener</listener-class>
      </listener>

package com.zghw.servlet.demo;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * HttpSession生命周期监听器,HttpSession的创建及销毁
 * @author zghw
 *
 */
public class MyHttpSessionListener implements HttpSessionListener {

	/**
	 * 创建完HttpSession对象时触发监听器。
	 */
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("MyHttpSessionListener sessionCreated");
	}

	/**
	 * 即将销毁HttpSession前时触发监听器。
	 * 可以从HttpSessionEvent中取得HttpSession对象,可以处理一些HttpSession的信息。
	 * 比如:当浏览器关闭时,session会被web容器回收,回收的时间时session的过期时间。。
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("MyHttpSessionListener sessionDestroyed");
		String userName=(String)se.getSession().getAttribute("login");
		System.out.println("销毁前userName="+userName);
	}

}

4.HttpSessionAttributeListener  HttpSession属性监听器

      <listener>
        <listener-class>com.zghw.servlet.demo.MyHttpSessionAttributeListener</listener-class>
      </listener>
package com.zghw.servlet.demo;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
 * HttpSession属性监听器,用于监听当属性操作变化事件。
 * @author zghw
 *
 */
public class MyHttpSessionAttributeListener implements
		HttpSessionAttributeListener {

	/**
	 * 当向session添加属性值时,
	 */
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		HttpSession hs = event.getSession();
		System.out.println("过期时间:"+hs.getMaxInactiveInterval());
		System.out.println("HttpSessionAttributeListener attributeAdded"
				+ " name="+event.getName()+" value="+event.getValue());
		
		//替换一个属性
		if(event.getValue().equals("zhangsan")){
			hs.setAttribute(event.getName(), "lisi");
		}
	}

	/**
	 * HttpSession属性被移除后触发监听
	 */
	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		System.out.println("HttpSessionAttributeListener attributeRemoved");
	}

	/**
	 * HttpSession属性被替换后触发监听
	 */
	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		System.out.println("HttpSessionAttributeListener attributeReplaced");
		System.out.println("HttpSessionAttributeListener attributeAdded"
				+ " name="+event.getName()+" value="+event.getValue());
	}
}

5.HttpSessionBindingListener  当HttpSession属性值为HttpSessionBindingListener实例且此属性发生改变的监听器

不需要在web.xml中配置Listener

package com.zghw.servlet.demo;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * 当HttpSession属性值为HttpSessionBindingListener实例且此属性发生改变的监听器,监听器触发事件
 * 不需要在web.xml中配置Listener
 * @author zghw
 *
 */
public class MyHttpSessionBindingListener implements HttpSessionBindingListener {

	/**
	 * 当HttpSession添加属性为HttpSessionBindingListener实例,则会触发这个事件
	 */
	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println("HttpSessionBindingListener valueBound  name="+event.getName()+" value="+event.getValue());
	}

	/**
	 * 当HttpSession移除属性为HttpSessionBindingListener实例,则会触发这个事件
	 */
	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		System.out.println("HttpSessionBindingListener valueBound  name="+event.getName()+" value="+event.getValue());
	}

}

6.HttpSessionActivationListener  HttpSession对象迁移监听器


 <Context>
 <!-- 持久化session 如果这个session属性对象是HttpSessionActivationListener则1分钟后,进行持久化到硬盘中 -->
     <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
  <!-- 存放目录 -->
     <Store className="org.apache.catalina.session.FileStore" directory="../gacl"/>
     </Manager>
 </Context>

package com.zghw.servlet.demo;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

/**
 * 对象迁移监听器,很多情况不会使用,在分布式环境时会使用,应用程序的对象可能分散在多个JVM中,
 * 当HttpSession要从一个JVM迁移至另一个JVM时,必须现在原来的JVM上序列化所有的属性对象。
 * 在这之前若属性对象有实现HttpSessionActivationListener,就会调用sessionWillPassivate方法
 * 而迁移至另一个JVM后,就会对所有属性对象做反序列化,此时会调用sessionDidActivate()方法。
 * @author zghw
 *
 */
public class MyHttpSessionActivationListener implements
		HttpSessionActivationListener,Serializable{
	private static final long serialVersionUID = 1L;
	private String name ;
	/**
	 * 在进行序列化MyHttpSessionActivationListener对象前,触发监听器处理,可以查看META-INF/context.xml用来持久化该对象的配置
	 */
	@Override
	public void sessionWillPassivate(HttpSessionEvent se) {
		System.out.println("HttpSessionActivationListener sessionWillPassivate sessionId="+se.getSession().getId());
	}
	/**
	 * 当HttpSession创建激活这个MyHttpSessionActivationListener对象属性后,触发监听器处理,可以查看META-INF/context.xml用来持久化该对象的配置
	 */
	@Override
	public void sessionDidActivate(HttpSessionEvent se) {
		System.out.println("HttpSessionActivationListener sessionDidActivate sessionId="+se.getSession().getId());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

测试类Servlet对于监听器演示

package com.zghw.servlet.demo;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.*;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void init() throws ServletException {
		System.out.println("执行Servlet init()");
	}
	public void destroy() {
		System.out.println("执行Servlet destroy()");
    }
	public void doGet(HttpServletRequest request, HttpServletResponse respose)
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		System.out.println("取得session时,使用了HttpSessionListener监听器会触发调用sessionCreated");
		String username = request.getParameter("userName");
		String age = request.getParameter("age");
		//使用ServletRequestAttributeListener监听器监听属性改变
		request.setAttribute("age", 100);
		request.setAttribute("age", 20);
		request.removeAttribute("age");
		if(username!=null){
			String info=(String)session.getAttribute(username);
			if(info==null){
				session.setAttribute("login",username);
				//当session绑定了SessionBindingListener监听器会触发SessionBindingListener的valueBound方法
				MyHttpSessionBindingListener mhsbl=new MyHttpSessionBindingListener();
				session.setAttribute("mhsbl", mhsbl);
				//
				MyHttpSessionActivationListener mhsal=new MyHttpSessionActivationListener();
				session.setAttribute("mhsal", mhsal);
				//设置session活动时间,当session清空后就会触发HttpSessionListener sessionDestroyed
				session.setMaxInactiveInterval(70);
			}
		}
		
		System.out.println("执行Servlet service");
		respose.setContentType("text/html;charset=UTF-8");
		PrintWriter out = respose.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>");
		out.println("this is a servlet out");
		out.println("</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Hello Servlet : " + getServletInfo() + "</h1>");
		out.println("<p>");

		out.println("<h3>ServletConfig</h3>");
		out.println("Servlet名字:" + this.getServletName());
		out.println("<br/>");
		Enumeration<String> initParamNames = this.getInitParameterNames();
		while (initParamNames.hasMoreElements()) {
			String name = initParamNames.nextElement();
			out.print("初始化参数: name = " + name + " , value = "
					+ this.getInitParameter(name));
			out.println("<br/>");
		}
		ServletContext servletContext = this.getServletContext();

		out.println("<h3>servletContext</h3>");

		out.println("</p>");
		out.println("</body>");
		out.println("</html>");
		//销毁session
		//System.out.println("即将销毁session");
		//session.invalidate();
	}
}

7. ServletRequestListener    ServletRequest的生命周期监听器。


      <listener>
         <listener-class>com.zghw.servlet.demo.MyServletRequestListener</listener-class>
      </listener>
package com.zghw.servlet.demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
 * ServletRequest的生命周期监听器。
 * @author zghw
 *
 */
public class MyServletRequestListener implements ServletRequestListener {

	/**
	 * ServletRequest对象创建后
	 */
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		ServletContext sc=sre.getServletContext();
		ServletRequest sr=sre.getServletRequest();
		System.out.println("ServletRequestListener requestDestroyed");
	}
	/**
	 * ServletRequest对象销毁前
	 */
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("ServletRequestListener requestInitialized");

	}

}

8.ServletRequestAttributeListener  ServletRequest的属性改变监听器


<listener>
      <listener-class>com.zghw.servlet.demo.MyServletRequestAttributeListener</listener-class>
      </listener>

package com.zghw.servlet.demo;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

/**
 * ServletRequest的属性改变时,触发监听器执行事件
 * @author zghw
 *
 */
public class MyServletRequestAttributeListener implements
		ServletRequestAttributeListener {

	/**
	 * ServletRequest添加属性后触发
	 */
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		System.out.println("ServletRequestAttributeListener attributeAdded name = " + srae.getName() + " value= "+ srae.getValue());

	}
	/**
	 * ServletRequest移除属性前触发
	 */
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		System.out.println("ServletRequestAttributeListener attributeRemoved name = " + srae.getName() + " value= "+ srae.getValue());
	}
	/**
	 * ServletRequest属性替换后触发
	 */
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		System.out.println("ServletRequestAttributeListener attributeReplaced name = " + srae.getName() + " value= "+ srae.getValue());

	}

}

输出结果:

ServletRequestListener requestInitialized
执行Servlet init()
ServletRequestAttributeListener attributeReplaced name = org.apache.catalina.ASYNC_SUPPORTED value= true
执行MyFilter doFilter
执行MyFilter doFilter before
执行MyFilter1 doFilter
执行MyFilter1 doFilter before
MyHttpSessionListener sessionCreated
取得session时,使用了HttpSessionListener监听器会触发调用sessionCreated
ServletRequestAttributeListener attributeAdded name = age value= 100
ServletRequestAttributeListener attributeReplaced name = age value= 100
ServletRequestAttributeListener attributeRemoved name = age value= 20
过期时间:1800
HttpSessionAttributeListener attributeAdded name=login value=zhangsan
HttpSessionAttributeListener attributeReplaced
HttpSessionAttributeListener attributeAdded name=login value=zhangsan
HttpSessionBindingListener valueBound  name=mhsbl value=com.zghw.servlet.demo.MyHttpSessionBindingListener@78472af8
过期时间:1800
HttpSessionAttributeListener attributeAdded name=mhsbl value=com.zghw.servlet.demo.MyHttpSessionBindingListener@78472af8
过期时间:1800
HttpSessionAttributeListener attributeAdded name=mhsal value=com.zghw.servlet.demo.MyHttpSessionActivationListener@575c049d
执行Servlet service
执行MyFilter1 doFilter after
执行MyFilter doFilter after
ServletRequestListener requestDestroyed
HttpSessionActivationListener sessionWillPassivate sessionId=57431BBAB46F393DFE45073566DFDAA9
HttpSessionBindingListener valueBound  name=mhsbl value=com.zghw.servlet.demo.MyHttpSessionBindingListener@78472af8
HttpSessionAttributeListener attributeRemoved
MyHttpSessionListener sessionDestroyed
销毁前userName=lisi
HttpSessionAttributeListener attributeRemoved
HttpSessionAttributeListener attributeRemoved


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值