2019-06-19

一、三大組件

???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的范圍移除時蔚龙,通知正在收聽的對象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冰评,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子木羹,更是在濱河造成了極大的恐慌甲雅,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坑填,死亡現(xiàn)場離奇詭異抛人,居然都是意外死亡,警方通過查閱死者的電腦和手機脐瑰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門妖枚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苍在,你說我怎么就攤上這事绝页。” “怎么了寂恬?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵续誉,是天一觀的道長。 經(jīng)常有香客問我初肉,道長屈芜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任朴译,我火速辦了婚禮井佑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眠寿。我一直安慰自己躬翁,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布盯拱。 她就那樣靜靜地躺著盒发,像睡著了一般例嘱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宁舰,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天拼卵,我揣著相機與錄音,去河邊找鬼蛮艰。 笑死腋腮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的壤蚜。 我是一名探鬼主播即寡,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袜刷!你這毒婦竟也來了聪富?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤著蟹,失蹤者是張志新(化名)和其女友劉穎墩蔓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萧豆,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡钢拧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炕横。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片源内。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖份殿,靈堂內(nèi)的尸體忽然破棺而出膜钓,到底是詐尸還是另有隱情,我是刑警寧澤卿嘲,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布颂斜,位于F島的核電站,受9級特大地震影響拾枣,放射性物質(zhì)發(fā)生泄漏沃疮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一梅肤、第九天 我趴在偏房一處隱蔽的房頂上張望司蔬。 院中可真熱鬧,春花似錦姨蝴、人聲如沸俊啼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授帕。三九已至同木,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跛十,已是汗流浹背彤路。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芥映,地道東北人洲尊。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像屏轰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子憋飞,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文包括:1霎苗、Listener簡介2、Servlet監(jiān)聽器3榛做、監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4唁盏、監(jiān)聽三個域?qū)?..
    廖少少閱讀 6,001評論 6 28
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實現(xiàn)中检眯,有程序代碼之間控制厘擂,又名依賴注入。All 類的創(chuàng)建锰瘸,...
    irckwk1閱讀 926評論 0 0
  • Based on Java? Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8閱讀 1,305評論 0 7
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題刽严。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,397評論 0 10