Filter 技术是servlet 2.3 新增加的功能。在Java Web的开发中中,在客户端与tomcat交互中,tomcat服务器端request.getParameter()取得的参数默认的是iso8859-1的编码格式。
在界面的编码设置中,在tomcat中获得的也是乱码。所以Tomcat在每次获取参数时都应该进行编码转换。具体的两个方法为request.setCharacterEncoding和response.setCharacterEncoding()。这两个方法会使得获得的参数和返回的结果的编码一致。这样就可以控制编码问题了。
但是这样做的一个缺点就是重复量太大,如果有大量的JSP和Servlet,就会产生大量的重复代码。而且不好控制,产生不一致等问题。
Filter的出现解决了这个问题,它使用户可以改变一个request和修改一个response。Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。Filter只对post请求起作用。
下面看一下Filter使用的具体方法:
首先:Filter是在Tomcat启动的时候New的,而且只New一次,不会重复。当请求相关的JSP时,就会自动调用Filter。
实现Filter,首先新建一个类,然后实现Filter接口。它有三个方法,init(),doFilter(),destory()。
public void init(FilterConfig filterConfig) throws ServletException {
this.endcoding = filterConfig.getInitParameter("encoding");
}
使用Filter为了达到灵活效果,还是使用XML配置文件,而不是写死在代码里。所以要配置XML文件。
在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>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
通过init()方法中的filterConfig对象可以取得xml中的配置信息。其中的路径类型按照上面的格式,如果已经写成<url-pattern>*.jsp</url-pattern>格式,在配置下面的时候就不能写成<url-pattern>/servlet/*.jsp</url-pattern>,会和上面的配置产生冲突。
在doFilter()方法中:
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
//System.out.println("CharsetEncodingFilter--->>>begin");
//设置字符集
request.setCharacterEncoding(endcoding);
//继续执行
chain.doFilter(request, response);
//System.out.println("CharsetEncodingFilter--->>>end");
}
可以设置具体的编码,chain.doFilter(request,response);的作用就是继续调用下面的JSP。