過濾器與監聽器知識總結
過濾器
什麽是過濾器?
過濾器是servlet2.3規範中定義的一種小型的、可插入的Web組件。用來攔截Servlet容器的請求和響應過程。以便查看、提取或以某種方式操作正在客戶機和服務器之間交換的數據。
過濾器通常是封裝了一些功能的Web組件,這些功能很重要,但對於處理客戶端請求或發送響應來說不是決定性的。
典型的應用包括記錄請求和響應的數據、管理會話屬性等。
如何編寫過濾器?
1.編寫一個java類,實現Filter接口;
-- 過濾器API中有3個常用的接口,位於javax,Servlet包中:Filter,FilterChain,FilterConfig
編程中,過濾器類要實現Filter接口,該接口中包含三個必須實現的方法:
void init(FilterConfig filterConfig);
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain);
void destroy();
2.在doFilter方法中實現攔截處理邏輯;
-- public class CommentFilter implements Filter{
//創建實例後,調用init方法,該方法只執行一次
public void init(FilterConfig filterConfig) throws ServletException{ //.....}
//容器調用doFilter方法處理請求
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{ //...... chian.doFilter(request,response);}
//容器刪除過濾器實例之前調用該方法,該方法只執行一次
public void destroy(){... ...}
}
3.將過濾器添加到Web程序中;
-- 修改web.xml文件,增加過濾器節點
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.xxxServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/xxx</url-pattern>
<filter-mapping>
4.把過濾器和Web應用一起打包部署。
-- 與web應用程序一起部署過濾器時,只需要把過濾器類和其他web組件類包括在一起,把web.xml文件(連同過濾器註冊)放進web應用程序結構中,Servlet容器將處理之後的其他所有事情。
過濾器的優先級
如果有多個過濾器都滿足過濾的條件,則容器依據<filter-mapping>的先後順序來調用各個過濾器。
<filter>.......</filter>
<filter>.......</filter>
<filter-mapping>......</filter-mapping>
<filter-mapping>......</filter-mapping>
過濾器的初始化參數
容器啟動之後,會創建過濾器實例
接下來,容器會調用過濾器的init方法,而容器會事先創建FilterConfig對象。該對象可以訪問在web.xml文件中配置的一些參數。
這些在web.xml文件中存儲,由FilterConfig對象讀取,在執行init方法時能夠訪問的參數值,叫初始化參數。
通過這些初始化參數可以方便快捷的配置及修改一些輔助參數。
其中初始化參數的配置示例為:
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.xxxFilter</filter-class>
<! -- 初始化參數 -- >
<init-param>
<param-name>illegaIStr</param-name>
<param-value>xxx</param-value>
</init-param>
</filter>
讀取初始化參數
使用FilterConfig對象可以讀取在web.xml中配置的初始化參數。示例:
String config.getInitParamter("illegalStr")
過濾器的優點:
實現代碼的“可插拔性”,即增加或減少某個功能模塊,不會影響程序的正常執行;
可以將多個相同處理邏輯的模塊集中寫在過濾器裏面,方便代碼的維護。
監聽器
什麽是監聽器?
Servlet規範中定義的一種特殊的組件,用來監聽Servlet容器產生的事件並進行相應的處理。
容器產生的兩大類事件:
--生命周期相關的事件
容器創建或者銷毀request,session,ServletContext時產生的事件
--綁定數據相關的事件
調用了request,session,ServletContext的setAttribute,removeAttribute方法時產生的事件
如何編寫監聽器?
1.編寫一個java類,依據監聽的事件類型選擇實現相應的監聽器接口。例如要監聽Session對象的創建和銷毀,要實現HttpSessionListener
--public class CouListener implements HttpSessionListener{ // 實現方法}
2.在監聽器接口方法中,實現相應的監聽處理邏輯
--public class CouListener implements HttpSessionListener{
public void sessionCreate(HttpSessionEvent arg0){
//......
HttpSession session = arg0.getSession();
ServletContext ctx = session.getServletContext();(獲取session或上下文對象的方法)
}
}
3.在web.xml文件中註冊該監聽器
--在web.xml文件中,增加以下節點:
<! -- 監聽器 -->
<listener>
<listener-class>web.CouListener</listener-class>
</listener>
<!-- 實現相同的listener接口的多個監聽器,在執行時是按web.xml註冊出現的順序決定 -->
應用場景:
由於ServletRequest,HttpSession,ServletContext對象都是容器創建的,通過對這些對象註冊監聽器,就可以得知何時創建了。例如:
在contextDestroy方法中對應用級別的資源進行釋放;
統計在線人數可以通過HttpSessionListener監聽器的sessionCreated方法監聽session的創建動作。
未完,暫時總結這些。
過濾器與監聽器知識總結