Servlet4.0規(guī)范(一)

Servlet 是Java Web開發(fā)的規(guī)范袱蚓,作為后臺開發(fā)人員有必要好好理解良蒸。

Servlet是什么遥巴?

servlet是基于JavaTM技術的Web組件,由容器管理悴务,可以生成動態(tài)內容睹限。與其他基于Java技術的組件一樣,servlets是獨立于平臺的Java類讯檐,它們被編譯成平臺無關的字節(jié)碼羡疗,可以動態(tài)地加載到支持Java技術的Web服務器中并由其運行。容器别洪,有時稱為servlet引擎叨恨,是提供servlet功能的Web服務器擴展。servlet通過servlet容器實現的請求/響應范式與Web客戶機交互蕉拢。

Servlet 容器是什么特碳?

servlet容器是Web服務器或應用程序服務器的一部分诚亚,它提供網絡服務,通過這些服務發(fā)送請求和響應午乓,解碼基于MIME的請求站宗,并格式化基于MIME的響應。servlet容器還包含并管理servlet的整個生命周期益愈。

servlet容器支持安裝到服務器上梢灭,也支持構建到應用程序中。

所有servlet容器都必須支持HTTP作為請求和響應的協(xié)議蒸其,但可能支持基于請求/響應的其他協(xié)議敏释,如HTTPS(HTTP over SSL)。

JavaSE8是底層Java平臺的最低版本摸袁,必須用它來構建servlet容器钥顽。

servlet與其他技術的比較?

在功能上靠汁,servlet提供了比公共網關接口(Common Gateway Interface蜂大,CGI)程序更高級別的抽象,但比JavaServer Faces等web框架提供的抽象級別更低蝶怔。

與其他服務器擴展機制相比奶浦,servlet具有以下優(yōu)勢:

1、它們通常比CGI腳本快得多踢星,因為使用了不同的處理模型澳叉。

2、它們使用許多Web服務器支持的標準API沐悦。

3成洗、它們具有Java編程語言的所有優(yōu)點,包括易用性開發(fā)和平臺獨立性所踊。

4泌枪、他們可以訪問Java平臺上可用的大量api。

Servlet接口

Servlet接口是JavaServletAPI的中心抽象秕岛。所有servlet要么直接實現該接口碌燕,要么更常見地通過擴展實現該接口的類來實現。JavaServletAPI中實現Servlet接口的兩個類是GenericServlet和HttpServlet继薛。大多數情況下修壕,開發(fā)人員都會擴展HttpServlet來實現他們的servlet。

Servlet請求處理方法

基本Servlet接口定義了一個用于處理客戶機請求的服務(service)方法遏考。對于servlet容器路由到servlet實例的每個請求慈鸠,都會調用此方法。

處理對Web應用程序的并發(fā)請求通常要求Web開發(fā)人員設計servlet來處理在特定時間在服務(service)方法中執(zhí)行的多個線程灌具。

通常青团,Web容器通過在不同線程上并發(fā)執(zhí)行服務方法來處理對同一servlet的并發(fā)請求譬巫。

HttpServlet抽象子類在基本Servlet接口之外添加了其他方法,這些方法由HttpServlet類中的服務方法自動調用督笆,以幫助處理基于HTTP的請求芦昔。這些方法包括:

? doGet doPost? doPut doDelete doHead? doOptions

通常在開發(fā)基于HTTP的Servlet時,Servlet開發(fā)人員只關心doGet和doPost方法娃肿。其他方法被認為是非常熟悉HTTP編程的程序員使用的方法咕缎。

HttpServlet接口定義getLastModified方法以支持條件GET操作。條件GET操作僅當資源在指定時間后被修改時才請求發(fā)送該資源料扰。在適當的情況下凭豪,這種方法的實現可以幫助有效地利用網絡資源。

Servlet生命周期

通過Servlet接口可知晒杈,Servlet包含初始化嫂伞,提供服務,摧毀等過程拯钻,如下代碼所示:

javax.servlet.Servlet#initjavax.servlet.Servlet#servicejavax.servlet.Servlet#destroy

提供服務service方法其實有兩種情況末早,一種是同步處理,另外一種是異步處理说庭,本文將講解同步處理請求的生命周期,異步情況下文再進行分析:

1郑趁、Servlet容器實例化Servlet對象(可能是容器啟動就實例化刊驴,也可能是延遲到需要處理對應請求的時候實例化)

2、初始化servlet javax.servlet.Servlet#init ServletConfig參數寡润,允許訪問系統(tǒng)環(huán)境配置捆憎,和ServletContext對象

? ? 特殊情況:可能存在初始化失敗的情況,拋出UnavailableException ServletException梭纹,在這種情況下躲惰,servlet不能放在活動服務中,必須由servlet容器釋放变抽。不調用destroy方法础拨,因為它被視為初始化不成功。

初始化失敗后绍载,容器可能會實例化和初始化新實例诡宗。此規(guī)則的例外情況是,當不可用異常指示不可用的最短時間時击儡,容器必須等待該時間段過去塔沃,然后才能創(chuàng)建和初始化新的servlet實例。

? ? ?注意事項:當工具加載和內省Web應用程序時阳谍,靜態(tài)初始化方法的觸發(fā)與init方法的調用是不同的蛀柴。在調用servlet接口的init方法之前螃概,開發(fā)人員不應假定servlet在活動容器運行時中。例如鸽疾,當只調用靜態(tài)(類)初始化方法時吊洼,servlet不應嘗試建立到數據庫或企業(yè)JavaBeansTM容器的連接。

3肮韧、處理請求 在正確初始化servlet之后融蹂,servlet容器可以使用它來處理客戶機請求,請求由ServletRequest類型的請求對象表示弄企。servlet通過調用ServletResponse類型的提供對象的方法來填寫對請求的響應超燃。這些對象作為參數傳遞給Servlet接口的服務(service)方法。對于HTTP請求拘领,容器提供的對象屬于HttpServletRequest和HttpServletResponse類型意乓。

? 3.1 多線程問題:一個servlet容器可能并發(fā)調用servlet的service方法

? 為了處理請求,Servlet開發(fā)人員必須為服務方法中的多個線程的并發(fā)處理做好充分的準備约素。

? 盡管不建議這樣做届良,但開發(fā)人員的另一種選擇是實現SingleThreadModel接口,該接口要求容器保證在服務方法中一次只有一個請求線程圣猎。servlet容器可以通過序列化servlet上的請求或維護servlet實例池來滿足此需求士葫。如果servlet是已標記為可分發(fā)的Web應用程序的一部分,那么容器可以在應用程序分布的每個JVM中維護一個servlet實例池送悔。

? 對于沒有實現SingleThreadModel接口的servlet慢显,如果服務方法(或HttpServlet抽象類的服務方法被分派到的doGet或doPost等方法)已用synchronized關鍵字定義,則servlet容器不能使用實例池方法欠啤,而必須通過實例池方法序列化請求荚藻。強烈建議開發(fā)人員在這些情況下不要同步服務方法(或分派給它的方法),因為這會對性能產生不利影響洁段。

? 3.2 處理過程中異常:ServletException 或者 UnavailableException

? UnavailableException分為臨時和永久性不可用:

? 如果不可用異常指示永久不可用应狱,則servlet容器必須從服務中刪除servlet,調用其destroy方法祠丝,然后釋放servlet實例疾呻。容器因該原因拒絕的任何請求都必須返回SC_NOT_FOUND(404)響應。

? 如果不可用異常指示臨時不可用纽疟,容器可以選擇在臨時不可用期間不通過servlet路由任何請求罐韩。任何服務請求都必須在服務不可用的情況下被拒絕,并在服務期間返回一個服務不可用的服務(SC_SERVICE_UNAVAILABLE 503)污朽。

容器可以選擇忽略永久性不可用性和臨時性不可用性之間的區(qū)別散吵,并將所有不可用性異常視為永久性的,從而移除從服務拋出任何不可用異常的servlet。?

javax.servlet.Servlet#service

Servlet服務完成矾睦,實例銷毀?晦款。

javax.servlet.Servlet#destroy

到此,本篇Servlet規(guī)范理解就到這了枚冗,本文介紹了Servlet和Servlet容器缓溅,介紹了Servlet的接口,分析了Servlet異步處理請求的生命周期等內容赁温,但是Servlet規(guī)范?還有很多內容坛怪,后面將陸續(xù)更新。?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末股囊,一起剝皮案震驚了整個濱河市袜匿,隨后出現的幾起案子,更是在濱河造成了極大的恐慌稚疹,老刑警劉巖居灯,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異内狗,居然都是意外死亡怪嫌,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門柳沙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩灭,“玉大人,你說我怎么就攤上這事赂鲤〈ū常” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵蛤袒,是天一觀的道長。 經常有香客問我膨更,道長妙真,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任荚守,我火速辦了婚禮珍德,結果婚禮上,老公的妹妹穿的比我還像新娘矗漾。我一直安慰自己锈候,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布敞贡。 她就那樣靜靜地躺著泵琳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上获列,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天谷市,我揣著相機與錄音,去河邊找鬼击孩。 笑死迫悠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的巩梢。 我是一名探鬼主播创泄,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼括蝠!你這毒婦竟也來了鞠抑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤又跛,失蹤者是張志新(化名)和其女友劉穎碍拆,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體慨蓝,經...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡感混,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了礼烈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弧满。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖此熬,靈堂內的尸體忽然破棺而出庭呜,到底是詐尸還是另有隱情,我是刑警寧澤犀忱,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布募谎,位于F島的核電站,受9級特大地震影響阴汇,放射性物質發(fā)生泄漏数冬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一搀庶、第九天 我趴在偏房一處隱蔽的房頂上張望拐纱。 院中可真熱鬧,春花似錦哥倔、人聲如沸秸架。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽东抹。三九已至蚂子,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間府阀,已是汗流浹背缆镣。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留试浙,地道東北人董瞻。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像田巴,于是被迫代替她去往敵國和親钠糊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361