/*
问:
1.先执行doFilter还是init
2.init()里面参数是从什么地方传过来的
3.FilterChain这个类起什么作用呢
4.在web.xml配置文件时没有这个ignor属性(还是参数),在这里用不会有问题吗?
5.大家再帮分析一下下面程序的注释
*/
public class SetEncoding implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;

public void destroy() {
this.encoding = null;
this.filterConfig = null;
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);  //调用selectEncoding()方法的时候,encoding应该为null值是吗
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);     //什么意思呢?
} public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("encode filter success");
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
} protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}

解决方案 »

  1.   

    String encoding = selectEncoding(request);
    protected String selectEncoding(ServletRequest request) {
    return (this.encoding);//这个时候this.encoding是null还是什么值?
    }
      

  2.   

    1.先执行一次init,以后每次执行时执行doFilter();
    2.init()参数从web.xml中传过来
    3.FilterChain是过滤链,可以串联多个过滤器。
    4.没有设置所以才有了一下这段:
    String value = filterConfig.getInitParameter("ignore");
    if (value == null)
      this.ignore = true;
    else if (value.equalsIgnoreCase("true"))
      this.ignore = true;
    else if (value.equalsIgnoreCase("yes"))
      this.ignore = true;
    else
      this.ignore = false;
    说明ignore默认是true。
    5.String encoding = selectEncoding(request);  //调用selectEncoding()方法的时候,encoding应该为null值是吗
    可以是null,也可以是字符集的名称。chain.doFilter(request, response);     //什么意思呢?
    过滤执行就是这一行,可以认为是一种格式。
      

  3.   

    <filter>
    <filter-name>encode</filter-name>
    <filter-class>
    cn.com.victorysoft.sys.platform.SetEncoding
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>encode</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>2.init()参数从web.xml中传过来,,,,,,在web.xml配置文件中哪个是它的参数呢?
    4.没有设置所以才有了一下这段:
    String value = filterConfig.getInitParameter("ignore");
    if (value == null)
      this.ignore = true;
    else if (value.equalsIgnoreCase("true"))
      this.ignore = true;
    else if (value.equalsIgnoreCase("yes"))
      this.ignore = true;
    else
      this.ignore = false;
    说明ignore默认是true。
    既然没有设置它,那不要这段不就行了吗?最后还是给它一个TURE,不多余吗?
    5.String encoding = selectEncoding(request);  //调用selectEncoding()方法的时候,encoding应该为null值是吗
    可以是null,也可以是字符集的名称。
    总不能是同时是NULL,同时又是字符集的名称吧?
    那么在什么情况下是NULL,什么情况下是字符集的名称呢?
      

  4.   

    就是更具你的url配置,满足你要求的url多会走一下这个filter