拦截过滤器

本文介绍了过滤器在J2EE中的作用,即对请求、响应进行预处理和后处理。以Struts框架中常见的乱码问题为例,详细说明了如何使用过滤器解决。包括在部署描述符文件中定义过滤器参数,指定.do指向的内容,以及编写过滤器类设置页面字符集,避免在每个页面单独处理。

J2EE核心模式(第二版)中这样写道:使用拦截过滤器,作为一个可插拔式的过滤器,实现请求、响应的预处理和后处理。另有一个过滤器管理器,负责把各个处于松耦合关系的过滤器结合成一个链,并把控制依次委派给合适的过滤器。这样一来,不必改动现有代码就可能以各种方式加入、删除、合并这些过滤器。

可以说,上面这段话写得苦涩难懂,甚至容易给人误解,其实过滤器的作用就是你在载入一个页面(可能式jsp,或者servlet什么的)之前和之后,通过调用过滤器代码,来实现对现有代码的统一处理。下面我就用strutsstruts里面经常出现的乱码问题对此进行详细的描述。

我们在采用struts框架的时候,经常会发生页面出现乱码的情况,这里有几种处理方法,比如说在每个页面的头部都进行处理,定义字符集;有些人深圳给每个需要显示的字符串进行一次转化,这些都需要对每个页面进行处理,工作量是非常大的,而且每个页面的处理方式基本都一样,在这种情况下,其实我们就可以使用过滤器了。

首先,我们需要在部署描述符文件中定义过滤器的相关参数(部署描述符文件可以是在不同的文件,很多系统都用web.xml),如下

1:部署描述符文件-过滤器

<filter-mapping url-pattern='*.do' filter-name='PageFilter' />

<filter filter-name='PageFilter' filter-class='test.PageFilter' />

在上面这段语句中,定义了一个名为PageFilter的过滤器,它指向test.PageFilter.java这个类,当系统访问后缀名为.do的路径的时候(这里,.dostruts中常用的一种定义方法,一般是指向一个action类),就会调用这个过滤器了。

在这里,我们必须指定*.do所具体指向的内容

2:部署描述符文件-*.do

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

<servlet>

上面这段话说明,页面指向的.do其实是指向一个叫actionservlet的,而具体的action代表什么,如下

3:部署描述符文件-action的具体定义

<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>debug</param-name>

<param-value>0</param-value>

</init-param>

<init-param>

<param-name>detail</param-name>

<param-value>0</param-value>

</init-param>

<init-param>

<param-name>validate</param-name>

<param-value>true</param-value>

</init-param>

<load-on-startup>10</load-on-startup>

</servlet>

在这里,action指向了org.apache.struts.action.ActionServlet这个类,这是struts所默认指向的servlet类,其它参数不一一说明了。

下面,我们就要开始写过滤器的内容了。

4test.PageFilter.java

package test;

import javax.servlet.*;

import javax.servlet.http.*;

/**

* 各页面的统一处理:设置页面的字符集。

* 有了此函数后相关页面就不需要再设置字符集等信息了。

*/

public class PageFilter extends HttpServlet implements Filter

{

private static final String CONTENT_TYPE = "text/html; charset=gb2312";

private static final String ENCODING = "gb2312";

private FilterConfig config = null;

/**

* 初始化。

*/

public void init(FilterConfig filterConfig)

{

this.config = filterConfig;

}

/**

* 执行过滤。

*/

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

{

try

{

request.setCharacterEncoding(ENCODING);

response.setContentType(CONTENT_TYPE);

if (chain != null)

{

chain.doFilter(request,response);

}

}

catch (Exception e)

{

}

}

/**

* 返回过滤器配置信息。

*/

public FilterConfig getFilterConfig()

{

return this.config;

}

/**

* 设置过滤器配置信息。

*/

public void setFilterConfig(FilterConfig filterConfig)

{

this.config = filterConfig;

}

}

在上面这个类中,定义了一个名为doFilter的方法,当我们访问后缀名为do的路径的时候,系统就会自动先访问doFilter这里方法了,在这里,系统将页面的字符集定义为gb2312类型,这个,就不用在每个页面上面进行定义了。

上面是对过滤器使用的一些简单了应用,事实上,过滤器还可以定义多个,也可能存在其它很多方面的功能,这就需要大家一起研究探讨了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值