使用过滤器和监听器_第1页
使用过滤器和监听器_第2页
使用过滤器和监听器_第3页
使用过滤器和监听器_第4页
使用过滤器和监听器_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

使用过滤器和监听器第1页,共32页,2023年,2月20日,星期三本章学习目标:

理解过滤器和监听器的执行过程和作用掌握过滤器和监听器的开发和部署第2页,共32页,2023年,2月20日,星期三13.1Filter在Web开发中的应用

过滤器(Filter)是在Servlet2.3规范中引入的新功能,并在Servlet2.4规范中得到增强。Servlet过滤器是一种Web组件,它们拦截请求和响应,以便查看、提取或以某种方式操作客户机和服务器之间交换的数据。第3页,共32页,2023年,2月20日,星期三13.1.1过滤器概述对Web应用来说,过滤器就是驻留在服务器端,在源数据和目的数据间,对Web请求和Web响应的头属性(Header)和内容体(Body)进行操作的一种特殊Web组件。如图13-1所示。过滤器目标资源浏览器请求响应Web容器第4页,共32页,2023年,2月20日,星期三在一个Web应用程序中,可以部署多个过滤器,这些过滤器组成一个过滤器链。过滤器链中的每个过滤器都有特定的操作,请求和响应在浏览器和目标资源之间按照部署描述符中声明的过滤器的顺序,在过滤器之间进行传递。如图13-2所示。过滤器1目标资源浏览器请求响应Web容器过滤器3过滤器4过滤器2第5页,共32页,2023年,2月20日,星期三13.1.2FilterAPI与过滤器开发相关的接口和类包含在javax.servlet和javax.servlet.http包中,主要的接口和类如表13-1所示。接口/类说明javax.servlet.Filter接口过滤器是执行过滤任务的对象,这些任务是针对对某一资源(servlet或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。javax.servlet.FilterConfig接口servlet容器使用的过滤器配置对象,该对象在初始化期间将信息传递给过滤器。javax.servlet.FilterChain接口FilterChain是servlet容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用FilterChain调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。javax.servlet.ServeltRequestWrapper类extendsjava.lang.ObjectimplementsServletRequest提供ServletRequest接口的便捷实现,希望将请求适配到Servlet的开发人员可以子类化该接口。默认情况下,方法通过包装的请求对象调用。javax.servlet.ServeltResponseWrapper类extendsjava.lang.ObjectimplementsServletResponse提供ServletResponse接口的便捷实现,希望根据Servlet适配响应的开发人员可以子类化该接口。默认情况下,方法通过包装的响应对象调用。javax.servlet.HttpServeltRequestWrapper类extendsServletRequestWrapperimplementsHttpServletRequest提供HttpServletRequest接口的便捷实现,希望将请求适配到Servlet的开发人员可以子类化该接口。此类实现Wrapper或Decorator模式。默认情况下,方法通过包装的请求对象调用。javax.servlet.HttpServeltResponseWrapper类extendsServletResponseWrapperimplementsHttpServletResponse提供HttpServletResponse接口的便捷实现,希望根据Servlet适配响应的开发人员可以子类化该接口。此类实现Wrapper或Decorator模式。默认情况下,方法通过包装的响应对象调用。第6页,共32页,2023年,2月20日,星期三13.1.3Filter接口所有的过滤器在开发中必须实现javax.servlet.Filter接口,并且提供一个公开的不带参数的构造方法。接口定义了init()、doFilter()和destroy()三方法,和Servelt接口类似,这三个方法分别对应Servlet过滤器生命周期中的初始化、响应和销毁三个阶段第7页,共32页,2023年,2月20日,星期三13.1.4FilterConfig接口当容器对Filter对象进行初始化时,容器调用Filter的init方法,并传入一个实现FilterConfig接口的对象。Filter可使用该对象获得一些有用的信息。第8页,共32页,2023年,2月20日,星期三13.1.5FilterChain接口

javax.servlet.FilterChain接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器或者是将调用目标资源。第9页,共32页,2023年,2月20日,星期三13.1.7过滤器的部署在创建过滤器之后必须将它添加到部署描述符中,这样容器才会将过滤器投入到服务中去。配置工作由两部分组成:1.声明过滤器<filter>元素用于在Web应用中声明一个过滤器。<filter>元素的结构如图13-6所示。第10页,共32页,2023年,2月20日,星期三filterdescriptionfilter-namedisplay-namefilter-classiconinit-paramdescriptionparam-nameparam-value第11页,共32页,2023年,2月20日,星期三2.设置过滤器映射<filter-mapping><filter-mapping>元素用于指定过滤器关联的URL样式或者Servlet。<filter-mapping>结构如图13-7所示。filter-mappingfilter-nameservlet-nameurl-pattern0..4dispatcheror第12页,共32页,2023年,2月20日,星期三使用<filter-mapping>元素使用<servlet-name>元素将过滤器连接到一个servlet中。使用<url-pattern>将过滤器映射到某个URL模式使用<url-pattern>将过滤器映射到某个URL模式的方法会获得更大的灵活性,它能够使开发人员将过滤器应用于一组servlet、JSP或任何静态资源。第13页,共32页,2023年,2月20日,星期三13.1.8对请求数据进行处理的过滤器

【例13-2】使用过滤器校验表单数据在Web应用,常要求用户注册成功后才能使用。有时用户在注册时输入不合法。在过滤器中拦截客户端请求,获得输入的参数数据,对输入的参数数据的合法性进行校验,将不合法的请求重新定位到一个错误页面。第一步:开发3个jsp页面:CheckForm.jsp、CheckFormSuccess.jsp和CheckFormFail.jsp第二步:编写过滤器类:过滤器类的名字为CheckFormFilter.java,第三步:在web.xml文件中添加配置过滤器CheckFormFilter第四步:验证过滤器CheckFormFilter运行效果第14页,共32页,2023年,2月20日,星期三第15页,共32页,2023年,2月20日,星期三【例13-3】使用过滤器改变请求的编码在应用开发中,经常使用过滤功能对客户端的请求进行统一编码。当没有指定request的编码方式时,从客户端得到的数据是ISO-8859-1编码的。第16页,共32页,2023年,2月20日,星期三解决办法之一就是开发一个过滤器对请求进行统一编码,一次性解决所有页面请求的编码转换问题。第一步:编写CheckForm.jsp和CheckFormSuccess.jsp页面。第二步:编写过滤器类:过滤器类的名字为Encoding.java第三步:在web.xml文件中配置过滤器EncodingFilter。为了保证过滤器EncodingFilter在CheckFormFilter之前处理请求,必须在过滤器CheckFormFilter之前配置过滤器EncodingFilter。第17页,共32页,2023年,2月20日,星期三第18页,共32页,2023年,2月20日,星期三13.1.9对响应内容进行压缩的过滤器

提高网站的访问速度,从软件角度来说首先就是要尽可能地提高web应用程序的执行速度,可以优化代码的执行效率和使用缓存来实现。如果在此基础上还需进一步提高网页的浏览速度,那就可以对响应内容进行压缩,以节省网络的带宽,提高访问速度。第19页,共32页,2023年,2月20日,星期三利用请求和响应的包装类(wrapper)来间接改变请求和响应的信息。在Servlet规范中定义了4个包装类:publicclassjavax.servlet.ServeltRequestWrapperextendsjava.lang.ObjectimplementsServletRequestpublicclassjavax.servlet.ServeltResponseWrapperextendsjava.lang.ObjectimplementsServletResponsepublicclassjavax.servlet.HttpServeltRequestWrapperextendsServletRequestWrapperimplementsHttpServletRequestpublicclassjavax.servlet.HttpServeltResponseWrapperextendsServletResponseWrapperimplementsHttpServletResponse这4个包装类分别实现了请求或响应的接口,它们在构造方法中接受真正的请求和响应对象,然后利用该对象的方法来完成自己需要实现的方法。包装类是装饰设计模式的运用,它给我们提供了一种不使用继承而修改或增加现有对象功能的方法。第20页,共32页,2023年,2月20日,星期三【例13-5】利用包装类改变请求和响应信息。我们只需要编写一个包装类的子类,然后覆盖需要修改的方法就可以了。使用java.util.zip.GZIPOutputStream作为响应内容的输出流对象。GZIPOutputStream是过滤流类,使用GZIP压缩格式写入压缩数据。第一步:编写GZIPServletOutputStream.java第二步:编写CompressionResponseWrapper.java第三步:编写CompressionFilter.java第四步:部署过滤器

编辑web.xml文件,配置过滤器第五步:运行web应用程序,测试CompressionFilter第21页,共32页,2023年,2月20日,星期三第22页,共32页,2023年,2月20日,星期三13.2Servlet监听器

Servlet监听器是WEB应用程序事件模型的一部分,Servlet监听器用于监听一些WEB应用中重要事件的发生,监听器对象可以在事情发生前、发生后Servlet容器就会产生相应的事件,Servlet监听器用来处理这些事件。第23页,共32页,2023年,2月20日,星期三13.2.1监听器接口

ServletAPI中定义了8个监听器,根据监听对象的类型和范围可以分为3类:ServletContext事件监听器、HTTPSession事件监听器和ServletRequest事件监听器。8个监听器接口如表13-2所示。第24页,共32页,2023年,2月20日,星期三13.2.2ServletContextListener接口

在Web应用程序启动时需要执行一些初始化任务时,可以编写实现了ServletContextListener接口的监听器类。在ServletContextListener接口中定义了两个事件处理方法,分别是contextInitialize()和contextDestroyed()。ServletContextListener整个工作过程如图13-18所示第25页,共32页,2023年,2月20日,星期三13.2.3ServletContextAttributeListener接口

ServletContext的属性是由Web应用程序中所有的servlet所共享的。为保证属性在整个Web应用范围内的一致性,有必要监视ServletContext对象的任何属性的改变。ServletContextAttributeListener侦听器就是为了这一目的而设立的。该侦听器是一个实现了接口ServletContextAttributeListener的Java类第26页,共32页,2023年,2月20日,星期三图13-19ServletContextAttributeListener操作顺序图第27页,共32页,2023年,2月20日,星期三【13-6】开发一个对ServletContext及其属性进行监听的程序。第一步:编写TestListener.java第二步:在web.xml添加如下代码部署监听器第三步:编写测试JSP页面testContext.jsp第四步:看运行结果c:\test.txt文件第28页,共32页,2023年,2月20日,星期三13.2.4HttpSessionBindingListener接口如果一个对象实现了HttpSessionBindingListener接口,当这个对象被绑定到Session中或从Session中删除时,Servlet容器会通知这个对象,这个对象在接收到通知后,做初始化操作或清除状态的操作。第29页,共32页,2023年,2月20日,星期三HttpSessionBindingListener接口提供了如下方法:publicvoidvalueBound(HttpSessionBindingEventevent)当对象正在被绑定到Session中,Servlet容器通知对象它将被绑定到某个会话并标识该会话。publicvoidvalueUnbound(HttpSessionBindingEventevent)当从Session中删除对象时,Servlet容器通知对象要从某个会话中取消对它的绑定并标识该会话第30页,共32页,2023年,2月20日,星期三容器通过HttpSessionBindingEvent对象来通知侦听器发生的事件的具体信息。提供了2种方法:publicHttpSessionB

温馨提示

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

评论

0/150

提交评论