在 Java Web 项目的开发中,过滤器的应用十分广泛,其中比较典型的应用就是字符编码过滤器。由于 Java 程序可以在多种平台下运行,其内部使用 Unicode 字符集来表示字符,所以处理中文数据会产生乱码情况,需要对其进行编码转换才可以正常显示。
(1)创建字符编码过滤器类 CharacterEncodingFilter,此类实现了 Filter 接口,并对其3个方法进行了实现。代码如下:
/**
* 这是一个字符编码的过滤器
* @author ph
*/
public class CharacterEncodingFilter implements Filter {
//字符编码初始化
protected String encoding = null;
//FilterConfig 对象
protected FilterConfig filterConfig = null;
//初始化方法
public void init(FilterConfig filterconfig) throws ServletException {
//对 filterConfig 赋值
this.filterConfig = filterconfig;
//对初始化参数赋值
this.encoding = filterconfig.getInitParameter("encoding");
}
//过滤器处理方法
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
//判断字符编码是否有效
if(encoding != null) {
//设置 request 字符编码
servletrequest.setCharacterEncoding(encoding);
//设置 response 字符编码
servletresponse.setContentType("text/html;charset=" + encoding);
}
//传递给下一个过过滤器
filterchain.doFilter(servletrequest, servletresponse);
}
//销毁方法
public void destroy() {
//释放资源
this.encoding = null;
this.filterConfig = null;
}
}
CharacterEncodingFilter 类的 init() 方法用于读取过滤器的初始化参数,这个参数(encoding)为此例中所用到的字符编码;在 doFilter() 方法中,分别将 request 对象及 response 对象中的编码格式设置为读取到的编码格式;最后在destroy() 方法中将其属性设置为 null,将被 Java 垃圾回收器回收。
(2)在 web.xml 文件中,对过滤器进行配置。代码如下:
<!-- 声明字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.ph.util.CharacterEncodingFilter</filter-class>
<!-- 设置初始化 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- 映射字符编码过滤器 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 与所有请求进行关联 -->
<url-pattern>/*</url-pattern>
<!-- dispatcher用于指定过滤器对应的请求方式 -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
附上 dispatcher 的可选值及说明
可选值 | 说明 |
REQUEST | 当客户端直接请求时,通过过滤器进行处理 |
INCLUDE | 当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理 |
FORWARD | 当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理 |
ERROR | 当声明式异常产生时,通过过滤器进行处理 |
(3)通过请求对过滤器进行验证,使用表单向 Servlet 发送中文信息进行测试,其中表单信息放置在 index.jsp 页面中。代码如下:
<p>请输入您的姓名:<input type="text" name="name"/></p>
<input type="submit" value="提交"/>
这一请求由 Servlet 对象 MyServlet 类进行处理,此类使用 doPost() 方法接收表单请求,并将表单中的 name 属性输出到页面中。代码如下:
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
//获取表单参数
String name = req.getParameter("name");
if(name!=null && !name.isEmpty()) {
out.print("您好 " + name);
out.print(",<br/>欢迎来到我的主页。");
} else {
out.print("请输入您的中文名字!");
}
out.print("<br/><a href='index.jsp'>返回</a>");
out.flush();
out.close();
}
实例运行结果:
1、输入前
2、过滤后效果
3、未过滤效果