Servlet學(xué)習(xí)總結(jié)

前言

Spring Boot 中的spring-boot-web-starter中默認(rèn)配置的Web容器就是Tomcat,而Tomcat是實(shí)現(xiàn)了Servlet規(guī)范的Web容器稚机,以前在項(xiàng)目中經(jīng)常用到轮傍,但是由于Spring Boot的約定先于配置大大隱藏了Tomcat的復(fù)雜性汽馋,還有Servlet的一些底層實(shí)現(xiàn)纺讲,導(dǎo)致在項(xiàng)目用到一些Servlet的東西卻不知道其接口之間的關(guān)系未檩。加上最近找實(shí)習(xí)也遇到面試官問(wèn)這些問(wèn)題蕾总,之前零散在網(wǎng)上看的不系統(tǒng)粥航,回答的時(shí)候有點(diǎn)懵,于是花了一天去較為系統(tǒng)的了解這個(gè)Java Web中的重要接口生百。

思維導(dǎo)圖

先看看我導(dǎo)圖递雀,然后再自底向上一一道來(lái),歸納得不全蚀浆,只有常見(jiàn)的接口缀程,接口的實(shí)現(xiàn)也沒(méi)有時(shí)間細(xì)看搜吧。


Servlet

什么是Servlet?

Servlet(server applet)是JavaEE(位于javax.servlet)中的編程規(guī)范杨凑,用在瀏覽器與Java之間訪問(wèn)交互滤奈,只需要實(shí)現(xiàn)了Servlet就可以在任意符合其規(guī)范的Web容器應(yīng)用服務(wù)器(Tomcat JBoss Wildfly)中運(yùn)行你的后端代碼。從而實(shí)現(xiàn)了一次編寫到處部署(面向接口編程的好處)撩满!

Servlet有哪些常見(jiàn)的接口蜒程?

Servlet接口

留給程序員去實(shí)現(xiàn)的一個(gè)重要接口,編寫業(yè)務(wù)邏輯伺帘,SQL查詢之類的

  1. void init(ServletConfig config)
  • servlet 初始化方法昭躺,在用戶訪問(wèn)時(shí)會(huì)實(shí)例化,該方法會(huì)被首次調(diào)用伪嫁,可用于資源連接领炫、打log
  1. void destory()
  • 對(duì)象被銷毀時(shí)調(diào)用幽歼,放一些資源關(guān)閉的一些代碼
  1. void service(ServletRequest req,ServletResponse res)
  • 最重要的一個(gè)方法皿淋,當(dāng)請(qǐng)求到來(lái)的時(shí)候會(huì)實(shí)例出Request Response并調(diào)用該方法,常常在這里實(shí)現(xiàn)業(yè)務(wù)邏輯了

ServletConfig接口

用于初始化Servlet對(duì)象時(shí)使用做修,已由Tomcat實(shí)現(xiàn)晶伦。

  1. 讀取web.xml中的配置信息init-param表示碟狞,可以用于配置數(shù)據(jù)庫(kù)連接等信息。
    2 . 獲取ServletContext

ServletContext接口

一個(gè)完整的webapp的應(yīng)用上下文婚陪,已由Tomcat實(shí)現(xiàn)。
啟動(dòng)時(shí)創(chuàng)建频祝,服務(wù)關(guān)閉時(shí)被摧毀泌参。可存放context-param環(huán)境變量常空、運(yùn)行時(shí)全局共享的一些數(shù)據(jù)沽一。

HttpServlet抽象類

繼承自GenericServlet(implements Servlet)的抽象類,提供了一些通用的實(shí)現(xiàn):

  1. ServletConfig在init時(shí)保存為引用
  2. 在service實(shí)現(xiàn)HTTP請(qǐng)求方式的解析和分發(fā)調(diào)用算法
  3. doGet漓糙、doPost等方法默認(rèn)拋出405錯(cuò)誤(不支持的請(qǐng)求方式)
  4. 實(shí)現(xiàn)HTTP請(qǐng)求頭的緩存信息解析
  5. 強(qiáng)制把ServletRequest轉(zhuǎn)換成HttpServletRequest調(diào)用service方法

HttpServletRequest接口

繼承自ServletRequest铣缠,添加了HTTP協(xié)議的接口,在service方法中使用昆禽。添加了:

  1. url的參數(shù)獲然韧堋(表單、url)
  2. 獲取remoteIp
  3. 獲取轉(zhuǎn)發(fā)器(res.getRequestDispatcher("/b").forward(req,res))
  4. 重定向(res.sendRedirect)與轉(zhuǎn)發(fā)器的區(qū)別
  5. getCookie
  6. getSession

HttpServletResponse

繼承自ServletResponse醉鳖,同樣拓展了HTTP相關(guān)的東西捡硅,如:

  1. sendError發(fā)送HTTP狀態(tài)碼和信息
  2. getOutPutStream
  3. addCookie

HttpSession接口

可用HttpServletRequest.getSession()獲取當(dāng)前連接的會(huì)話。

  1. 獲取sessionId
  2. 獲取過(guò)期時(shí)間
  3. setAttribute盗棵、getAttribute壮韭、removeAttribute存放會(huì)話數(shù)據(jù)

Cookie接口

可用HttpServletRequest.getCookie()獲取當(dāng)前連接的cookie北发,res.addCookie發(fā)送給瀏覽器cookie

  1. setPath,以最后的斜杠匹配喷屋,默認(rèn)為當(dāng)前uri發(fā)送(/a/b/c匹配/a/b/)
  2. setMaxAge琳拨,過(guò)期時(shí)間(=0直接刪除,<0不存儲(chǔ)屯曹,>0x秒失效)

運(yùn)行時(shí)接口對(duì)應(yīng)關(guān)系

  1. 一個(gè)Servlet對(duì)象對(duì)應(yīng)一個(gè)Config狱庇,在web.xml定義的每個(gè)servlet的配置
  2. 一個(gè)webapp對(duì)應(yīng)ServletContext,所有servlet共享同一個(gè)是牢,在web.xml配置整個(gè)webapp的配置
  3. 一個(gè)請(qǐng)求對(duì)應(yīng)HttpServletRequest僵井,HttpServletResponse,每次請(qǐng)求創(chuàng)建不同的對(duì)象
  4. 一個(gè)會(huì)話對(duì)應(yīng)一個(gè)HttpSession驳棱,可包含用戶的多個(gè)請(qǐng)求

各接口的生命周期批什?

Servlet/HttpServlet

  1. 啟動(dòng)時(shí)默認(rèn)不會(huì)被實(shí)例化(除非配置load-up-startup)
  2. 用戶訪問(wèn)地址
  3. Web容器解析出對(duì)應(yīng)uri,在容器上下文尋找對(duì)應(yīng)的servlet
  4. 找到則調(diào)用其service方法
  5. 沒(méi)找到則通過(guò)web.xml文件的配置獲取完整類型社搅,通過(guò)反射實(shí)例化
  6. 實(shí)例化時(shí)會(huì)執(zhí)行無(wú)參構(gòu)造方法
  7. 傳入ServletConfig到init方法
  8. 最后調(diào)用service方法
  9. 銷毀:web容器關(guān)閉驻债、webapp重新部署、長(zhǎng)時(shí)間無(wú)訪問(wèn)時(shí)形葬,則調(diào)用destroy()做銷毀前的準(zhǔn)備

ServletContext

解析web.xml時(shí)創(chuàng)建合呐,服務(wù)啟動(dòng)時(shí)被創(chuàng)建,關(guān)閉時(shí)銷毀笙以。

HttpServletRequest HttpServletResponse

一次請(qǐng)求對(duì)應(yīng)一個(gè)對(duì)象淌实,完成請(qǐng)求則銷毀

我該選擇哪個(gè)Servlet類去實(shí)現(xiàn)?

HttpServlet猖腕。Servlet接口定義了基本方法拆祈,GenericServlet是實(shí)現(xiàn)了部分方法的抽象類,查看源碼可知:

  1. 實(shí)現(xiàn)init(ServletConfig config)倘感,保存了config的引用放坏,并設(shè)計(jì)一個(gè)空的init()供重寫
  2. 實(shí)現(xiàn)service(ServletRequest request,ServletResponse response),提供service(HttpServletRequest request, HttpServletResponse response)供重寫老玛,避免每次進(jìn)行轉(zhuǎn)型調(diào)用

HttpServlet是繼承GenericServlet的抽象方法淤年,提供了HTTP的更多實(shí)現(xiàn),包括

  1. 在service方法中解析HTTP請(qǐng)求方式蜡豹,分發(fā)GET到doGet麸粮,分發(fā)POST到doPost。
  2. 提供doXX的默認(rèn)實(shí)現(xiàn)余素,發(fā)送405/400的錯(cuò)誤豹休,表示不支持的請(qǐng)求方式。子類需要重寫這些方法去支持(巧妙=暗酢)
  3. doGet方法調(diào)用前威根,進(jìn)行了緩存檢查凤巨,當(dāng)未過(guò)期時(shí)返回304 not modify 表示資源未更改

Servlet GenericServlet HttpServlet 體現(xiàn)了什么設(shè)計(jì)模式?有什么好處洛搀?

模板方法敢茁。HttpServlet是一個(gè)模板類,實(shí)現(xiàn)了核心算法骨架留美,doGet doPost 具體實(shí)現(xiàn)步驟要在子類中完成彰檬。

特點(diǎn):doXX,doYY

作用:

  • 核心算法保護(hù)
  • 核心算法復(fù)用
  • 不改變算法前提下重新定義算法步驟的具體實(shí)現(xiàn)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谎砾,一起剝皮案震驚了整個(gè)濱河市逢倍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌景图,老刑警劉巖较雕,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挚币,居然都是意外死亡亮蒋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門妆毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慎玖,“玉大人,你說(shuō)我怎么就攤上這事笛粘〕谜” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵薪前,是天一觀的道長(zhǎng)痕钢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)序六,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任蚤吹,我火速辦了婚禮例诀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裁着。我一直安慰自己繁涂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布二驰。 她就那樣靜靜地躺著扔罪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桶雀。 梳的紋絲不亂的頭發(fā)上矿酵,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天唬复,我揣著相機(jī)與錄音,去河邊找鬼全肮。 笑死敞咧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辜腺。 我是一名探鬼主播休建,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼评疗!你這毒婦竟也來(lái)了测砂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤百匆,失蹤者是張志新(化名)和其女友劉穎砌些,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧华,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寄症,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矩动。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有巧。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悲没,靈堂內(nèi)的尸體忽然破棺而出篮迎,到底是詐尸還是另有隱情,我是刑警寧澤示姿,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布甜橱,位于F島的核電站,受9級(jí)特大地震影響栈戳,放射性物質(zhì)發(fā)生泄漏岂傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一子檀、第九天 我趴在偏房一處隱蔽的房頂上張望镊掖。 院中可真熱鬧,春花似錦褂痰、人聲如沸亩进。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)归薛。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間主籍,已是汗流浹背习贫。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崇猫,地道東北人沈条。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像诅炉,于是被迫代替她去往敵國(guó)和親蜡歹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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