采用Filter统一控制字符集

        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。


你可能感兴趣的:(tomcat,jsp,xml,servlet,filter,encoding)