上篇已经介绍过滤器的概念,现在我们写在WEB开发中是如何编写和部署过滤器。
在此我们编写一个编码过滤器。
在JSP页面中,为了防止写入数据库和显示乱码,通常我们一般情况调用request的方法request.setCharacterEncoding("GB18030");这种办法的确可行,但是每个页面都涉及到编码问题,因为我们不得不每个页面都写这句话。重复的代码肯定有弊端,所以我们要进一步改进。此时使用编码过滤器来进行改造,统一设置字符集问题。
编码过滤器要实现javax.servlet.Filter接口。
package com.bjpowernode.drp.util.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 统一设置字符集
* @author: 梁焕月
* 文件名:CharsetEncodingFilter.java
* 时间:2011-12-20下午8:29:56
*/
public class CharsetEncodingFilter implements Filter {
public void destroy() {}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
//设置字符集
servletRequest.setCharacterEncoding("GB18030");
filterChain.doFilter(servletRequest, servletResponse);}
public void init(FilterConfig filterConfig) throws ServletException {}
}
其中要重写init方法,doFilter方法,destroy方法。其中init方法只执行一次,跟servlet一样。但是servlet执行是在在地址栏输入url时生成,而Filter则是在tomcat一启动则生成。
编写filter后,需要在配置文件web.xml中部署,这个filter类不是我们人为调用执行,而是由tomcat执行,跟servlet一样。
其中在WEB开发运行jsp页面执行的顺序是:
在客户端请求传递到servlet之前,过滤器可以修改该请求request。
在用户的响应从servlet返回到客户端之前,过滤器可以修改该响应Response
(jsp其实就是sevlet)
然后部署过滤器,在web.xml中:
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>
com.bjpowernode.drp.util.filter.CharsetEncodingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
在过滤器中的doFilter方法中设置编码方式不妥,servletRequest.setCharacterEncoding("GB18030");若是编码改成GB2312,则会修改这个过滤器类,这样违背了开闭原则。进一步改造中……
把变量设置放在web.xml文件中,部署时设置初始参数,则web.xml中:
<filter> <filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB18030</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
然后再过滤器类CharsetEncodingFilter中获得初始化参数的值,通过FilterConfig对象获得初始化参数的值。则过滤器类CharsetEncodingFilter类的改进如下:
public class CharsetEncodingFilter implements Filter {
//设置成员变量用来获得字符集变量
private String encoding;
public void destroy() {}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
//设置字符集
//servletRequest.setCharacterEncoding("GB18030");
servletRequest.setCharacterEncoding(encoding);
filterChain.doFilter(servletRequest, servletResponse);
}
public void init(FilterConfig filterConfig) throws ServletException {
//取得配置文件中的初始化参数
this.encoding= filterConfig.getInitParameter("encoding");
System.out.println(encoding);
}
}
通过过滤器来解决统一字符集的问题。并且通过这个例子也讲述了如何编写过滤器和部署过滤器。过滤器的功能已经知道,那么如何解决应该是没问题了。