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