首页 > 代码库 > JAVA学习之 浅析Filter

JAVA学习之 浅析Filter

      上一篇博客了解了Servlet,这次就来了解一下Filter,简单来说FilterServlet规范的一种技术,并不是一个Servlet。它也称为一个过滤器,用来改变一个request和修改一个response,能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response

     一、生命周期

     上一篇也写到的Servlet的生命周期,FilterServlet类似:

       1、启动服务器时加载Filter的实例,并调用Init()方法来初始化实例;(Filter的实例先于Servlet

       2、每次请求时都只调用方法doFilter()进行处理

       3、停止服务器时调用destroy()方法,销毁实例;(销毁实例晚于Servlet

  Filter实现javax.servlet包的Filter接口,包括方法:init(),doFilte(),destroy()

      二、如何使用Filter

      下面以添加用户为例,对比使用前后的差别:

        1、不使用Filter    

       

           2、使用Filter

          

 

     对比一下使用Filter给我们带来的便利:我们知道一个系统不可能只有添加用户功能,我们还有删除用户,修改用户等等很多需要实现的功能,然而设置字符集是每个功能都需要进行的,如果没有Filter,我们每一个页面都要进行设置字符集的操作,我们将设置字符集的方法写在doFilter中,在request之后记性拦截,每个jsp页面都能实现对字符集的设置。下面我们来看一个filter是如何实现这个功能的:

   

packagecom.tgb.drp.util.filter;
 
importjava.io.IOException;
 
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
/**
 * 采用Filter统一处理字符集
 * @author YoungJong
 *
 */
public classCharsetEncodingFilter implements Filter {
     private String encoding;
/**
 * 销毁方法
 */
publicvoid destroy() {
//TODO Auto-generated method stub
 
}
 
/**
 * 实现doFilter
 */
publicvoid doFilter(ServletRequest request, ServletResponse response,
FilterChainchain) throws IOException, ServletException {
 
 
//设置字符集
        request.setCharacterEncoding("GB18030");
        //继续执行 
         chain.doFilter(request,response);
      
}
 
/**
 * 初始化方法
 */
publicvoid init(FilterConfig filterConfig) throws ServletException {
//TODO Auto-generated method stub
       this.encoding=filterConfig.getInitParameter("encoding");
       System.out.println("CharsetEncodingFilter.init()-->>endcoding=" + encoding);
        }
 
}

当然我们还需要再web.xml中进行配置:

 

<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.tgb.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>
 

三、与servlet的对比:

     servlet相同的是,他们都需要实现接口,但是Filter实现的是Filter,而Servlet实现的则是HttpServlet,他们都需要在web.xml中进行配置,然而他们最大的不相同就是他们的作用:

    1.Servlet是:主要是处理客户端的请求并将其结果发送到客户端。

    2.Filter是:在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。在HttpServletResponse到达客户端之前,拦截HttpServletResponse。主要是进行拦截,做相应的处理后再传递。

 

         差不多就这些内容,不过就这样戛然而止不太好吧?!所以做个小结:看视频中有这种说法:Filter体现一种模式职责链模式;Servlet体现了一种模式模板方法模式。关于Filter体现一种职责链还能够理解,但是对于Serlet体现一种模板方法还是没办法参透。。默默地哀伤中。。