一、三大組件
???JavaWeb三大組件指的是:Servlet、Filter、Listener,這三個組件在JavaWeb開發中分別提供不同的功能,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我),很難接觸到第三個組件,因此對原始JavaWeb開發還不夠熟悉,在這種情況下進行框架學習,這種做法是并不可取,框架是大牛們對原始JavaWeb進行封裝的結果,沒有原始JavaWeb開發基礎是很難真正學會框架的。通過簡單的介紹JavaWeb的三大組件來熟悉原始JavaWeb開發。
1、Servlet
Servlet是用來處理客戶端請求的動態資源,也就是當我們在瀏覽器中鍵入一個地址回車跳轉后,請求就會被發送到對應的Servlet上進行處理。
Servlet的任務有:
接收請求數據:我們都知道客戶端請求會被封裝成HttpServletRequest對象,里面包含了請求頭、參數等各種信息。
處理請求:通常我們會在service、doPost或者doGet方法進行接收參數,并且調用業務層(service)的方法來處理請求。
完成響應:處理完請求后,我們一般會轉發(forward)或者重定向(redirect)到某個頁面,轉發是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,兩者是有很大區別的。
Servlet的創建:Servlet可以在第一次接收請求時被創建,也可以在在服務器啟動時就被創建,這需要在web.xml的< servlet>中添加一條配置信息 < load-on-startup>5< /load-on-startup>,當值為0或者大于0時,表示容器在應用啟動時就加載這個servlet,當是一個負數時或者沒有指定時,則指示容器在該servlet被請求時才加載。
Servlet的生命周期方法:
servlet的初始化方法,只在創建servlet實例時候調用一次,Servlet是單例的,整個服務器就只創建一個同類型Servlet
servlet的處理請求方法,在servle被請求時,會被馬上調用,每處理一次請求,就會被調用一次。ServletRequest類為請求類,ServletResponse類為響應類
servlet銷毀之前執行的方法,只執行一次,用于釋放servlet占有的資源,通常Servlet是沒什么可要釋放的,所以該方法一般都是空的
2、Filter
filter與servlet在很多的方面極其相似,但是也有不同,例如filter和servlet一樣都又三個生命周期方法,同時他們在web.xml中的配置文件也是差不多的、 但是servlet主要負責處理請求,而filter主要負責攔截請求,和放行。
filter四種攔截方式
REQUEST:直接訪問目標資源時執行過濾器。包括:在地址欄中直接訪問、表單提交、超鏈接、重定向,只要在地址欄中可以看到目標資源的路徑,就是REQUEST;
FORWARD:轉發訪問執行過濾器。包括RequestDispatcher#forward()方法、< jsp:forward>標簽都是轉發訪問;
INCLUDE:包含訪問執行過濾器。包括RequestDispatcher#include()方法、< jsp:include>標簽都是包含訪問;
ERROR:當目標資源在web.xml中配置為< error-page>中時,并且真的出現了異常,轉發到目標資源時,會執行過濾器。
執行filter的順序
如果有多個過濾器都匹配該請求,順序決定于web.xml filter-mapping的順序,在前面的先執行,后面的后執行
3、Listener
Listener就是監聽器,我們在JavaSE開發或者Android開發時,經常會給按鈕加監聽器,當點擊這個按鈕就會觸發監聽事件,調用onClick方法,本質是方法回調。在JavaWeb的Listener也是這么個原理,但是它監聽的內容不同,它可以監聽Application、Session、Request對象,當這些對象發生變化就會調用對應的監聽方法。
應用域監聽:
? ServletContext(監聽Application)
¨ 生命周期監聽:ServletContextListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;
¨ 屬性監聽:ServletContextAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用。
?HttpSession(監聽Session)
¨ 生命周期監聽:HttpSessionListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;
屬性監聽:HttpSessioniAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用。
感知Session監聽:
1:HttpSessionBindingListener監聽
⑴在需要監聽的實體類實現HttpSessionBindingListener接口
⑵重寫valueBound()方法,這方法是在當該實體類被放到Session中時,觸發該方法
⑶重寫valueUnbound()方法,這方法是在當該實體類從Session中被移除時,觸發該方法
2:HttpSessionActivationListener監聽
⑴在需要監聽的實體類實現HttpSessionActivationListener接口
⑵重寫sessionWillPassivate()方法,這方法是在當該實體類被序列化時,觸發該方法
⑶重寫sessionDidActivate()方法,這方法是在當該實體類被反序列化時,觸發該方法
二、八大監聽器
Servlet監聽器的作用是監聽Web容器的有效期事件,可以監聽由于Web應用中狀態改變而引起的Servlet容器產生的相應事件,然后接受并處理這些事件。其中提供的LIstener接口有這些:
(1)ServletContextListener;????????
Servlet的上下文監聽,它主要實現監聽ServletContext的創建和刪除。該接口提供了兩種方法
??????????????????1.contextInitialized(ServletContextEvent event);???通知正在收聽的對象,應用程序已經被加載和初始化。
??????????????????2.contextDestroyed(ServletCotextEvent event);???通知正在收聽的對象,應用程序已經被載出,即關閉。
(2)ServletAttributeListener;????
??主要實現監聽ServletContext屬性的增加,刪除和修改。該接口提供了一下3個方法
????????????????1.attributeAdded(ServletContextAttributeEvent event);???
當有對象加入Application的范圍時,通知正在收聽的對象
????????????????2.attributeReplaced(ServletContextAttributeEvent event);
當在application的范圍有對象取代另一個對象的時,通知正在收聽的對象
????????????????3.attributeRemoved(ServletContextAttributeEvent event);?
??當有對象從application的范圍移除時,通知正在收聽的對象
(3)HttpSessionListener;??????????
??HTTP會話監聽,該接口實現監聽HTTP會話創建、銷毀。該接口提供了一下兩種方法
???????????????????1.sessionCreated(HttpSessionEvent event);???????
通知正在收聽的對象,session已經被加載及初始化
???????????????????2. sessionDestoryed(HttpSessionEvent event)l????????
??通知正在收聽的對象,session已經被載出(HttpSessionEvent類的主要方法是getSession(),可以使用該方法回傳一個session對象)
(4)HttpSessionActivationListener;?????????
?該接口實現監聽HTTP會話active和passivate。 該接口提供了一下3個方法?
???????????????????1.attributeAdded(HttpSessionBindingEvent event);???????
??當有對象加入session的范圍時,通知正在收聽的對象
???????????????????2.attributeReplaced(HttpSessionBindingEvent event);????
???當在session的范圍有對象取代另一個對象時,通知正在收聽的對象。
???????????????????3.attributeRemoved(HttpSessionBindingEvent event);??????????
??當有對象從session的范圍有對象取代另一個對象時,通知正在收聽的對象 其中HttpSessionBindingEvent類主要有三個方法:getName()、getSession()和getValue()
(5)HttpBindingListener;??????????????????????
??接口實現監聽HTTP會話中對象的綁定信息。它是唯一不需要在web.xml中設定Listener的。該接口提供了以下2個方法
??????????????????1.valueBound(HttpSessionBindingEvent event);??????????????????????
當有對象加入session的范圍時會被自動調用
??????????????????2.valueUnBound(HttpSessionBindingEvent event);????????????????????
??當有對象從session的范圍內移除時會被自動調用
(6)HttpSessionAttributeListener;?????????????
??該接口實現監聽HTTP會話中屬性的設置請求。該接口提供了以下兩個方法。
?????????????????1.sessionDidActivate(HttpSessionEvent event);??????????
??通知正在收聽的對象,它的session已經變為有效狀態。
?????????????????2.sessionWillPassivate(HttpSessionEvent event);??????????
??通知正在收聽的對象,它的session已經變為無效狀態
(7)ServletRequestListener;???????????????????
??該接口提供了以下兩個方法。
???????????????????1.requestInitalized(ServletRequestEvent event)?????????????
通知正在收聽的對象,ServletRequest已經被加載及初始化
???????????????????2.requestDestroyed(ServletRequestEvent event)?????????
通知正在收聽的對象,ServletRequest已經被載出,即關閉
(8)ServletRequestAttributeListener
??該接口提供了一下三種方法
????????????????????1.attributeAdded(ServletRequestAttributeEvent event);?????
???當有對象加入request的范圍時,通知正在收聽的對象
????????????????????2.attributeReplaced(ServletRequestAttributeEvent event);????????
當在request的范圍內有對象取代兩一個對象時,通知正在收聽的對象
???????????????????3.attributeRemoved(ServletRequestAttributeEvent event);????
??當有對象從request的范圍移除時,通知正在收聽的對象