Web三大組件之Filter,Listener和Servlet詳解
Filter:過(guò)濾器
1. 概念: * 生活中的過(guò)濾器:凈水器,空氣凈化器,土匪、 * web中的過(guò)濾器:當(dāng)訪問(wèn)服務(wù)器的資源時(shí),過(guò)濾器可以將請(qǐng)求攔截下來(lái),完成一些特殊的功能。 * 過(guò)濾器的作用: * 一般用于完成通用的操作。如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過(guò)濾... 2. 快速入門: 1. 步驟: 1. 定義一個(gè)類,實(shí)現(xiàn)接口Filter 2. 復(fù)寫方法 3. 配置攔截路徑 1. web.xml 2. 注解 2. 代碼: @WebFilter("/*")//訪問(wèn)所有資源之前,都會(huì)執(zhí)行該過(guò)濾器 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被執(zhí)行了...."); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } } 3. 過(guò)濾器細(xì)節(jié): 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. 過(guò)濾器執(zhí)行流程 1. 執(zhí)行過(guò)濾器 2. 執(zhí)行放行后的資源 3. 回來(lái)執(zhí)行過(guò)濾器放行代碼下邊的代碼 3. 過(guò)濾器生命周期方法 1. init:在服務(wù)器啟動(dòng)后,會(huì)創(chuàng)建Filter對(duì)象,然后調(diào)用init方法。只執(zhí)行一次。用于加載資源 2. doFilter:每一次請(qǐng)求被攔截資源時(shí),會(huì)執(zhí)行。執(zhí)行多次 3. destroy:在服務(wù)器關(guān)閉后,F(xiàn)ilter對(duì)象被銷毀。如果服務(wù)器是正常關(guān)閉,則會(huì)執(zhí)行destroy方法。只執(zhí)行一次。用于釋放資源 4. 過(guò)濾器配置詳解 * 攔截路徑配置: 1. 具體資源路徑: /index.jsp 只有訪問(wèn)index.jsp資源時(shí),過(guò)濾器才會(huì)被執(zhí)行 2. 攔截目錄: /user/* 訪問(wèn)/user下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行 3. 后綴名攔截: *.jsp 訪問(wèn)所有后綴名為jsp資源時(shí),過(guò)濾器都會(huì)被執(zhí)行 4. 攔截所有資源:/* 訪問(wèn)所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行 * 攔截方式配置:資源被訪問(wèn)的方式 * 注解配置: * 設(shè)置dispatcherTypes屬性 1. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源 2. FORWARD:轉(zhuǎn)發(fā)訪問(wèn)資源 3. INCLUDE:包含訪問(wèn)資源 4. ERROR:錯(cuò)誤跳轉(zhuǎn)資源 5. ASYNC:異步訪問(wèn)資源 * web.xml配置 * 設(shè)置<dispatcher></dispatcher>標(biāo)簽即可 5. 過(guò)濾器鏈(配置多個(gè)過(guò)濾器) * 執(zhí)行順序:如果有兩個(gè)過(guò)濾器:過(guò)濾器1和過(guò)濾器2 1. 過(guò)濾器1 2. 過(guò)濾器2 3. 資源執(zhí)行 4. 過(guò)濾器2 5. 過(guò)濾器1 * 過(guò)濾器先后順序問(wèn)題: 1. 注解配置:按照類名的字符串比較規(guī)則比較,值小的先執(zhí)行 * 如: AFilter 和 BFilter,AFilter就先執(zhí)行了。 2. web.xml配置: <filter-mapping>誰(shuí)定義在上邊,誰(shuí)先執(zhí)行
Listener:監(jiān)聽(tīng)器
* 概念:web的三大組件之一。 * 事件監(jiān)聽(tīng)機(jī)制 * 事件 :一件事情 * 事件源 :事件發(fā)生的地方 * 監(jiān)聽(tīng)器 :一個(gè)對(duì)象 * 注冊(cè)監(jiān)聽(tīng):將事件、事件源、監(jiān)聽(tīng)器綁定在一起。 當(dāng)事件源上發(fā)生某個(gè)事件后,執(zhí)行監(jiān)聽(tīng)器代碼 * ServletContextListener:監(jiān)聽(tīng)ServletContext對(duì)象的創(chuàng)建和銷毀 * 方法: * void contextDestroyed(ServletContextEvent sce) :ServletContext對(duì)象被銷毀之前會(huì)調(diào)用該方法 * void contextInitialized(ServletContextEvent sce) :ServletContext對(duì)象創(chuàng)建后會(huì)調(diào)用該方法 * 步驟: 1. 定義一個(gè)類,實(shí)現(xiàn)ServletContextListener接口 2. 復(fù)寫方法 3. 配置 1. web.xml <listener> <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class> </listener> * 指定初始化參數(shù)<context-param> 2. 注解: * @WebListener
servlet
* 概念:運(yùn)行在服務(wù)器端的小程序 * Servlet就是一個(gè)接口,定義了Java類被瀏覽器訪問(wèn)到(tomcat識(shí)別)的規(guī)則。 * 將來(lái)我們自定義一個(gè)類,實(shí)現(xiàn)Servlet接口,復(fù)寫方法。 * * 快速入門: 1. 創(chuàng)建JavaEE項(xiàng)目 2. 定義一個(gè)類,實(shí)現(xiàn)Servlet接口 * public class ServletDemo1 implements Servlet 3. 實(shí)現(xiàn)接口中的抽象方法 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> * 執(zhí)行原理: 1. 當(dāng)服務(wù)器接受到客戶端瀏覽器的請(qǐng)求后,會(huì)解析請(qǐng)求URL路徑,獲取訪問(wèn)的Servlet的資源路徑 2. 查找web.xml文件,是否有對(duì)應(yīng)的<url-pattern>標(biāo)簽體內(nèi)容。 3. 如果有,則在找到對(duì)應(yīng)的<servlet-class>全類名 4. tomcat會(huì)將字節(jié)碼文件加載進(jìn)內(nèi)存,并且創(chuàng)建其對(duì)象 5. 調(diào)用其方法 * Servlet中的生命周期方法: 1. 被創(chuàng)建:執(zhí)行init方法,只執(zhí)行一次 * Servlet什么時(shí)候被創(chuàng)建? * 默認(rèn)情況下,第一次被訪問(wèn)時(shí),Servlet被創(chuàng)建 * 可以配置執(zhí)行Servlet的創(chuàng)建時(shí)機(jī)。 * 在<servlet>標(biāo)簽下配置 1. 第一次被訪問(wèn)時(shí),創(chuàng)建 * <load-on-startup>的值為負(fù)數(shù) 2. 在服務(wù)器啟動(dòng)時(shí),創(chuàng)建 * <load-on-startup>的值為0或正整數(shù) * Servlet的init方法,只執(zhí)行一次,說(shuō)明一個(gè)Servlet在內(nèi)存中只存在一個(gè)對(duì)象,Servlet是單例的 * 多個(gè)用戶同時(shí)訪問(wèn)時(shí),可能存在線程安全問(wèn)題。 * 解決:盡量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對(duì)修改值 2. 提供服務(wù):執(zhí)行service方法,執(zhí)行多次 * 每次訪問(wèn)Servlet時(shí),Service方法都會(huì)被調(diào)用一次。 3. 被銷毀:執(zhí)行destroy方法,只執(zhí)行一次 * Servlet被銷毀時(shí)執(zhí)行。服務(wù)器關(guān)閉時(shí),Servlet被銷毀 * 只有服務(wù)器正常關(guān)閉時(shí),才會(huì)執(zhí)行destroy方法。 * destroy方法在Servlet被銷毀之前執(zhí)行,一般用于釋放資源 * Servlet3.0: * 好處: * 支持注解配置。可以不需要web.xml了。 * 步驟: 1. 創(chuàng)建JavaEE項(xiàng)目,選擇Servlet的版本3.0以上,可以不創(chuàng)建web.xml 2. 定義一個(gè)類,實(shí)現(xiàn)Servlet接口 3. 復(fù)寫方法 4. 在類上使用@WebServlet注解,進(jìn)行配置 * @WebServlet("資源路徑")
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
理解Java注解及Spring的@Autowired是如何實(shí)現(xiàn)的
今天通過(guò)本文帶領(lǐng)大家學(xué)習(xí)注解的基礎(chǔ)知識(shí),學(xué)習(xí)Spring的@Autowired是怎么實(shí)現(xiàn)的,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07Java8中Lambda表達(dá)式的理解與應(yīng)用
Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式和Stream?API,如果有python或者javascript的語(yǔ)言基礎(chǔ),對(duì)理解Lambda表達(dá)式有很大幫助,下面這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達(dá)式的相關(guān)資料,需要的朋友可以參考下2022-02-02Java中的System類、BigInteger類和BigDecimal類詳解
這篇文章主要介紹了Java中的System類、BigInteger類和BigDecimal類詳解,arraycopy()方法,復(fù)制數(shù)組元素,比較適合底層調(diào)用,一般使用Arrays.copyOf()完成復(fù)制數(shù)組,需要的朋友可以參考下2023-09-09解析Java的可變長(zhǎng)參數(shù)列表及其使用時(shí)的注意點(diǎn)
這篇文章主要介紹了解析Java的可變參數(shù)列表及其使用時(shí)的注意點(diǎn),注意可變參數(shù)必須位于最后一項(xiàng),需要的朋友可以參考下2016-03-03通過(guò)實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法
這篇文章主要介紹了通過(guò)實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法
排序算法看似簡(jiǎn)單,其實(shí)不同的算法中蘊(yùn)涵著經(jīng)典的算法策略。通過(guò)熟練掌握排序算法,就可以掌握基本的算法設(shè)計(jì)思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀2023-04-04一文搞懂MyBatis多數(shù)據(jù)源Starter實(shí)現(xiàn)
本文將實(shí)現(xiàn)一個(gè)MyBatis的Springboot的Starter包,引用這個(gè)Starter包后,僅需要提供少量配置信息,就能夠完成MyBatis多數(shù)據(jù)源的初始化和使用,需要的小伙伴可以參考一下2023-04-04