首页 > 代码库 > JSP详细篇——Servlet过滤器和监听器

JSP详细篇——Servlet过滤器和监听器

过滤器和监听器

Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,监听器可以监听到Web应用程序启动和关闭。创建监听器需要实现响应的接口,并对其进行配置。

Servlet过滤器

1.什么是过滤器

Servlet过滤器与Servlet十分相似,但是它具有拦截客户端请求的功能。Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。对于程序开发人员来说,过滤器实质上就是在Web应用服务器上的一个Web应用组件,用于拦截客户端与目标资源之间的请求,并对这些请求进行过滤处理再发送给目标资源。

 

如果在一个Web应用中使用一个过滤器不能解决问题,可以部署多个过滤器对业务请求进行多次处理。这样就形成一个过滤器链,在Web容器处理过滤器链时,将按照过滤器的先后顺序对请求进行处理。

2.过滤器核心对象

 

过滤器对象放在javax.servlet包中,其名为Filter,它是一个接口,除了这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这两个对象也同样是接口,为位于javax.servlet包中,分别为过滤器的配置对象和过滤器的传递工具。在实际开发过程中,定义过滤器只要直接或间接的实现Filter接口即可。而FilterChainFilterConfig用于对过滤器的相关操作。

Filter接口

每一个过滤器都要直接或间接的实现Filter接口,在Filter接口中,定义了3个方法,分别为init(),doFilter(),destroy()。对应的方法说明如下:

方法声明

说明

public void init(FilterConfig filterConfig) throws ServlerException

过滤器初始化,该方法在过滤器初始化时调用

public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException

对请求进行过滤处理

public void destroy()

销毁方法,以便释放资源

 

FilterConfig接口

FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息。其方法说明如下:

方法声明

说明

Public String getFilterName()

用于获取过滤器的名字

Public ServletContext getServletContext()

获取Servlet上下文

Public String getInitParameter(String name)

获取过滤器的初始化参数的值

Public Enumeration getInitParameterNames()

获取过滤器所有的初始化参数

FilterChain接口

FilterChain接口也是由Servlet容器实现的,在这个接口中只有一个方法,其方法声明为:public void doFilter(ServletRuquest request,ServletResponse response) throws IOException,ServletException

该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器中的最后一个过滤器,那么,请求将传送给目标资源。

过滤器的创建与配置

创建也该过滤器需要实现javax.servlet.Filter接口,同时实现接口的3个方法。

范例:

package com.zgy.filter;

 

import java.io.IOException;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

 

public class MyFilter implements Filter {

 

@Override

public void destroy() {

// TODO Auto-generated method stub

 

}

 

@Override

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException {

// TODO Auto-generated method stub

 

}

 

@Override

public void init(FilterConfig arg0) throws ServletException {

// TODO Auto-generated method stub

 

}

 

}

使用过滤器不一定要将请求传递到下一个过滤器,如果业务逻辑需要,也可以在过滤器处理完后,直接回应客户端

 

创建名称为MyServlet的过滤对象,其web.xml的配置如下:

<filter>

<filter-name>MyFilter</filter-name>

<filter-class>com.zgy.filter.Myfilter</filter-class>

</filter>

<filter-mapping>

<filter-name>MyFilter</filter-name>

<url-pattern>/MyFilter</url-pattern>

</filter-mapping>

 

<filter>标签用于声明过滤对象,在这个标签中必须配置两个元素,分别为过滤器名称与过滤器完整类名,其中<filter-name>用于定义过滤器的名称,<filter-class>用于指定过滤器的完整类名

<filter-mapping>标签用于创建过滤器的映射,它的主要作用就是指定Web应用中,哪些URL应该用哪个过滤器进行处理。在<filter-mapping>标签中,需要指定过滤的名称和过滤的URL映射,其中,<filter-name>用于定义过滤器的名称,<url-pattern>用于指定过滤器应用的URL

PS<filter>标签中的<filter-name>可以是自定义的名称,<filter-mapping>标签中的<filter-name>是指定的已定义的过滤器名称,他需要与<filter>标签中的<filter-name>一一对应



JSP详细篇——Servlet过滤器和监听器