JavaWeb之Listener监听器
监听在Java体系中运用的很广泛,在安卓开发、JavaWeb开发中到处存在,在其他语言也有类似的,如果有了解过设计模式那很容易理解实现的原理。不过对于开发者来说,使用观察者模式只需实现相应的接口就好,所以很方便。在Servlet2.5中有8种的Listener,Session、Request、Context的创建与销毁、属性变化对应6种还有2个是对Session内对象的监听。
一、监听对象的创建与销毁
1.ServletRequestListener:监听Request的创建和监听
每次请求都会执行requestInitialized(ServletRequestEvent sre)方法,request处理完毕自动销毁前会执行requestDestroyed(ServletRequestEvent sre)方法。
ServletRequestEvent的API可以看下图,里面有一个getServletContext()方法可以获得值改变后的getServletContext
2.HttpSessionListener:监听Session的创建和监听
Session创建时执行sessionCreated(HttpSessionEvent se)方法,当Session销毁失效时执行sessionDestroyed(HttpSessionEvent se)方法。下面再看下HttpSessionEvent对象。
从API可以看到可以通过getSession()方法获取改变后的session对象。
3.ServletContextListener:监听Context的创建和销毁
通知将开始 Web 应用程序初始化过程。在初始化 Web 应用程序中的所有过滤器或 servlet 之前,应该通知所有 ServletContextListener 关于上下文初始化的信息。通知即将关闭 servlet 上下文。在通知所有 ServletContextListener 上下文销毁之前,所有 servlet 和过滤器都已销毁。下图是ServletContextEvent类。
可以通过getServletContext()方法来获得改变后的ServletContext对象。
二、监听对象的属性变化
1.HttpSessionAttributeListener:监听Session的改变,Session的增加、删除和替换
下面再查下API看看HttpSessionBindingEvent对象
可以通过该对象获取session的name和值value。
2.ServletRequestAttributeListener:监听Request属性的改变
下面是ServletRequestAttributeEvent对象
可以通过属性的Name和Value。
3.ServletContextAttributeListener:用于监听上下文属性的改变
下图是ServletContextAttributeEvent类
也是获取Name和Value,和上面的基本类似。
三、监听Session内的对象
这两个与其他的就有点不一样了。
1.HttpSessionBindingListener
首先看它的接口
当对象被放到Session里时会执行valueBound(HttpSessionBindingEvent event)方法,当对象从Session中移除时会执行valueUnbound(HttpSessionBindingEvent event)方法,不过对象要实现这个接口。
2.HttpSessionActivationListener
服务器关闭时会将Session的内容保存到硬盘,这个过程叫钝化。服务器重启时会将Session内容从内容中加载,钝化会执行sessionDidActivate(HttpSessionEvent se)方法,重新加载会执行sessionWillPassivate(HttpSessionEvent se),对象也是要实现这个接口。
四、实验
上面算是把8个监听对象理论学习了下,下面利用上面的来做个实验。
1.创建
还是和Filter一样,以HelloWorld为基础,不重新创建包了,直接在com.test.cyw包中创建一个Listener,实现了6个接口。同时新建了一个Person类实现了Session内对象监听的两个接口
点击下一步可以选择要实现哪些监听接口.除了上面介绍的几个接口,还有几个新的接口,这里不再一一介绍,不过都是实现接口。
2.实现
1.创建一个Person类继承HttpSessionActivationListener, HttpSessionBindingListener实现这两个接口
package com.test.cyw; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import javax.servlet.http.HttpSessionEvent; public class Person implements HttpSessionActivationListener, HttpSessionBindingListener { public Person(String name, int age) { Name = name; Age = age; } public String getName() { return Name; } public void setName(String name) { Name = name; } public int getAge() { return Age; } public void setAge(int age) { Age = age; } private String Name; private int Age; @Override public void valueBound(HttpSessionBindingEvent arg0) { // TODO Auto-generated method stub System.out.println("HttpSessionBindingListener_valueBound Name:"+arg0.getName()+"Value:"+arg0.getValue()); } @Override public void valueUnbound(HttpSessionBindingEvent arg0) { // TODO Auto-generated method stub System.out.println("HttpSessionBindingListener_valueUnbound Name:"+arg0.getName()+"Value:"+arg0.getValue()); } @Override public void sessionDidActivate(HttpSessionEvent arg0) { // TODO Auto-generated method stub System.out.println("HttpSessionActivationListener_sessionDidActivate"); } @Override public void sessionWillPassivate(HttpSessionEvent arg0) { // TODO Auto-generated method stub System.out.println("HttpSessionActivationListener_sessionWillPassivate"); } }
2.在MyListener中实现其他的6种接口,不打印记录
package com.test.cyw; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Application Lifecycle Listener implementation class MyListener * */ @WebListener public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener,HttpSessionAttributeListener,ServletRequestAttributeListener,ServletContextAttributeListener { /** * Default constructor. */ public MyListener() { // TODO Auto-generated constructor stub } /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) */ public void sessionCreated(HttpSessionEvent arg0) { // TODO Auto-generated method stub System.out.println("HttpSessionListener_sessionCreated"); } /** * @see ServletRequestListener#requestDestroyed(ServletRequestEvent) */ public void requestDestroyed(ServletRequestEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletRequestListener_requestDestroyed"); } /** * @see ServletRequestListener#requestInitialized(ServletRequestEvent) */ public void requestInitialized(ServletRequestEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletRequestListener_requestInitialized"); } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) */ public void sessionDestroyed(HttpSessionEvent arg0) { // TODO Auto-generated method stub System.out.println("HttpSessionListener_sessionDestroyed"); } /** * @see ServletContextListener#contextDestroyed(ServletContextEvent) */ public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletContextListener_contextDestroyed ContextParam:"+arg0.getServletContext().getInitParameter("ImageType")); } /** * @see ServletContextListener#contextInitialized(ServletContextEvent) */ public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletContextListener_contextInitialized ContextParam:"+arg0.getServletContext().getInitParameter("ImageType")); } /** * @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent) */ public void attributeAdded(HttpSessionBindingEvent arg0) { System.out.println("HttpSessionAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue()); } /** * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent) */ public void attributeRemoved(HttpSessionBindingEvent arg0) { System.out.println("HttpSessionAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue()); } /** * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent) */ public void attributeReplaced(HttpSessionBindingEvent arg0) { System.out.println("HttpSessionAttributeListener_attributeReplaced Name:"+arg0.getName()+" Value:"+arg0.getValue()); } @Override public void attributeAdded(ServletRequestAttributeEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletRequestAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue()); } @Override public void attributeRemoved(ServletRequestAttributeEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletRequestAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue()); } @Override public void attributeReplaced(ServletRequestAttributeEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletRequestAttributeListener_attributeReplaced Name:"+arg0.getName()+" Value:"+arg0.getValue()); } @Override public void attributeAdded(ServletContextAttributeEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletContextAttributeListener_attributeAdded Name:"+arg0.getName()+" Value:"+arg0.getValue()); } @Override public void attributeRemoved(ServletContextAttributeEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletContextAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue()); } @Override public void attributeReplaced(ServletContextAttributeEvent arg0) { // TODO Auto-generated method stub System.out.println("ServletContextAttributeListener_attributeRemoved Name:"+arg0.getName()+" Value:"+arg0.getValue()); } }
3.在test.jsp中设置request、response的属性、创建person对象并添加到session中,创建session并对其进行增改删。这里需要使用jsp的import来引入person类。
<body> <% Person person=new Person("CuiYW",25); %> <% response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); session.setAttribute("Person", person) ; session.setAttribute("ID", "123456"); session.setAttribute("ID", "abcdef"); session.removeAttribute("ID"); %> </body>
4.配置
上面虽然实现了各种监听,但怎么让tomcat知道呢,还是需要在配置文件web.xml中配置。对于Session内对象的监听就不需要配置了。
<listener> <listener-class>com.test.cyw.MyFilter</listener-class> </listener>
5.结果
先启动Tomcat然后浏览器请求test.jsp然后关闭tomcat,可以在console中看到如下输出。
作者:社会主义接班人
出处:http://www.cnblogs.com/5ishare/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。