“每天都要抽出兩個小時來學習技術!”
(以前也用過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容器結合的過于緊密阻礙了他的測試性和靈活性