1.Filter是什么
Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
2.字符Filter的意义所在
在知道Filter的概念以后,就举个实例说明一下Filter的意义所在。字符Filter,主要作用就是设置字符编码。
在没有使用Filter之前,我们所写的jsp里都会有这么一句话:request.setCharacterEncoding("GB18030");这样就可以解决页面上中文乱码问题。但是这么去写,如果我有100个jsp,我就需要写100遍,最要命的是当要更改字符编码时我就得找到100处地方去修改。这样的程序扩展性很差。其实,想想也挺头疼的。我们可以参考一下图:
如果我们把传统的从一层调到另一层的方法这样的形式叫纵向形式,那么我可以说Filter是横向切入。就像在一条河中间修建了一个闸门一样。而且字符设置跟实际的业务逻辑一点都没有关系。我们完全可以把它写在Filter中,实现同样的功能。我们再看一张图,使用了Filter以后:
对比这两图,很容易了解到Filter怎么使用。值得强调地一点就是我们可以再中间添加N个Filter.采用职责链模式串联起来,实现一系列的过滤。
3.实例代码
Filter是一种声明式服务,我们写好SetCharacterFilter类(需继承Filter类)以后,在doFilter方法中写好实现,然后在配置文件中声明哪些文件需要过滤r就可以了。程序启动后会自动实例化Filter类,若设置了init-param参数,可通过FilterConfig这个类方法取到参数。具体代码如下:
Filter类代码:
/**
* 采用Filter统一处理字符集
* @author wyj
*
*/
public class CharsetEncodingFilter implements Filter {
private String encoding;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//设置字符集
arg0.setCharacterEncoding(encoding);
//继续执行
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
this.encoding = arg0.getInitParameter("encoding");
System.out.println("CharsetEncodingFilter.init()-->> endcoding=" + encoding);
}
}
配置文件:web.xml
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.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>
这样改变以后,想要修改直接修改配置文件就好了。4.总结
Filter是一种切入式技术,体会到了AOP编程的思路。
Filter是对request和response的拦截,并且只对post提交起作用。
Filter是一种声明式服务,使得程序扩展灵活。