一、三大組件
???JavaWeb三大組件指的是:Servlet、Filter饱溢、Listener架馋,這三個組件在JavaWeb開發(fā)中分別提供不同的功能狞山,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我)捺疼,很難接觸到第三個組件录肯,因此對原始JavaWeb開發(fā)還不夠熟悉,在這種情況下進行框架學習伊约,這種做法是并不可取,框架是大牛們對原始JavaWeb進行封裝的結(jié)果孕蝉,沒有原始JavaWeb開發(fā)基礎(chǔ)是很難真正學會框架的屡律。通過簡單的介紹JavaWeb的三大組件來熟悉原始JavaWeb開發(fā)。
1降淮、Servlet
Servlet是用來處理客戶端請求的動態(tài)資源超埋,也就是當我們在瀏覽器中鍵入一個地址回車跳轉(zhuǎn)后,請求就會被發(fā)送到對應(yīng)的Servlet上進行處理佳鳖。
Servlet的任務(wù)有:
接收請求數(shù)據(jù):我們都知道客戶端請求會被封裝成HttpServletRequest對象霍殴,里面包含了請求頭、參數(shù)等各種信息系吩。
處理請求:通常我們會在service来庭、doPost或者doGet方法進行接收參數(shù),并且調(diào)用業(yè)務(wù)層(service)的方法來處理請求穿挨。
完成響應(yīng):處理完請求后月弛,我們一般會轉(zhuǎn)發(fā)(forward)或者重定向(redirect)到某個頁面,轉(zhuǎn)發(fā)是HttpServletRequest中的方法科盛,重定向是HttpServletResponse中的方法帽衙,兩者是有很大區(qū)別的。
Servlet的創(chuàng)建:Servlet可以在第一次接收請求時被創(chuàng)建贞绵,也可以在在服務(wù)器啟動時就被創(chuàng)建厉萝,這需要在web.xml的< servlet>中添加一條配置信息 < load-on-startup>5< /load-on-startup>,當值為0或者大于0時,表示容器在應(yīng)用啟動時就加載這個servlet谴垫,當是一個負數(shù)時或者沒有指定時章母,則指示容器在該servlet被請求時才加載。
Servlet的生命周期方法:
servlet的初始化方法弹渔,只在創(chuàng)建servlet實例時候調(diào)用一次胳施,Servlet是單例的,整個服務(wù)器就只創(chuàng)建一個同類型Servlet
servlet的處理請求方法肢专,在servle被請求時舞肆,會被馬上調(diào)用,每處理一次請求博杖,就會被調(diào)用一次椿胯。ServletRequest類為請求類,ServletResponse類為響應(yīng)類
servlet銷毀之前執(zhí)行的方法剃根,只執(zhí)行一次哩盲,用于釋放servlet占有的資源,通常Servlet是沒什么可要釋放的狈醉,所以該方法一般都是空的
2廉油、Filter
filter與servlet在很多的方面極其相似,但是也有不同苗傅,例如filter和servlet一樣都又三個生命周期方法抒线,同時他們在web.xml中的配置文件也是差不多的、 但是servlet主要負責處理請求渣慕,而filter主要負責攔截請求嘶炭,和放行。
filter四種攔截方式
REQUEST:直接訪問目標資源時執(zhí)行過濾器逊桦。包括:在地址欄中直接訪問眨猎、表單提交、超鏈接强经、重定向睡陪,只要在地址欄中可以看到目標資源的路徑,就是REQUEST匿情;
FORWARD:轉(zhuǎn)發(fā)訪問執(zhí)行過濾器兰迫。包括RequestDispatcher#forward()方法、< jsp:forward>標簽都是轉(zhuǎn)發(fā)訪問码秉;
INCLUDE:包含訪問執(zhí)行過濾器逮矛。包括RequestDispatcher#include()方法鸡号、< jsp:include>標簽都是包含訪問转砖;
ERROR:當目標資源在web.xml中配置為< error-page>中時,并且真的出現(xiàn)了異常,轉(zhuǎn)發(fā)到目標資源時府蔗,會執(zhí)行過濾器晋控。
執(zhí)行filter的順序
如果有多個過濾器都匹配該請求,順序決定于web.xml filter-mapping的順序姓赤,在前面的先執(zhí)行赡译,后面的后執(zhí)行
3、Listener
Listener就是監(jiān)聽器不铆,我們在JavaSE開發(fā)或者Android開發(fā)時蝌焚,經(jīng)常會給按鈕加監(jiān)聽器,當點擊這個按鈕就會觸發(fā)監(jiān)聽事件誓斥,調(diào)用onClick方法只洒,本質(zhì)是方法回調(diào)。在JavaWeb的Listener也是這么個原理劳坑,但是它監(jiān)聽的內(nèi)容不同毕谴,它可以監(jiān)聽Application、Session距芬、Request對象涝开,當這些對象發(fā)生變化就會調(diào)用對應(yīng)的監(jiān)聽方法。
應(yīng)用域監(jiān)聽:
? ServletContext(監(jiān)聽Application)
¨ 生命周期監(jiān)聽:ServletContextListener框仔,它有兩個方法舀武,一個在出生時調(diào)用,一個在死亡時調(diào)用存和;
¨ 屬性監(jiān)聽:ServletContextAttributeListener奕剃,它有三個方法,一個在添加屬性時調(diào)用捐腿,一個在替換屬性時調(diào)用纵朋,最后一個是在移除屬性時調(diào)用。
?HttpSession(監(jiān)聽Session)
¨ 生命周期監(jiān)聽:HttpSessionListener茄袖,它有兩個方法操软,一個在出生時調(diào)用,一個在死亡時調(diào)用宪祥;
屬性監(jiān)聽:HttpSessioniAttributeListener聂薪,它有三個方法,一個在添加屬性時調(diào)用蝗羊,一個在替換屬性時調(diào)用藏澳,最后一個是在移除屬性時調(diào)用。
感知Session監(jiān)聽:
1:HttpSessionBindingListener監(jiān)聽
⑴在需要監(jiān)聽的實體類實現(xiàn)HttpSessionBindingListener接口
⑵重寫valueBound()方法耀找,這方法是在當該實體類被放到Session中時翔悠,觸發(fā)該方法
⑶重寫valueUnbound()方法业崖,這方法是在當該實體類從Session中被移除時,觸發(fā)該方法
2:HttpSessionActivationListener監(jiān)聽
⑴在需要監(jiān)聽的實體類實現(xiàn)HttpSessionActivationListener接口
⑵重寫sessionWillPassivate()方法蓄愁,這方法是在當該實體類被序列化時双炕,觸發(fā)該方法
⑶重寫sessionDidActivate()方法,這方法是在當該實體類被反序列化時撮抓,觸發(fā)該方法
二妇斤、八大監(jiān)聽器
Servlet監(jiān)聽器的作用是監(jiān)聽Web容器的有效期事件,可以監(jiān)聽由于Web應(yīng)用中狀態(tài)改變而引起的Servlet容器產(chǎn)生的相應(yīng)事件丹拯,然后接受并處理這些事件站超。其中提供的LIstener接口有這些:
(1)ServletContextListener;????????
Servlet的上下文監(jiān)聽,它主要實現(xiàn)監(jiān)聽ServletContext的創(chuàng)建和刪除乖酬。該接口提供了兩種方法
??????????????????1.contextInitialized(ServletContextEvent event);???通知正在收聽的對象顷编,應(yīng)用程序已經(jīng)被加載和初始化。
??????????????????2.contextDestroyed(ServletCotextEvent event);???通知正在收聽的對象剑刑,應(yīng)用程序已經(jīng)被載出媳纬,即關(guān)閉。
(2)ServletAttributeListener施掏;????
??主要實現(xiàn)監(jiān)聽ServletContext屬性的增加钮惠,刪除和修改。該接口提供了一下3個方法
????????????????1.attributeAdded(ServletContextAttributeEvent event);???
當有對象加入Application的范圍時七芭,通知正在收聽的對象
????????????????2.attributeReplaced(ServletContextAttributeEvent event);
當在application的范圍有對象取代另一個對象的時素挽,通知正在收聽的對象
????????????????3.attributeRemoved(ServletContextAttributeEvent event);?
??當有對象從application的范圍移除時,通知正在收聽的對象
(3)HttpSessionListener;??????????
??HTTP會話監(jiān)聽狸驳,該接口實現(xiàn)監(jiān)聽HTTP會話創(chuàng)建预明、銷毀。該接口提供了一下兩種方法
???????????????????1.sessionCreated(HttpSessionEvent event);???????
通知正在收聽的對象耙箍,session已經(jīng)被加載及初始化
???????????????????2. sessionDestoryed(HttpSessionEvent event)l????????
??通知正在收聽的對象撰糠,session已經(jīng)被載出(HttpSessionEvent類的主要方法是getSession(),可以使用該方法回傳一個session對象)
(4)HttpSessionActivationListener;?????????
?該接口實現(xiàn)監(jiān)聽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施无;??????????????????????
??接口實現(xiàn)監(jiān)聽HTTP會話中對象的綁定信息辉词。它是唯一不需要在web.xml中設(shè)定Listener的。該接口提供了以下2個方法
??????????????????1.valueBound(HttpSessionBindingEvent event);??????????????????????
當有對象加入session的范圍時會被自動調(diào)用
??????????????????2.valueUnBound(HttpSessionBindingEvent event);????????????????????
??當有對象從session的范圍內(nèi)移除時會被自動調(diào)用
(6)HttpSessionAttributeListener;?????????????
??該接口實現(xiàn)監(jiān)聽HTTP會話中屬性的設(shè)置請求猾骡。該接口提供了以下兩個方法瑞躺。
?????????????????1.sessionDidActivate(HttpSessionEvent event);??????????
??通知正在收聽的對象隧魄,它的session已經(jīng)變?yōu)橛行顟B(tài)。
?????????????????2.sessionWillPassivate(HttpSessionEvent event);??????????
??通知正在收聽的對象隘蝎,它的session已經(jīng)變?yōu)闊o效狀態(tài)
(7)ServletRequestListener;???????????????????
??該接口提供了以下兩個方法。
???????????????????1.requestInitalized(ServletRequestEvent event)?????????????
通知正在收聽的對象襟企,ServletRequest已經(jīng)被加載及初始化
???????????????????2.requestDestroyed(ServletRequestEvent event)?????????
通知正在收聽的對象嘱么,ServletRequest已經(jīng)被載出,即關(guān)閉
(8)ServletRequestAttributeListener
??該接口提供了一下三種方法
????????????????????1.attributeAdded(ServletRequestAttributeEvent event)顽悼;?????
???當有對象加入request的范圍時曼振,通知正在收聽的對象
????????????????????2.attributeReplaced(ServletRequestAttributeEvent event);????????
當在request的范圍內(nèi)有對象取代兩一個對象時,通知正在收聽的對象
???????????????????3.attributeRemoved(ServletRequestAttributeEvent event);????
??當有對象從request的范圍移除時蔚龙,通知正在收聽的對象