“每天都要抽出兩個(gè)小時(shí)來(lái)學(xué)習(xí)技術(shù)!”
(以前也用過(guò)filter,但是一直沒(méi)有花時(shí)間來(lái)好好了解一下,這次花點(diǎn)時(shí)間研究一下)
Filter是在web容器中配置的一種算是“攔截器”吧,記得有技術(shù)上看似非常難以解決的問(wèn)題都可以用Filter來(lái)解決。但是此“攔截”相對(duì)于spring的AOP,存在的意思有在那里?spring中的AOP只是對(duì)一個(gè)pojo的包裝和“攔截”,本身也是在web容器中的,它所“攔截”的范圍就有一定的限制,注定沒(méi)有filter功能強(qiáng)大。Filter盡管功能強(qiáng)大,但是由于本身也是捆綁在web容器中,也有自己的局限吧。
Filter有三個(gè)函數(shù),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肯定就是一個(gè)初始化函數(shù)了,只不過(guò)對(duì)于FilterConfig 的了解還不是太多。在官方的J2EETutorial中看到對(duì)Filter的定義A filter is an object that can transform the header and content (or both) of a
request or response.看起來(lái)Filter所能做的事情還非常多,它還能夠?qū)τ谌魏蝫eb資源進(jìn)行攔截(在這點(diǎn)上面肯定就比spring的要強(qiáng)大了)。
下面就要花時(shí)間看看這三個(gè)函數(shù)了
1 初始化函數(shù)
web容器傳進(jìn)來(lái)一個(gè)FilterConfig 參數(shù),看來(lái)這個(gè)參數(shù)還比較重要,類似與作一些初始化的工作了什么的,不在主要的討論范圍之內(nèi)
2 構(gòu)析函數(shù)
就是那個(gè)destroy()函數(shù)了,幸好filter里面不會(huì)出現(xiàn)太多的關(guān)于資源分配的東西,這個(gè)函數(shù)的用處也不會(huì)是太大
3 boss出場(chǎng) 拉拉拉拉
就是整個(gè)doFilter()函數(shù)了。從前看Webwork還有spring的資料,這兩個(gè)框架里面很多所謂的AOP就是一些嵌套在某個(gè)pojo上面的一個(gè)“套子”而已,對(duì)pojo傳進(jìn)和傳出的數(shù)據(jù)進(jìn)行解釋和處理,僅此而已,所以當(dāng)我看到filter的定義的時(shí)候覺(jué)得如此的親切。但是不同的filter的范圍也不相同決定了不同的用處。比如spring的filter設(shè)計(jì)的精巧,作為pojo的一些關(guān)鍵部分的處理就很不錯(cuò),比如事務(wù)管理,但是也有很多的問(wèn)題在spring或者webwork的filter的管理范圍之外,比如hibernate中很煩人的open session in view,感覺(jué)如果不用filter的話,真是沒(méi)有辦法處理這個(gè)問(wèn)題了,甚至?xí)C(jī)hibernate的普及。很簡(jiǎn)單,因?yàn)镕ilter跟web容器和servlet的結(jié)合是如此的緊密,所以只有他才能處理這些問(wèn)題,但是這也就是他的弊端,跟web容器結(jié)合的過(guò)于緊密阻礙了他的測(cè)試性和靈活性