您的位置:首页 > 其它

Servlet监听器示例

2016-04-09 17:26 465 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: