Web三大組件之Filter,Listener和Servlet詳解
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>誰定義在上邊,誰先執行
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
servlet
* 概念:運行在服務器端的小程序 * Servlet就是一個接口,定義瞭Java類被瀏覽器訪問到(tomcat識別)的規則。 * 將來我們自定義一個類,實現Servlet接口,復寫方法。 * * 快速入門: 1. 創建JavaEE項目 2. 定義一個類,實現Servlet接口 * public class ServletDemo1 implements Servlet 3. 實現接口中的抽象方法 4. 配置Servlet 在web.xml中配置: <!--配置Servlet --> <servlet> <servlet-name>demo1</servlet-name> <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping> * 執行原理: 1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑 2. 查找web.xml文件,是否有對應的<url-pattern>標簽體內容。 3. 如果有,則在找到對應的<servlet-class>全類名 4. tomcat會將字節碼文件加載進內存,並且創建其對象 5. 調用其方法 * Servlet中的生命周期方法: 1. 被創建:執行init方法,隻執行一次 * Servlet什麼時候被創建? * 默認情況下,第一次被訪問時,Servlet被創建 * 可以配置執行Servlet的創建時機。 * 在<servlet>標簽下配置 1. 第一次被訪問時,創建 * <load-on-startup>的值為負數 2. 在服務器啟動時,創建 * <load-on-startup>的值為0或正整數 * Servlet的init方法,隻執行一次,說明一個Servlet在內存中隻存在一個對象,Servlet是單例的 * 多個用戶同時訪問時,可能存在線程安全問題。 * 解決:盡量不要在Servlet中定義成員變量。即使定義瞭成員變量,也不要對修改值 2. 提供服務:執行service方法,執行多次 * 每次訪問Servlet時,Service方法都會被調用一次。 3. 被銷毀:執行destroy方法,隻執行一次 * Servlet被銷毀時執行。服務器關閉時,Servlet被銷毀 * 隻有服務器正常關閉時,才會執行destroy方法。 * destroy方法在Servlet被銷毀之前執行,一般用於釋放資源 * Servlet3.0: * 好處: * 支持註解配置。可以不需要web.xml瞭。 * 步驟: 1. 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml 2. 定義一個類,實現Servlet接口 3. 復寫方法 4. 在類上使用@WebServlet註解,進行配置 * @WebServlet("資源路徑")
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 深入瞭解Java中的過濾器Filter和監聽器Listener
- 詳細瞭解java監聽器和過濾器
- 詳解JavaWeb中的過濾器Filter
- Java中使用Filter過濾器的方法
- 聊聊java 過濾器、監聽器、攔截器的區別(終結篇)