Servlet、Filter、Listener、Interceptor

首先,JSP/Servlet規範中定義了Servlet、Filter、Listener這三種角色,並無定義Interceptor這個角色,Interceptor是某些MVC框架中的角色,好比Struts2中,Interceptor是用來攔截Action中的方法的調用,在被攔截的Action方法被執行前,先執行響應的攔截器中的方法。
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。


servlet、filter、listener三者的加載順序與它們在 web.xml 文件中配置的前後順序無關。即不會由於filter寫在listener的前面而會先加載filter:加載它們的前後順序是:listener -> filter -> servlet
同時還存在着這樣一種配置節:context-param,它用於向 ServletContext 提供鍵值對,即應用程序上下文信息。咱們的 listener, filter 等在初始化時會用到這些上下文中的信息,那麼 context-param 配置節是否是應該寫在 listener 配置節前呢?實際上 context-param 配置節可寫在任意位置,所以真正的加載順序爲:context-param -> listener -> filter -> servlet


context-param、listener、 filter、 servlet的加載順序不是配置時前後順序的影響,可是多個filter時,filter之間的加載順是受影響的。web 容器啓動時初始化每一個 filter 時,是按照 filter 配置節出現的順序來初始化的,當請求資源匹配多個 filter-mapping 時,filter 攔截資源是按照 filter-mapping 配置節出現的順序來依次調用 doFilter() 方法的。


==================================Filter=============================================
filter過濾器是在Java Servlet規範2.3中定義的,在Java Servlet規範2.3出來以前,是沒有filter這個角色的。
filter這個角色是用來:在請求到達servlet以前,先截獲請求,對請求先作一些預處理(例如編碼轉換,權限驗證)。處理完後在把請求轉發給servlet或把不符合某些規則的請求丟棄掉,再也不轉發給servlet了。當servlet處理好請求後,返回響應給瀏覽器時,filter攔截響應,對響應作一些處理以後,再返回給瀏覽器。因而可知,filter這個角色的職責就是:幫servlet作一些前期預處理工做(先於servlet處理request)和藹後工做(後於servlet處理response)的輔助角色,它就像servlet的助手同樣,但它並非必須的,由於在以前沒有filter的時候,servlet也能很好地工做。只是若是有filter的幫助的話,servlet就能更專一處理一些核心的業務。
多個filter能夠協同工做,它們之間採用了職責鏈的設計模式來協同工做。一個filter處理完後,調用下一個filter來處理,每一個filter負責處理不一樣的工做,而這些filter之間能夠根據須要靈活組合。filter的前後順序按filter在web.xml中配置的前後順序。
filter須要servlet容器(tomcat)的支持,能運行filter的servlet容器必須實如今Java Servlet規範2.3版中定義的功能。servlet容器是對javax.servlet.Filter這個接口進行編程的,因此你本身寫的filter必須直接或間接的實現了javax.servlet.Filter這個接口,不然servlet容器不能跟你定義的filter進行交互(由於在編程實現容器時,就把javax.servlet.Filter這個接口編進容器代碼中了,容器只能調用javax.servlet.Filter接口的實現類)。




=====================================Listener============================================
listener是對事件進行監聽和處理的角色,它採用觀察者模式,只有當在這個listener上註冊了的事件
發生時,listener纔會執行事件處理方法。這些事件舉例:上下文(context)加載事件;session建立或銷燬事件;容器、session或請求的屬性設置或移除事件等。


servlet2.4規範中提供了8個listener接口,能夠將其分爲三類,分別以下:
第一類:與servletContext(Application)有關的listner接口。包括:ServletContextListener、ServletContextAttributeListener
第二類:與HttpSession有關的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、                                                     HttpSessionActivationListener;
第三類:與ServletRequest有關的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener




=====================================Interceptor=========================================
Interceptor是某些MVC框架中的角色,好比Struts2中,Interceptor是用來攔截Action中的方法的調用,在被攔截的Action方法被執行前,先執行響應的攔截器中的方法。interceptor:是在面向切面編程的,就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法,好比動態代理就是攔截器的簡單實現。filter是在servlet前面攔截請求,而interceptor是利用面向切面編程的技術,在Struts的內部Action中攔截調用方法請求。java

相關文章
相關標籤/搜索