1. 程式人生 > >過濾器與監聽器知識總結

過濾器與監聽器知識總結

mapping rem setattr 處理 event 節點 create 增加 多個

過濾器

什麽是過濾器?

過濾器是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的創建動作。

未完,暫時總結這些。

過濾器與監聽器知識總結