JSPCN主页 | JSP空间 | 网站制作 | JSP下载 | JSP论坛 | JSP教程 | 关于JSPCN | 联系我们
JSP虚拟主机,jsp空间,java空间,java虚拟空间,详细请点击进入
做最专业的JSP中文网站 当前位置首页--JAVA技术--Servlet  
文章搜索:
关键字 标题
  
JSP中文网内容管理系统(JCMS)
JSP虚拟主机
网络笔记本
网摘,图片,笔记收藏
虚拟服务器

JSPCN文章目录分类
JSP配置[219]JSP基础[136]
中文问题[69]上传问题[27]
JAVABEAN[46]数据库[212]
文件操作[126]图片声音[17]
JSP其他[57]时间相关[16]
JAVAMAIL[72]STRUTS[144]
开发工具[28]教程系列[157]
JSP实例[89]
JAVA基础[421]APPLET[78]
JAVA网络[179]Applica[115]
Servlet[98]XML[163]
J2ME[257]J2EE[374]
考试相关[63]JAVA线程[90]
EJB[261]Swing[26]
Java API[141]声音图片[28]
异常处理[33]JAVA实例[290]
JAVA类[139]SUN[89]
Hibernate[6]JMX[8]
Spring[34]
本版推荐文章 
本版热点文章 
相关文章链接 
 
编写 Servlet 2.3 Filter (一)
作者:     文章来源:
访问次数:175次     加入时间:2007年03月20日
翻译作者:fajaven
英文作者:Stephanie Fesler                05/10/2001
原文出处:http://www.onjava.com/pub/a/onjava/2001/05/10/servlet_filters.html

译者注:2.3规范2000年10月份出来,时间比较长了。最近的是2.4规范,今年7月份推出,本人也将于近期翻译这样一篇文章。翻译这篇文章的主要目的是学习Filter特性。

简介:这篇文章是一个系列文章中的第三篇,这个系列专注于探讨 Servlet 2.3 API 规范中新的特性。第一篇大致地介绍Servlets的概念以及2.3规范中的新特性:应用的生命周期(lifecycle)与过滤器(Filter)。第二篇文章深入地介绍了编写与使用应用程序生命周期事件。请查阅这些文章得到更详细的信息。本文涉及到怎么样在你的web应用中编写怀使用Filter,包括一个简单的Filter例子,配置Filter chain,在Filter中使用初始经变量,传递用户的请求,以及 loggin 统计。

Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。

Filters 有许多的应用场合。Servlet 2.3 规范建议如下的地方可以应用Filter:

        authentication filters         
        logging and auditing filters
        image conversion filters
        data compression filters
        encryption filters
        tokenizing filters
        filters that trigger resource access events
        XSL/T filters that transform XML content
        MIME-type chain filters


编写一个简单的 Filter

学习怎么样写Filter的第一步,是看一个非常简单的实例。Filter 是一个实现了 javax.servlet.Filter 接口的类。javax.servlet.Filter 接口定义了三个方法:

public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) 
public FilterConfig getFilterConfig()
public void setFilterConfig (FilterConfig filterConfig)


  创建 javax.servlet.FilterConfig 对象,并完成初始化后传递给 Filter ,是容器的职责。javax.servlet.FilterConfig 可以被用来:

提取 Filter name(在配置描述符中定义的)
提取初始化变量(在配置描述符中定义的)
得到 ServletContext 对象的引用

  setFilterConfig() 方法可以被用来设置一个对象为某个 Filter 的属性。doFilter() 方法实际上真正要进行 filter 动作的地方。在这里,你可以解析用户的请求,记录统计到文件,处理返回客户端的响应,等等。列表1是一人非常简单的例子,当它 filter 客户端请求时,打印一个消息到控制台;然后当它 filter 一个返回客户端的响应时再打印一个消息到控制台。图1是一个示例这个简单的 Filter 怎样处理请求-响应模型的图表。




列表1: 一个非常简单的 Filter (SimpleFilter.java)

package com.filters;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import java.io.IOException;
import javax.servlet.ServletException;

public class SimpleFilter implements Filter
{
  private FilterConfig filterConfig;

  public void doFilter (ServletRequest request,
             ServletResponse response,
             FilterChain chain)
  {

    try
    {
      System.out.print ("Within Simple Filter ... ");
      System.out.println ("Filtering the Request ...");

      chain.doFilter (request, response);

      System.out.print ("Within Simple Filter ... ");
      System.out.println ("Filtering the Response ...");

    } catch (IOException io) {
      System.out.println ("IOException raised in SimpleFilter");
    } catch (ServletException se) {
      System.out.println ("ServletException raised in SimpleFilter");
    }
  }

  public FilterConfig getFilterConfig()
  {
    return this.filterConfig;
  }

  public void setFilterConfig (FilterConfig filterConfig)
  {
    this.filterConfig = filterConfig;
  }
}


以上的代码中可以看出,这个 Filter 是一个名为 SimpleFilter.java 类,它实现了 javax.servlet.Filter 接口,并提供了这个接口中三个方法的实现。

注意,doFilter 可以分为二个部分:filter request 与 filter response 。这二部分由 javax.servlet.FilterChain 对象调用 chain 中的下一个对象来隔开,这下一个对象可能是一个 Servlet 或者另外的一个 Filter 。

现在,我们写好了这样的一个简单的 Filter ,需要把它配置到一个容器中,看看运行结果。

Apache Jatarka Tomcat,4.0 以上版本都支持 Servlet 2.3 规范。本文所有的实例都在此环境下测试通过。

Filters 定义在web应用描述符中,即 web.xml 文件。Filters 先被定义,然后映射(map)到 Servlet 或者 URL ,这与 Servlet 的定义与映射是完全一样的。列表2是 web.xml 文件中,配置 SimpleFilter.java ,并映射(map)到一个 Servlet 。

Listing 2: web.xml

<?xml version = "1.0" encoding = "ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web-app>
  <!-- Define the filters within the Web Application -->
  <filter>
    <filter-name>
      Simple Filter Example
    </filter-name>
    <filter-class>
      com.filters.SimpleFilter
    </filter-class>
  </filter>
  <!-- Map the filter to a Servlet or URL -->
  <filter-mapping>
    <filter-name>
      Simple Filter Example
    </filter-name>
    <url-pattern>
      /simple
    </url-pattern>
  </filter-mapping>
  <!-- Define the Servlets within the Web Application -->
  <servlet>
    <servlet-name>
      Simple Servlet
    </servlet-name>
    <servlet-class>
      com.servlets.SimpleServlet
    </servlet-class>
  </servlet>
  <!-- Define Servlet mappings to urls -->
  <servlet-mapping>
    <servlet-name>
      Simple Servlet
    </servlet-name>
    <url-pattern>
      /simple
    </url-pattern>
  </servlet-mapping>
</web-app>

图2显示是这个web应用运行时,Tomcat 服务器的控制台输出。




JSP虚拟主机 | JSP空间 | JSP主机 | JSP双线虚拟主机 | JAVA空间 | JAVA虚拟主机 | 虚拟服务器 | JSP 虚拟服务器 | VPS
Virtual Private Server | JAVA虚拟服务器 | VM服务器 | VHOST | 虚拟操作系统 | JSP论坛 | JAVA论坛 | JSP站点论坛
Copyright © 2002-2005 JSPCN.net. All rights reserved.
JSP中文网    备案序号:蜀ICP备05001583号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号