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"); }
在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。