在.NET中也曾介绍过关于Filter的使用。它是AOP思想的一个很重要的应用。同样在Java中同样也是支持filter的。在这里仅以温故的目的再总结一下filter的一些基础知识点。
1、.net mvc中有关filter的使用
http://blog.csdn.net/wangyy130/article/details/44241957
2、Java小例子
在DRP视频中用到了filter是关于JSP页面乱码问题,给每个页面设置编码格式,如果按照平常的书写习惯,需要在每个页面中都进行设置:request.setCharacterEncoding("UTF-8");
为了方便,省去重复的代码,这里用到了filter,具体代码如下:
public class CharsetEncodingFilter implements Filter { //这里要实现Filter这个父类
private String encoding;
/**
* 真正要执行的filter
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("CharsetEncodingFilter--->>begin");
//设置字符集
request.setCharacterEncoding(encoding);
//继续执行,这里用doFilter这个方法来保证继续执行JSP下面的代码
chain.doFilter(request, response);
}
/**
* 初始化操作,这里可以获取参数
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding=filterConfig.getInitParameter("encoding"); //获得初始化参数
System.out.println("CharsetEncodingFilter--->>init()"+encoding);
}
}
从上面代码中并不能真正实现filter来拦截所有的JSP进行设置编码格式。还需要有配置文件的设置,由配置文件提前声明filter拦截的对象。这样在执行的时候,只要符合要求的类或方法就会被拦截到filter中去执行响应的操作。
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>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
在这个xml文件中,拦截的对象是由url-pattern来指定的。这里的设置和servlet是一样的。只是servlet种配置的url-pattern指的是servlet对应的URL地址,而filter中则指的是要执行filter操作的类或方法。
三、总结
不难发现filter的使用应用了AOP思想,它可以拦截所有在url-pattern中所指定的内容,并且在这个拦截器中可以加入自己想要加入的操作或执行的方法。那么这样就为我们在项目中想要加入日志管理,权限管理提供了很大的方便。再者,之前在学习的过程中,还讨论过代理模式,关于代理模式,也是AOP思想的典型应用之一,可分为静态代理和动态代理。而在这里的filter的使用似乎类似于静态代理,但却可以灵活配置。动态代理更加灵活方便,可在运行时随时加载代理所想要委托的接口的方法,若与filter结合可能会发挥更大的功效,更深层次的应用还有待更深入的学习和探究!