Servlet过滤器1.doc_第1页
Servlet过滤器1.doc_第2页
Servlet过滤器1.doc_第3页
Servlet过滤器1.doc_第4页
Servlet过滤器1.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Servlet监听器详解Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。接口:目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中HttpSessionAttributeListener与HttpSessionBindingListener皆使用HttpSessionBindingEvent;HttpSessionListener和HttpSessionActivationListener则都使用HttpSessionEvent;其余Listener对应的Event如下所示:Listener接口Event类ServletContextListenerServletContextEventServletContextAttributeListenerServletContextAttributeEventHttpSessionListenerHttpSessionEventHttpSessionActivationListenerHttpSessionAttributeListenerHttpSessionBindingEventHttpSessionBindingListenerServletRequestListenerServletRequestEventServletRequestAttributeListenerServletRequestAttributeEvent一 ,ServletContext相关监听接口补充知识:通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量。在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。注意:全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由元素所设定的变量,它的范围也是Application范围,例如: Name browser当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:String name = (String)application.getInitParameter(Name);或者使用EL时:$initP若是在Servlet中,取得Name的值方法:String name = (String) ServletContext.getInitParameter (Name);1.ServletContextListener:用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。ServletContextListener接口的方法:void contextInitialized(ServletContextEvent sce)通知正在接受的对象,应用程序已经被加载及初始化。void contextDestroyed(ServletContextEvent sce)通知正在接受的对象,应用程序已经被载出。ServletContextEvent中的方法:ServletContext getServletContext()取得ServletContext对象2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。ServletContextAttributeListener接口方法:void attributeAdded(ServletContextAttributeEvent scab)若有对象加入Application的范围,通知正在收听的对象void attributeRemoved(ServletContextAttributeEvent scab)若有对象从Application的范围移除,通知正在收听的对象void attributeReplaced(ServletContextAttributeEvent scab)若在Application的范围中,有对象取代另一个对象(重新给赋值保存)时,通知正在收听的对象ServletContextAttributeEvent中的方法:java.lang.String getName()回传属性的名称java.lang.Object getValue()回传属性的值现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。下面利用监听器对数据库连接池DataSource的初始化演示它的使用: 1: MyServletContextListener.java 2: package dc.gz.listeners; 3: import javax.servlet.ServletContext; 4: import javax.servlet.ServletContextEvent; 5: import javax.servlet.ServletContextListener; 6: import mons.dbcp.BasicDataSource; 7: 8: /* 9: * Web应用监听器10: */11: public class MyServletContextListener implements ServletContextListener 12: / 应用监听器的销毁方法14: public void contextDestroyed(ServletContextEvent event) 15: ServletContext sc = event.getServletContext();16: / 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空17: sc.removeAttribute(dataSource);18: System.out.println(销毁工作完成.);19: 20: 21: / 应用监听器的初始化方法22: public void contextInitialized(ServletContextEvent event) 23: / 通过这个事件可以获取整个应用的空间24: / 在整个web应用下面启动的时候做一些初始化的内容添加工作25: ServletContext sc = event.getServletContext();26: / 设置一些基本的内容;比如一些参数或者是一些固定的对象27: / 创建DataSource对象,连接池技术 dbcp28: BasicDataSource bds = new BasicDataSource();29: bds.setDriverClassName(com.mysql.jdbc.Driver);30: bds.setUrl(jdbc:mysql:/localhost:3306/hibernate);31: bds.setUsername(root);32: bds.setPassword(root);33: bds.setMaxActive(10);/最大连接数34: bds.setMaxIdle(5);/最大管理数35: /bds.setMaxWait(maxWait); 最大等待时间36: / 把 DataSource 放入ServletContext空间中,37: / 供整个web应用的使用(获取数据库连接)38: sc.setAttribute(dataSource, bds);39: System.out.println(应用监听器初始化工作完成.);40: System.out.println(已经创建DataSource.);41: 42: web.xml中配置如下,很简单: 1: 2: 3: dc.gz.listeners.MyServletContextListener 4: 这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。上面通过两个示例演示了Filter和Listener的基本使用,对于其它的应用则需要我们在项目开发中根据具体的场景选择。二、HttpSession相关监听接口1.HttpSessionBindingListener接口注意:HttpSessionBindingListener接口是唯一不需要在web.xml中设定的Listener当我们使用的类实现了HttpSessionBindingListener接口后,只要该类的对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:void valueBound(HttpSessionBindingEvent event)void valueUnbound(HttpSessionBindingEvent event)public class UserObject implements HttpSessionBindingListener public void valueBound(HttpSessionBindingEvent event) System.out.println(触发绑定事件!); public void valueUnbound(HttpSessionBindingEvent event) System.out.println(解除和session的绑定); 当把该监听器保存到session中,session.setAttribute(user,user)时就会触发valueBound事件.当该监听器从session中移除时即session.removeAttribute(user),触发valueUnbound事件;session失效或超时时也会触发valueUnbound事件。注意:只有当该监听器(UserObject)保存到session中或从session移除时才会触发事件,其他没有实现该listener对象保存到session时不会触发该事件。思考:如何实现记录网站的客户登录日志, 统计在线人数?2.HttpSessionAttributeListener接口HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。这和ServletContextAttributeListener比较类似。.HttpSessionAttributeListener接口和HttpSessionBindingListener区别:HttpSessionAttributeListener是所有session属性操作都可以,HttpSessionBindingListener 只是针对于被绑定类的对象 在实现session操作时候。3.HttpSessionListener接口HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。4.HttpSessionActivationListener接口主要用于同一个Session转移至不同的JVM的情形。四、ServletRequest监听接口1.ServletRequestListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest2.ServletRequestAttributeListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequestServlet监听器监听器概述Listener是Servlet的监听器可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。编写监听器需要实现相应的接口编写完成后在web.xml文件中配置一下,就可以起作用了可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪常用的Servlet监听器监听接口ServletContextAttributeListener监听对ServletContext属性的操作,比如增加/删除/修改ServletContextListener监听ServletContext,当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(SessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。使用范例:由Servlet监听器管理共享数据库连接生命周期事件的一个实际应用由context监听器管理共享数据库连接。在web.xml中如下定义监听器:listener listener-classXXX.MyConnectionManager/listener-class /listenerserver创建监听器的实例,接受事件并自动判断实现监听器接口的类型。要记住的是由于监听器是配置在部署描述符web.xml中,所以不需要改变任何代码就可以添加新的监听器。publicclassMyConnectionManagerimplementsServletContextListener publicvoidcontextInitialized(ServletContextEvente) Connectioncon=/createconnection e.getServletContext().setAttribute(con,con); publicvoidcontextDestroyed(ServletContextEvente) Connectioncon=(Connection)e.getServletContext().getAttribute(con); try con.close(); catch(SQLExceptionignored)/closeconnection Servlet监听器保证每新生成一个servlet context都会有一个可用的数据库连接,并且所有的连接对会在context关闭的时候随之关闭。有的listener可用于统计网站在线人数及访问量。 如下:服务器启动时(实现ServletContextListener监听器contextInitialized方法),读取数据库,并将其用一个计数变量保存在application范围内 session创建时(实现HttpSessionListener监听器sessionCreated方法),读取计数变量加1并重新保存 服务器关闭时(实现ServletContextListener监听器contextDestroyed方法),更新数据库。简例一监听用户上线与退出,显示在线用户1、登陆页面 Login.jsp用户名:2、控制页面(只是为了说明监听器问题,所以简单了点.) isOnline.jsp3、显示页面 showOnline.jsp% ArrayList showList=(ArrayList)(getServletContext().getAttribute(list);out.print(在线人数 +showList.size()+);for(int i=0;ishowList.size();i+)out.print(showList.get(i)+在线+);%退出4、配置页面 web.xml org.xiosu.listener.onlineListener5、监听器 onlineListener.javapackage org.xiosu.listener;import java.util.ArrayList;import javax.servlet.ServletContext;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class onlineListener implements HttpSessionListener,HttpSessionAttributeListener / 参数ServletContext sc;ArrayList list = new ArrayList();/ 新建一个session时触发此操作public void sessionCreated(HttpSessionEvent se) sc=se.getSession().getServletContext();System.out.println(新建一个session);/ 销毁一个session时触发此操作public void sessionDestroyed(HttpSessionEvent se) System.out.println(销毁一个session);if (!list.isEmpty() list.remove(String) se.getSession().getAttribute(userName); sc.setAttribute(list, list);/ 在session中添加对象时触发此操作,在list中添加一个对象public void attributeAdded(HttpSessionBindingEvent sbe) list.add(String) sbe.getValue();sc.setAttribute(list, list);/ 修改、删除session中添加对象时触发此操作public void attributeRemoved(HttpSessionBindingEvent arg0) public void attributeReplaced(HttpSessionBindingEvent arg0) 在Web开发中关于监听器的应用首先,也要在web.xml配置文件中进行声明: 在web.xml文件中的声明如下:(声明片断) 要放在filter过滤器声明和filter-mapping声明后面 markchen.web.listener.MySessionListener markchen.web.listener.MyServletContextListener /这两个java类的内容都和简单,仅仅是为了演示说明而已/MySessionListener.java文件的内容如下 /Web应用程序中会话的生命周期监听器实现 package markchen.web.listener;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class MySessionListener implements HttpSessionListener /在会话一创建

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论