今日內容
1. Filter:過濾器
2. Listener:監聽器
Filter:過濾器
1. 概念:
* 生活中的過濾器:淨水器,空氣淨化器,土匪、
* web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
* 過濾器的作用:
* 一般用於完成通用的操作。如:登錄驗證、統一編碼處理、敏感字符過濾...
2. 快速入門:
1. 步驟:
1. 定義一個類,實現接口Filter
2. 複寫方法
3. 配置攔截路徑
1. web.xml
2. 註解
2. 代碼:
@WebFilter("/*")//訪問所有資源之前,都會執行該過濾器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被執行了....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
3. 過濾器細節:
1. web.xml配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 攔截路徑 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 過濾器執行流程
1. 執行過濾器
2. 執行放行後的資源
3. 回來執行過濾器放行代碼下邊的代碼
3. 過濾器生命週期方法
1. init:在服務器啓動後,會創建Filter對象,然後調用init方法。只執行一次。用於加載資源
2. doFilter:每一次請求被攔截資源時,會執行。執行多次
3. destroy:在服務器關閉後,Filter對象被銷燬。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用於釋放資源
4. 過濾器配置詳解
* 攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器纔會被執行
2. 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執行
3. 後綴名攔截: *.jsp 訪問所有後綴名爲jsp資源時,過濾器都會被執行
4. 攔截所有資源:/* 訪問所有資源時,過濾器都會被執行
* 攔截方式配置:資源被訪問的方式
* 註解配置:
* 設置dispatcherTypes屬性
1. REQUEST:默認值。瀏覽器直接請求資源
2. FORWARD:轉發訪問資源
3. INCLUDE:包含訪問資源
4. ERROR:錯誤跳轉資源
5. ASYNC:異步訪問資源
* web.xml配置
* 設置<dispatcher></dispatcher>標籤即可
5. 過濾器鏈(配置多個過濾器)
* 執行順序:如果有兩個過濾器:過濾器1和過濾器2
1. 過濾器1
2. 過濾器2
3. 資源執行
4. 過濾器2
5. 過濾器1
* 過濾器先後順序問題:
1. 註解配置:按照類名的字符串比較規則比較,值小的先執行
* 如: AFilter 和 BFilter,AFilter就先執行了。
2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執行
4. 案例:
1. 案例1_登錄驗證
* 需求:
1. 訪問day17_case案例的資源。驗證其是否登錄
2. 如果登錄了,則直接放行。
3. 如果沒有登錄,則跳轉到登錄頁面,提示"您尚未登錄,請先登錄"。
2. 案例2_敏感詞彙過濾
* 需求:
1. 對day17_case案例錄入的數據進行敏感詞彙過濾
2. 敏感詞彙參考《敏感詞彙.txt》
3. 如果是敏感詞彙,替換爲 ***
* 分析:
1. 對request對象進行增強。增強獲取參數相關方法
2. 放行。傳遞代理對象
* 增強對象的功能:
* 設計模式:一些通用的解決固定問題的方式
1. 裝飾模式
2. 代理模式
* 概念:
1. 真實對象:被代理的對象
2. 代理對象:
3. 代理模式:代理對象代理真實對象,達到增強真實對象功能的目的
* 實現方式:
1. 靜態代理:有一個類文件描述代理模式
2. 動態代理:在內存中形成代理類
* 實現步驟:
1. 代理對象和真實對象實現相同的接口
2. 代理對象 = Proxy.newProxyInstance();
3. 使用代理對象調用方法。
4. 增強方法
* 增強方式:
1. 增強參數列表
2. 增強返回值類型
3. 增強方法體執行邏輯
Listener:監聽器
* 概念:web的三大組件之一。
* 事件監聽機制
* 事件 :一件事情
* 事件源 :事件發生的地方
* 監聽器 :一個對象
* 註冊監聽:將事件、事件源、監聽器綁定在一起。 當事件源上發生某個事件後,執行監聽器代碼
* ServletContextListener:監聽ServletContext對象的創建和銷燬
* 方法:
* void contextDestroyed(ServletContextEvent sce) :ServletContext對象被銷燬之前會調用該方法
* void contextInitialized(ServletContextEvent sce) :ServletContext對象創建後會調用該方法
* 步驟:
1. 定義一個類,實現ServletContextListener接口
2. 複寫方法
3. 配置
1. web.xml
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
</listener>
* 指定初始化參數<context-param>
2. 註解:
* @WebListener