过滤器和监听器

1.Sevlet过滤器

1.什么是过滤器

servlet过滤器与servlet十分相似,但它具有拦截客户端请求的功能。

过滤器实质上是在web应用服务器上的web应用组件,用于拦截客户端资源与目标资源的请求。

2.过滤器核心对象

过滤器对象放置在javax.servlet包中。

  • FilterConfig《interface》

    该接口由servlet容器实现,主要用于获取过滤器中的配置信息。

  • Filter《interface》

    每个过滤对象都要直接或间接地实现Filter接口,在filter中定义了三个方法,分别是init(),doFilter(),destroy()方法。

  • FilterChain《interface》

    该接口仍然由servlet容器实现。

3.过滤器的创建与配置

创建:

创建一个过滤器对象需要实现Javax.servlet,Filter接口,同时实现Filter接口的三个方法。init():用于对过滤器的初始化进行处理。destroy():过滤器的销毁方法。

doFilter():用于过滤处理的业务逻辑。

配置:

《!–过滤器的声明–》

《filter》

《filter-name》MyFilter《/filter-name》

《filter-class》com.lyq.MyFilter《/filter-class》

《/filter》

《!–过滤器映射–》

《filter-mapping》

《filter-name》MyFilter《/filter-name》

《url-pattern》/MyFilter《/url-pattern》

《/filter-mapping》

2.servlet监听器

1.servlet监听器简介

监听器的作用是监听web容器中的有效事件,因此它是由容器管理的。

2.servlet监听器的原理

servlet监听器是当今web开发的重要组成部分,它是在servlet2.3规范中和servlet过滤器一起引入的,并且在servlet2.4规范中进行较大的改进,主要用来对web应用进行监听和控制的,极大增强了web应用处理能力。

3.servlet上下文监听

servlet上下文监听可以监听servletContext对象的创建,删除以及属性的添加,删除和修改操作,该监听器需要用到如下两个接口。

ServletContextListener接口

该接口存放在javax.servlet包中,主要实现ServletContext的创建和删除。该接口提供了两个方法,也被称为“web应用程序的生命周期方法”

(1).contextInitialized(ServletContextEvent event)方法:通知正在收听的对象,应用程序已经被加载及初始化。

(2).contextDestroy(ServletContextEvent event)方法:通知正在收听的对象,应用程序已经被载出,即关闭。

ServletContextAttributeListener接口

该接口主要存放在javax.servlet包中,主要实现监听ServletContext属性的挺假,删除和修改。ServletContextAttributeListener接口提供了三个方法。

(1).attributeAdded(ServletContextAttributeEvent event)方法:当有对象加入到Application的范围时,通知正在收听的对象。

(2).attributeReplace(ServletContextAttributeEvent event)方法:当在application的范围中有对象取代另一个对象时,通知正在收听的对象。

(3).attributeRemove(ServletContextAttributeEvent event)方法:当有对象从application范围中移除时,通知正在收听的对象。

创建监听器

要让web容器启动时通知自定义的监听器,需要在web.xml中使用《listener》元素来配置监听器类。

eg:

《listener》

《listener-class》com.listener.MyContentListener《/listener-class》

《/listener》

4.HTTP会话监听

HTTP会话监听信息,有四个接口可以进行监听。

  • HttpSessionListener接口

    该接口实现HTTP会话的创建和销毁。该接口提供了以下两个方法:

    (1).sessionCreated(HttpSessionEvent event)方法:通知正在收听的对象,session已经被加载及初始化。

    (2).sessionDestroyed(HttpSessionEvent event)方法:通知正在收听的对象,session已经被载出。

  • HttpSessionActivationListener接口
  • 该接口实现监听HTTP会话active和passivate。该接口提供了三个方法:

    (1).attributeAdded(HttpSessionBindingEvent event)方法:当有对象加入到session的范围时,通知正在收听的对象。

    (2).attributeReplaced(HttpSessionBindingEvent event)方法:当在session范围内有对象取代另一个对象时,通知正在收听的对象。

    (3).attributeRemove(HttpSessionBindingEvent event)方法:当有对象从session范围在移除时,通知正在收听的对象。

  • HttpBindingListener接口

    HttpBindingListener接口实现监听HTTP会话中对象的绑定信息。它是唯一不需要在web.xml中设定Listener的。该接口提供了以下两个方法。

    (1).valueBound(HttpSessionBindingEvent event)方法:当有对象加入到session范围时会被自动调用。

    (2).valueUnBound(HttpSessionBindingEvent event)方法:当有对象从session范围内移除时会被自动调用。

  • HttpSessionAttributeListener接口

    该接口实现监听HTTP会话中属性的设置请求。

    (1).sessionDidActivate(HttpSessionEvent event)方法:通知正在收听的对象,他的session已经变为有效状态。

    (2).sessionWillPassivate(HttpSession event)方法:通知正在收听的对象,他的session已经变为无效状态。

5.servlet请求监听

  • SevletRequestListener接口

    该接口提供了以下两个方法:

    (1).requestInitalized(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被加载及初始化。

    (2).requestDestroyed(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest对象已经被载出,即关闭。

  • ServletRequestAttributeListener接口

    该接口提供了以下三个方法:

    (1).attributeAdded(ServletRequestAttributeEvent event)方法:当有对象加入到request的范围时,通知正在收听的对象。

    (2).attributeReplaced(ServletRequestAttributeEvent event)方法:当在request范围内有对象取代另一个对象时,通知正在收听的对象。

    (3).attributeRemove(ServletRequestAttributeEvent event)方法:当有对象从request范围在移除时,通知正在收听的对象。

3.servlet3.0的新特性

1.新增注释

  • @WebServlet

    eg:@WebServlet(name=”saveSErvlet” urlPatterns=”/SaveServlet”)

  • @WebFilter

    eg:@WebFilter(filterName=”char”,urlPatterns=”/*”)

  • @WebListener

    eg:@WebListener(“This is only a demo listener”)

  • @WebInitParam

    eg:@WebServlet(urlPatterns=”/simple”,name=”SimpleServlet”,

    initParam={@WebInitParam(name=”username”,value=”tom”)})

2.对文件上传的支持

实现文件上传需要实现两件事:

需要添加@MultipartConfig注释

从request对象中获取Part文件对象

3.异步处理

在servlet3.0之前,一个servlet的工作流程是:首先,servlet接收到请求后,需要对请求携带的数据进行一些预处理。接着调用业务接口的某些方法,以完成业务处理。最后,根据处理的结果提交响应。

现在通过servlet3.0的异步处理机制可以将处理流程调整为以下流程:首先,servlet接收到请求后,需要对请求携带的数据进行一些预处理。接着servlet线程将请求转交给异步线程来执行业务处理,线程本身返回至容器。

这样,Servlet线程不在一直处于阻塞状态以等待业务逻辑的处理,而是启动异步后可以立即返回。

异步处理机制可应用于servlet和过滤器两种组件。@WebServlet和@WebFilter注释提供了asyncSupported属性,默认该属性的取值为false,要启动异步处理支持,只需将属性设置为true即可。