使用过滤器解决中文乱码问题
关键步骤如下
- 建立实现 Filtr 接口
- 编写实现过滤的方法、
- 在 web.xml 文件中配置过滤器
5.2.1 认识过滤器组件
在之前的 JSP 中,为了解决乱码的显示,都是采用对页面进行重新编码的方式。当
一个Web 项目中有很多页面都需要进行显示控制时,使用过滤器则可以极大地提高控制
效果,同时也降低了开发成本,提高了工作效率。
1.过滤器简介
(1)过滤器
过滤器是向 Web 应用程序的请求和响应添加过滤功能的组件。它看在原始数据
与目标之间进行过滤,就像一个水处理装置,可以将水源中的杂质、污垢过滤掉,输出
符合要求的净水。
对于 Web 应用程序而言,过滤器能够实现对客户端与目标资源之间交互信息的
筛选和过滤,最终保留有效的数据信息。其运行原理如图 5.5 所示。
过滤器的工作原理,包括以下几个步骤。
- 用户访问 web 资源时,发送的请求会先经过过滤器。
- 由过滤器对请求数据进行过滤处理。
- 经过过滤的请求数据被发送至目标资源进行处理。
- 目标资源处理后的响应被发送到过滤器。
- 经过过滤器的处理后,将响应返回给客户端。
(2) 过滤器链
可以在 Web 应用中部署多个过滤器,每一个过滤器具有特定的操作和功能,这些
过滤器组合在一起成为过滤器链。在请求资源时,过滤器链中的过滤器将会依次对请求
进行处理,并逐一将请求向下传递,直到最总的 Web 资源。同理,在返回响应时,也
会通过过滤器链逐一进行处理,并最终返回给客户端。
如果在 Web 应用中存在过滤器链,那么配置文件中也会存在相应的多个配置,在
执行时,按照配置文件中过滤器的顺序,逐一进行过滤。
(3)过滤器的应用场合
在实际应用开发中,过滤器主要用于以下场合。
- 对请求和响应进行统一处理。
- 对请求进行日志记录和审核。
- 对数据进行屏蔽和替换。
- 对数据进行加密和解密。
2.过滤器的生命周期
与 Servlet 一样,过滤器也存在生命周期,也包含相应的方法。
1)实例化。 访问 Web 资源之前, Web 容器负责创建过滤器的实列来完成过滤器的
实例化的工作,并且实例化操作仅需做一次。
2)初始化。在进行过滤工作前会调用 init() 方法来实现初始化操作。 注意,初始化
操作也仅执行一次。
3)执行过滤。执行过滤操作,就是调用 doFilter() 方法来实现过滤器的特定功能,可
以对请求和响应分别进行处理。在过滤器的有效期内,doFilter() 方法可以被反复地调用。
4)销毁。 与 Servlet 相同,销毁过滤器也需要由 Web 容器调用其 destroy() 方法,
通过调用 destory() 方法实现将过滤器所占用的资源进行释放。
5.2.2 过滤器组件的开发和使用
1. 开发过滤器的步骤
过滤器的开发主要包括 4 个步骤。
1)创建实现 Filter 接口的类。
2)在 doFiler() 中编写实现过滤的方法。
3)调用下一个过滤器或者 Web 资源。
4)在 Web.xml 文件中配置过滤器。
2. Filter 接口
实现过滤器的过程与实现 Servlet 有些类似。在开发过滤器时,需要实现 Filter 接口,
这个接口存在于 javax.servlet 包中。
Filter 接口定义了 3 个方法, 如表 5-6 所示。
提示
Filter 接口没有相应的实现类进行继承,所以在编写过滤器时,必须实现
Filter 接口。
方法 | 说明 |
---|---|
void init (FilterConfig filterConfig) | Web 容器调用该方法实现过滤器的初始化 |
void doFilter(ServletRequest request,Servlet-Response response,FilterChain chain) | doFilter()方法。在该方法中,可以对请求和响应进行处理,实现过滤功能 |
void destroy() | Web 容器调用该方法,造成过滤器失效 |
示例4
编写过滤器,实现字符编码的设置。
分析如下。
过滤器在实际的开发过程中,以类的形式存在,同时还必须实现Filter 接口,然后
在 doFilter() 方法内编写设置字符编码的语句。
关键代码:
public class CharacterEncondingFilter implements Filter{
……
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
//设置请求时的编码方式
request.setCharacterEncoding("UTF-8");
//设置响应时的编码格式
reponse.setCharacterEncoding("UTF-8");
//调用 Web 资源,也可以调用其他过滤器
chain.doFilter(request,response);
}
……
}
3.过滤器的配置
为了实现过滤器功能,需要对 Web 应用中的 Web.xml 文件进行配置,配置的方式与
Servlet 也非常类似。配置的过程包括以下两步。
(1)在 Web.xml 文件中添加 <filter> 元素,用于设置过滤器的名称,以及过滤器的
完全限定名。
(2)添加<filter-mapping> 元素,其中 <filter-name> 元素必须与 <filter> 元素中的
设置相同。 <url-pattern> 元素则表示过滤器映射的 Web 资源。
与 Servlet 中的配置类似,在 Web.xml 中常用的 <url-pattem> 设置方法有以下 4 种形式。
- 精确匹配:<url-pattern>xxx</url-pattern>。
- 目录匹配:<url-pattern>/admin/*</url-pattern>。
- 扩展名匹配:<url-pattern>*.do</url-pattern>。
- 全部匹配:<url-pattern>/*<url-pattern>。
在匹配时会首先查找精确匹配,如果找不到,再找目录匹配,然后是扩展名匹配,
最后时全部匹配。配置过滤器的代码如 示例5 所示。
示例5
在配置文件中进行过滤器设置。
分析如下。
过滤器需要在 web.xml 文件中 进行配置,配置完毕后,系统就会自动调用相应的过
滤器执行过滤功能。
关键代码:
<filter>
<display-name>CharacterEncodingFilter</display-name>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kgc.news.web.filter.CharacterEncodingFilter</filter-class>
<filter>
<filter-mapping>
<filter-name>CharacterEcodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器的使用项目与数据库脚本
过滤器的使用,资源包括,JDBC三层项目,以及数据库脚本,学生信息管理系统,重点掌握过滤器的使用。此项目为过滤器讲解素材。
项目演示:……