上一篇博客了解了Servlet,这次就来了解一下Filter,简单来说Filter是Servlet规范的一种技术,并不是一个Servlet。它也称为一个过滤器,用来改变一个request和修改一个response,能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。
一、生命周期
上一篇也写到的Servlet的生命周期,Filter与Servlet类似:
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体现一种模板方法还是没办法参透。。默默地哀伤中。。