Servlet的理解

前言

好記性不如爛筆頭悼枢,而且學(xué)習(xí)了卻沒有做筆記總結(jié)脉课,就不算學(xué)習(xí)啤月。因此寫了一篇文章總結(jié)一下對 Servlet的理解。

什么是 Servlet

  • 一個負(fù)責(zé)接收和響應(yīng)客戶端請求的 Java 程序

A servlet is a small Java program that runs within a Web server.
Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.

打開 Servlet.java 的源碼嫉髓,可以看到這一段注釋。它說:Servlet 就是一個運(yùn)行在 Web 服務(wù)器中的 Java 程序邑闲。servlet 可以接收和響應(yīng) Web 客戶端的網(wǎng)絡(luò)請求算行。

  • Java Web 的三大組件(Servlet、Filter苫耸、Listener)之一

Servlet 的架構(gòu)

Servlet 的繼承關(guān)系

public interface Servlet
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
public abstract class HttpServlet extends GenericServlet

所有的 Servlet 都需要實現(xiàn) Servlet 接口州邢。Servlet 接口定義了 Servlet 的生命周期方法

init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destroy()

Servlet 初始化時會調(diào)用 init(ServletConfig config) 方法;在 service(ServletRequest req, ServletResponse res) 方法中對客戶端的請求進(jìn)行處理褪子;如果 Servlet 不用了量淌,會調(diào)用 destroy() 方法銷毀,然后等待垃圾回收嫌褪。

GenericServlet

為了方便編寫 Servlet呀枢,創(chuàng)造了 GenericServlet 抽象類狐血,只需要實現(xiàn) public abstract void service(ServletRequest req, ServletResponse res) 方法即可假丧。

HttpServlet

HttpServlet 是和 HTTP 協(xié)議有關(guān)的 Servlet晶衷,只需要重寫幾個 HTTP 相關(guān)的方法

  • doGet(HttpServletRequest req, HttpServletResponse resp)
  • doPost(HttpServletRequest req, HttpServletResponse resp)
  • doPut(HttpServletRequest req, HttpServletResponse resp)
  • doDelete(HttpServletRequest req, HttpServletResponse resp)

和 Servlet 生命周期的相關(guān)方法

  • init()
  • destroy()

當(dāng)請求到來時但惶,會調(diào)用 service(ServletRequest req, ServletResponse res)阔加,在 HttpServlet 中方法的實現(xiàn)如下

public void service(ServletRequest req, ServletResponse res) {
    HttpServletRequest  request;
    HttpServletResponse response;
    
    if (!(req instanceof HttpServletRequest &&
            res instanceof HttpServletResponse)) {
        throw new ServletException("non-HTTP request or response");
    }

    request = (HttpServletRequest) req;
    response = (HttpServletResponse) res;

    service(request, response);
}

這個方法只做了兩件事

  • ServletRequest 強(qiáng)轉(zhuǎn)為 HttpServletRequest请毛;ServletResponse 強(qiáng)轉(zhuǎn)為 HttpServletResponse
  • 調(diào)用 service(HttpServletRequest req, HttpServletResponse resp) 方法伟葫,在這個方法中會對 HTTP 的請求進(jìn)行判斷官卡,然后調(diào)用對應(yīng)的 doXX() 方法
protected void service(HttpServletRequest req, HttpServletResponse resp) {
    String method = req.getMethod();

    if (method.equals(METHOD_GET)) {
        // ...
        doGet(req, resp);
    } else if (method.equals(METHOD_HEAD)) {
        // ...
        doHead(req, resp);
    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);          
    } else if (method.equals(METHOD_PUT)) {
        doPut(req, resp);          
    } else if (method.equals(METHOD_DELETE)) {
        doDelete(req, resp);          
    } else if (method.equals(METHOD_OPTIONS)) {
        doOptions(req,resp);          
    } else if (method.equals(METHOD_TRACE)) {
        doTrace(req,resp);          
    } else {
        // ...          
    }
}

Servlet與線程安全

  • 不要在Servlet中創(chuàng)建成員刻坊,創(chuàng)建局部變量即可
  • 可以創(chuàng)建無狀態(tài)成員
  • 可以創(chuàng)建有狀態(tài)的成員枷恕,但狀態(tài)必須為只讀的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谭胚,隨后出現(xiàn)的幾起案子徐块,更是在濱河造成了極大的恐慌未玻,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛹锰,死亡現(xiàn)場離奇詭異深胳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铜犬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舞终,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人癣猾,你說我怎么就攤上這事敛劝。” “怎么了纷宇?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵夸盟,是天一觀的道長。 經(jīng)常有香客問我像捶,道長上陕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任拓春,我火速辦了婚禮释簿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硼莽。我一直安慰自己庶溶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布懂鸵。 她就那樣靜靜地躺著偏螺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匆光。 梳的紋絲不亂的頭發(fā)上套像,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音殴穴,去河邊找鬼凉夯。 笑死,一個胖子當(dāng)著我的面吹牛采幌,可吹牛的內(nèi)容都是我干的劲够。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼休傍,長吁一口氣:“原來是場噩夢啊……” “哼征绎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤人柿,失蹤者是張志新(化名)和其女友劉穎柴墩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凫岖,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡江咳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哥放。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼指。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甥雕,靈堂內(nèi)的尸體忽然破棺而出踩身,到底是詐尸還是另有隱情,我是刑警寧澤社露,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布挟阻,位于F島的核電站,受9級特大地震影響峭弟,放射性物質(zhì)發(fā)生泄漏附鸽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一瞒瘸、第九天 我趴在偏房一處隱蔽的房頂上張望拒炎。 院中可真熱鬧,春花似錦挨务、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惯雳,卻和暖如春朝巫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背石景。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工劈猿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潮孽。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓揪荣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親往史。 傳聞我的和親對象是個殘疾皇子仗颈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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