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