1. 程式人生 > >javaWeb(十二)監聽器(Listener)和過濾器(Filter)

javaWeb(十二)監聽器(Listener)和過濾器(Filter)

Listener

1、Listener定義 :

監聽器內部實現其實就是介面回撥.

就像老闆寫介面方法,然後員工寫實現類,父類介面指向子類物件,多型的一種體現

2、Listener分類 :

總共有8個 劃分成三種類型

  1. 【監聽三個作用域建立和銷燬】
    需要在web.xml裡面註冊
> > > > >
三個作用域 Web中類的體現 Listener介面 建立 銷燬
request httpServletRequest ServletRequestListener 只要訪問伺服器,就會有請求;html: 會; jsp: 會; servlet : 會 對請求做了響應後
session httpSession HttpSessionListener 呼叫getSession;html: 不會; jsp: 會; servlet : 會 超時(預設30分鐘)、非正常關閉(銷燬)、正常關閉伺服器(序列化)
application ServletContext ServletContextListener 啟動伺服器時 關閉伺服器、從伺服器移除專案
  1. 【監聽三個作用域屬性狀態變更】
    需要在web.xml裡面註冊

可以監聽在作用域中值 新增 | 替換 | 移除的動作。(setAttribute/removeAttribute)

  • request — ServletRequestAttributeListener
    在這裡插入圖片描述

  • session — HttpSessionAttributeListener
    在這裡插入圖片描述

  • servletContext — ServletContextAttributeListener
    在這裡插入圖片描述

  1. 【監聽httpSession裡面存值的狀態變更】

不需要在web.xml裡面註冊,但是需要Bean實現下面這個介面

  • HttpSessionBindingListener(監聽物件與session 繫結和解除繫結 的動作)
 - 讓javaBean 實現該介面即可

        @Override
        public void valueBound(HttpSessionBindingEvent event) {
            System.out.println("物件被繫結進來了");
        }

        @Override
        public void valueUnbound(HttpSessionBindingEvent event) {
            System.out.println("物件被解除繫結");
        }
  • HttpSessionActivationListener(用於監聽現在session的值 是 鈍化 (序列化)還是活化 (反序列化)的動作)

session中的值可能會很多, 並且我們有很長一段時間不使用這 個記憶體中的值, 那麼可以考慮把session的值可以儲存到硬碟上【鈍化】,等下一次在使用的時候,在從硬碟上提取出來。 【活化】

1. 在tomcat裡面 conf/context.xml 裡面配置

        對所有的執行在這個伺服器的專案生效  

2. 在conf/Catalina/localhost/context.xml 配置

        對 localhost生效。  localhost:8080

3. 在自己的web工程專案中的 META-INF/context.xml

        只對當前的工程生效。

    maxIdleSwap : 1分鐘不用就鈍化
    directory :  鈍化後的那個檔案存放的目錄位置。 

        D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\demo1

    <Context>
        <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
            <Store className="org.apache.catalina.session.FileStore" directory="javaStudy"/>
        </Manager>
    </Context>

Filter

過濾器 , 其實就是對客戶端發出來的請求進行過濾。 瀏覽器發出, 然後伺服器派servlet處理。 在中間就可以過濾, 其實過濾器起到的是攔截的作用。

在伺服器啟動的時候就建立。伺服器停止的時候銷燬

1、如何使用Filter:

  1. 定義一個類, 實現Filter

public class FilterDemo implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("來到過慮器了。。。");
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}
  1. 註冊過濾器
        <filter>
        <display-name>FilterDemo</display-name>
        <filter-name>FilterDemo</filter-name>
        <filter-class>com.itheima.filter.FilterDemo</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>FilterDemo</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

2、配置Filter:

  1. 全路徑匹配 以 / 開始
/LoginServlet
  1. 以目錄匹配 以 / 開始 以 * 結束
/demo01/*
  1. 以後綴名匹配 以 * 開始 以後綴名結束
*.jsp *.html *.do

3、配置引數Dispachers:

REQUEST : 只要是請求過來,都攔截,預設就是REQUEST 
FORWARD : 只要是轉發都攔截。 
ERROR : 頁面出錯發生跳轉 
INCLUDE : 包含頁面的時候就攔截。