在JavaWeb程序的開(kāi)發(fā)中,配置Listener和Filter這兩個(gè)東西是必不可少的,我們之所以說(shuō)這兩個(gè)東西,主要原因是關(guān)于和過(guò)濾器是比較有難度的,相較于之前的來(lái)說(shuō)這個(gè)的難度在于xml文件的配置,只有這兩個(gè)東西掌握了之后,再學(xué)習(xí)相關(guān)的Java框架才會(huì)比較容易一些,他們都屬于Servlet中的高級(jí)技術(shù)。
Listener就是一個(gè)Java類用來(lái)其他的JavaBean的變化的配置。它的作用是負(fù)責(zé)web中的域?qū)ο?ServletContext、HttpSession、ServletRequest這三個(gè)對(duì)象,在Javaweb中,Listener的內(nèi)容主要是這三個(gè)對(duì)象的創(chuàng)建和銷毀他們分別是ServletContextListenner、ServletRequestListener、HttpSessionListener,這三對(duì)象屬性的變化他們分別是ServletContextAttributeListener、ServletRequestAttributeListener、HttpSessionAttributeListener,在session中javabean的狀態(tài)有兩個(gè)他們分別叫做鈍化和活化HttpSessionActivationListener、綁定和解綁HttpSessionBindingListener。
三個(gè)對(duì)象的創(chuàng)建和銷毀,ServletContextListener在創(chuàng)建的時(shí)候:服務(wù)器啟動(dòng)的時(shí)候,會(huì)為每一個(gè)項(xiàng)目都創(chuàng)建一個(gè)servletContext,在它銷毀的時(shí)候:服務(wù)器關(guān)閉的時(shí)候,或者項(xiàng)目被移除的時(shí)候,他是后期用來(lái)加載配置文件。ServletRequestListener是在請(qǐng)求來(lái)的時(shí)候創(chuàng)建的,是在響應(yīng)生成的時(shí)候銷毀的。HttpSessionListener是在java中次調(diào)用request.getSession的時(shí)候或者是jsp訪問(wèn)的時(shí)候創(chuàng)建的,他的銷毀分三種情況:session超時(shí),手動(dòng)銷毀session,服務(wù)器非正常關(guān)閉。
三個(gè)對(duì)象屬性的變化ServletContextAttributeListener、ServletRequestAttributeListener、HttpSessionAttributeListener這三個(gè)屬性是在添加、刪除、替換的使用被的
session中javabean的狀態(tài)、HttpSessionBindingListener(綁定和解綁)它是用來(lái)檢測(cè)java是否添加到session或者從session中移除,HttpSessionActivationListener(鈍化和活化)所謂的鈍化就是avabean從session中序列化到磁盤上,那么活化就是javabean從磁盤上加載到了session中,可以通過(guò)配置文件修改javabean什么時(shí)候鈍化。HttpSessionBindingListener(綁定和解綁)是檢測(cè)java是否添加到session或者從session中移除。
Filter過(guò)濾器是一個(gè)實(shí)現(xiàn)了特殊接口的Java類.實(shí)現(xiàn)對(duì)請(qǐng)求資源的過(guò)濾的功能。過(guò)濾器主要是過(guò)濾請(qǐng)求和響應(yīng)的,他有自動(dòng)登錄、統(tǒng)一編碼、過(guò)濾關(guān)鍵字等作用。而Filter是一個(gè)接口。我們編寫filter步驟也是三步:1.編寫一個(gè)類,實(shí)現(xiàn)filter接口并且重寫方法。2.編寫配置文件,注冊(cè)filter并且綁定路徑。3.測(cè)試Filter過(guò)濾器,它的初始化方法是init(FilterConfig config),處理業(yè)務(wù)邏輯的方法doFilter(ServletRequest request, ServletResponse response, FilterChain chain)。它的銷毀操作的方法是destroy() 。
Filter的生命周期是這樣的,filter單實(shí)例多線程,filter在服務(wù)器啟動(dòng)的時(shí)候 ;服務(wù)器創(chuàng)建filter 調(diào)用init方法 實(shí)現(xiàn)初始化操作;請(qǐng)求來(lái)的時(shí)候,創(chuàng)建一個(gè)線程 根據(jù)路徑調(diào)用dofilter 執(zhí)行業(yè)務(wù)邏輯;當(dāng)filter被移除的時(shí)候或者服務(wù)器正常關(guān)閉的時(shí)候 調(diào)用destory方法 執(zhí)行銷毀操作.
FilterChain是過(guò)濾鏈,通過(guò)chain的dofilter方法,可以將請(qǐng)求放行到下一個(gè)過(guò)濾器,直到后一個(gè)過(guò)濾器放行才可以訪問(wèn)到servlet|jsp,這里的doFilter()是放行方法。
url-pattern配置有完全匹配、目錄匹配、后綴名匹配三種,一個(gè)資源有可能被多個(gè)過(guò)濾器匹配成功,多個(gè)過(guò)濾器的執(zhí)行順序是按照web.xml中filter-mapping的順序執(zhí)行的。
到此為止,過(guò)濾器和就說(shuō)完了,你了解他們?cè)趺从昧藛?/span>?