“每天都要抽出两个小时来学习技术!”
(以前也用过filter,但是一直没有花时间来好好了解一下,这次花点时间研究一下)
Filter是在web容器中配置的一种算是“拦截器”吧,记得有技术上看似非常难以解决的问题都可以用Filter来解决。但是此“拦截”相对于spring的AOP,存在的意思有在那里?spring中的AOP只是对一个pojo的包装和“拦截”,本身也是在web容器中的,它所“拦截”的范围就有一定的限制,注定没有filter功能强大。Filter尽管功能强大,但是由于本身也是捆绑在web容器中,也有自己的局限吧。
Filter有三个函数,implments了filter的接口:
public void destroy()
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws IOException, ServletException
public void init(FilterConfig config) throws ServletException
不难看出,init肯定就是一个初始化函数了,只不过对于FilterConfig 的了解还不是太多。在官方的J2EETutorial中看到对Filter的定义A filter is an object that can transform the header and content (or both) of a
request or response.看起来Filter所能做的事情还非常多,它还能够对于任何web资源进行拦截(在这点上面肯定就比spring的要强大了)。
下面就要花时间看看这三个函数了
1 初始化函数
web容器传进来一个FilterConfig 参数,看来这个参数还比较重要,类似与作一些初始化的工作了什么的,不在主要的讨论范围之内
2 构析函数
就是那个destroy()函数了,幸好filter里面不会出现太多的关于资源分配的东西,这个函数的用处也不会是太大
3 boss出场 拉拉拉拉
就是整个doFilter()函数了。从前看Webwork还有spring的资料,这两个框架里面很多所谓的AOP就是一些嵌套在某个pojo上面的一个“套子”而已,对pojo传进和传出的数据进行解释和处理,仅此而已,所以当我看到filter的定义的时候觉得如此的亲切。但是不同的filter的范围也不相同决定了不同的用处。比如spring的filter设计的精巧,作为pojo的一些关键部分的处理就很不错,比如事务管理,但是也有很多的问题在spring或者webwork的filter的管理范围之外,比如hibernate中很烦人的open session in view,感觉如果不用filter的话,真是没有办法处理这个问题了,甚至会危机hibernate的普及。很简单,因为Filter跟web容器和servlet的结合是如此的紧密,所以只有他才能处理这些问题,但是这也就是他的弊端,跟web容器结合的过于紧密阻碍了他的测试性和灵活性