欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-18 14:42:33
过滤器和监听器 Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,监听器可以监听到Web应用程序启动和关闭。创建监听器需要实现...

过滤器和监听器

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

Servlet过滤器

1.什么是过滤器

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

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

2.过滤器核心对象

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

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的配置如下:

MyFilter

com.zgy.filter.Myfilter

MyFilter

/MyFilter

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

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

PS:标签中的可以是自定义的名称,标签中的是指定的已定义的过滤器名称,他需要与标签中的一一对应


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