JAVA学习之 浅析Filter

来源:互联网 发布:微软 azure认证 知乎 编辑:程序博客网 时间:2024/05/22 05:02

      上一篇博客了解了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体现一种模板方法还是没办法参透。。默默地哀伤中。。

1 0
原创粉丝点击