JavaWeb三大组件(ServletFilterListener)
目錄
一.Servlet
1.1概念
1.2步驟
1.3執(zhí)行原理
1.4生命周期
1. 被創(chuàng)建:執(zhí)行init方法,只執(zhí)行一次
2. 提供服務(wù):執(zhí)行service方法,執(zhí)行多次
3. 被銷毀:執(zhí)行destroy方法,只執(zhí)行一次
1.5Servlet3.0
1.6體系結(jié)構(gòu)
二.Filter
2.1概念
2.2快速入門
2.3過濾器細(xì)節(jié)
三.Listener
3.1概念
3.2生命周期
一.Servlet
1.1概念
????????運(yùn)行在服務(wù)器端的小程序,?Servlet就是一個(gè)接口,定義了Java類被瀏覽器訪問到(tomcat識(shí)別)的規(guī)則。?將來我們自定義一個(gè)類,實(shí)現(xiàn)Servlet接口,復(fù)寫方法。
1.2步驟
1. 創(chuàng)建JavaEE項(xiàng)目
2. 定義一個(gè)類,實(shí)現(xiàn)Servlet接口
public class ServletDemo1 implements Servlet3. 實(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>1.3執(zhí)行原理
? ?1. 當(dāng)服務(wù)器接受到客戶端瀏覽器的請(qǐng)求后,會(huì)解析請(qǐng)求URL路徑,獲取訪問的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)用其方法
1.4生命周期
1. 被創(chuàng)建:執(zhí)行init方法,只執(zhí)行一次
? ? ?1.?Servlet什么時(shí)候被創(chuàng)建?
? ? ? ? ? ? 1.?默認(rèn)情況下,第一次被訪問時(shí),Servlet被創(chuàng)建
? ? ? ? ? ? 2?可以配置執(zhí)行Servlet的創(chuàng)建時(shí)機(jī)。
?? ??? ??? ??? ??在<servlet>標(biāo)簽下配置
?? ??? ??? ??? ??? ?1. 第一次被訪問時(shí),創(chuàng)建
? ? ? ? ? ? ? ? ?? ??? ?* <load-on-startup>的值為負(fù)數(shù)
?? ??? ? ? ? ? ? ? ?2. 在服務(wù)器啟動(dòng)時(shí),創(chuàng)建
?? ??? ? ? ? ? ? ? ? ? ?* <load-on-startup>的值為0或正整數(shù)
? ? ? ? 2.Servlet的init方法,只執(zhí)行一次,說明一個(gè)Servlet在內(nèi)存中只存在一個(gè)對(duì)象,Servlet是單例的
?? ??? ??? ?* 多個(gè)用戶同時(shí)訪問時(shí),可能存在線程安全問題。
?? ??? ??? ?* 解決:盡量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對(duì)修改值
2. 提供服務(wù):執(zhí)行service方法,執(zhí)行多次
* 每次訪問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í)行,一般用于釋放資源
1.5Servlet3.0
Servlet,HTTP,Ruquest,Response_q1097528949的博客-CSDN博客
1.6體系結(jié)構(gòu)
?? ?Servlet -- 接口
?? ??? ?|
?? ?GenericServlet -- 抽象類
?? ??? ?|
?? ?HttpServlet ?-- 抽象類
?? ?* GenericServlet:將Servlet接口中其他的方法做了默認(rèn)空實(shí)現(xiàn),只將service()方法作為抽象
?? ??? ?* 將來定義Servlet類時(shí),可以繼承GenericServlet,實(shí)現(xiàn)service()方法即可
?? ?* HttpServlet:對(duì)http協(xié)議的一種封裝,簡(jiǎn)化操作
?? ??? ?1. 定義類繼承HttpServlet
?? ??? ?2. 復(fù)寫doGet/doPost方法
二.Filter
2.1概念
* 生活中的過濾器:凈水器,空氣凈化器,土匪、
?? ?* web中的過濾器:當(dāng)訪問服務(wù)器的資源時(shí),過濾器可以將請(qǐng)求攔截下來,完成一些特殊的功能。
?? ?* 過濾器的作用:
?? ??? ?* 一般用于完成通用的操作。如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過濾...
2.2快速入門
1. 步驟:
?? ??? ?1. 定義一個(gè)類,實(shí)現(xiàn)接口Filter
?? ??? ?2. 復(fù)寫方法
?? ??? ?3. 配置攔截路徑
?? ??? ??? ?1. web.xml
?? ??? ??? ?2. 注解
2. 代碼:
@WebFilter("/*")//訪問所有資源之前,都會(huì)執(zhí)行該過濾器public class FilterDemo1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo1被執(zhí)行了....");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}}2.3過濾器細(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. 過濾器執(zhí)行流程
1. 執(zhí)行過濾器
2. 執(zhí)行放行后的資源
3. 回來執(zhí)行過濾器放行代碼下邊的代碼
3. 過濾器生命周期方法
?? ??? ?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)閉后,Filter對(duì)象被銷毀。如果服務(wù)器是正常關(guān)閉,則會(huì)執(zhí)行destroy方法。只執(zhí)行一次。用于釋放資源
4. 過濾器配置詳解
* 攔截路徑配置
? ? ? ? ? ? 1. 具體資源路徑: /index.jsp ? 只有訪問index.jsp資源時(shí),過濾器才會(huì)被執(zhí)行
?? ??? ??? ?2. 攔截目錄: /user/*?? ?訪問/user下的所有資源時(shí),過濾器都會(huì)被執(zhí)行
?? ??? ??? ?3. 后綴名攔截: *.jsp?? ??? ?訪問所有后綴名為jsp資源時(shí),過濾器都會(huì)被執(zhí)行
?? ??? ??? ?4. 攔截所有資源:/*?? ??? ?訪問所有資源時(shí),過濾器都會(huì)被執(zhí)行
?* 攔截方式配置:資源被訪問的方式
?? ??? ??? ?* 注解配置:
?? ??? ??? ??? ?* 設(shè)置dispatcherTypes屬性
?? ??? ??? ??? ??? ?1. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源
?? ??? ??? ??? ??? ?2. FORWARD:轉(zhuǎn)發(fā)訪問資源
?? ??? ??? ??? ??? ?3. INCLUDE:包含訪問資源
?? ??? ??? ??? ??? ?4. ERROR:錯(cuò)誤跳轉(zhuǎn)資源
?? ??? ??? ??? ??? ?5. ASYNC:異步訪問資源
?? ??? ??? ?* web.xml配置
?? ??? ??? ??? ?* 設(shè)置<dispatcher></dispatcher>標(biāo)簽即可
5. 過濾器鏈(配置多個(gè)過濾器)
* 執(zhí)行順序:如果有兩個(gè)過濾器:過濾器1和過濾器2
?? ??? ??? ?1. 過濾器1
?? ??? ??? ?2. 過濾器2
?? ??? ??? ?3. 資源執(zhí)行
?? ??? ??? ?4. 過濾器2
?? ??? ??? ?5. 過濾器1?
??* 過濾器先后順序問題:
?? ??? ??? ?1. 注解配置:按照類名的字符串比較規(guī)則比較,值小的先執(zhí)行
?? ??? ??? ??? ?* 如: AFilter 和 BFilter,AFilter就先執(zhí)行了。
?? ??? ??? ?2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執(zhí)行
三.Listener
3.1概念
* 事件監(jiān)聽機(jī)制
?? ??? ?* 事件?? ?:一件事情
?? ??? ?* 事件源 :事件發(fā)生的地方
?? ??? ?* 監(jiān)聽器 :一個(gè)對(duì)象
?? ??? ?* 注冊(cè)監(jiān)聽:將事件、事件源、監(jiān)聽器綁定在一起。 當(dāng)事件源上發(fā)生某個(gè)事件后,執(zhí)行監(jiān)聽器代碼
3.2生命周期
ServletContextListener:監(jiān)聽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>? ? ? ? ? ? ? ? ?2. 注解:
?? ??? ??? ??? ?* @WebListener
總結(jié)
以上是生活随笔為你收集整理的JavaWeb三大组件(ServletFilterListener)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 启动分析 1
- 下一篇: 链表的分类