Servlet進(jìn)階與web.xml詳解

<servlet></servlet> 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時(shí),必須首先命名servlet或JSP頁面撒璧。Servlet元素就是用來完成此項(xiàng)任務(wù)的答朋。?

<servlet-mapping></servlet-mapping> 服務(wù)器一般為servlet提供一個(gè)缺省的URL:http://host/webAppPrefix/servlet/ServletName津辩。?但是,常常會(huì)更改這個(gè)URL施无,以便servlet可以訪問初始化參數(shù)或更容易地處理相對(duì)URL辉词。在更改缺省URL時(shí),使用servlet-mapping元素猾骡。?

首頁: 用welcome-file標(biāo)簽添加主頁较屿,逐級(jí)向下找

<welcome-file-list>

? ? <welcome-file>index.jsp</welcome-file>

? </welcome-file-list>

<load-on-startup> 8</load-on-startup>? //servlet初始化時(shí)的加載優(yōu)先級(jí),int數(shù)值越小越優(yōu)先卓练。


Servlet的生命周期包含了下面4個(gè)階段:

1.加載和實(shí)例化

2.初始化

3.請(qǐng)求處理

4.服務(wù)終止



Web服務(wù)器在與客戶端交互時(shí)Servlet的工作過程是:

1.?????在客戶端對(duì)web服務(wù)器發(fā)出請(qǐng)求

2.???? web服務(wù)器接收到請(qǐng)求后將其發(fā)送給Servlet

3.???? Servlet容器為此產(chǎn)生一個(gè)實(shí)例對(duì)象并調(diào)用ServletAPI中相應(yīng)的方法來對(duì)客戶端HTTP請(qǐng)求進(jìn)行處理,然后將處理的響應(yīng)結(jié)果返回給WEB服務(wù)器.

4.???? web服務(wù)器將從Servlet實(shí)例對(duì)象中收到的響應(yīng)結(jié)構(gòu)發(fā)送回客戶端.


servlet的生命周期:

1.加載和實(shí)例化

  Servlet容器負(fù)責(zé)加載和實(shí)例化Servlet隘蝎。當(dāng)Servlet容器啟動(dòng)時(shí),或者在容器檢測(cè)到需要這個(gè)Servlet來響應(yīng)第一個(gè)請(qǐng)求時(shí)襟企,創(chuàng)建Servlet實(shí)例嘱么。當(dāng)Servlet容器

啟動(dòng)后,它必須要知道所需的Servlet類在什么位置顽悼,Servlet容器可以從本地文件系統(tǒng)曼振、遠(yuǎn)程文件系統(tǒng)或者其他的網(wǎng)絡(luò)服務(wù)中通過類加載器加載Servlet類几迄,

成功加載后,容器創(chuàng)建Servlet的實(shí)例冰评。因?yàn)槿萜魇峭ㄟ^Java的反射API來創(chuàng)建Servlet實(shí)例映胁,調(diào)用的是Servlet的默認(rèn)構(gòu)造方法(即不帶參數(shù)的構(gòu)造方法),所

以我們?cè)诰帉慡ervlet類的時(shí)候甲雅,不應(yīng)該提供帶參數(shù)的構(gòu)造方法解孙。


2.初始化

  在Servlet實(shí)例化之后,容器將調(diào)用Servlet的init()方法初始化這個(gè)對(duì)象抛人。初始化的目的是為了讓Servlet對(duì)象在處理客戶端請(qǐng)求前完成一些初始化的工作弛姜,

如建立數(shù)據(jù)庫的連接,獲取配置信息等妖枚。對(duì)于每一個(gè)Servlet實(shí)例廷臼,init()方法只被調(diào)用一次。在初始化期間绝页,Servlet實(shí)例可以使用容器為它準(zhǔn)備的

ServletConfig對(duì)象從Web應(yīng)用程序的配置信息(在web.xml中配置)中獲取初始化的參數(shù)信息荠商。在初始化期間,如果發(fā)生錯(cuò)誤续誉,Servlet實(shí)例可以拋出

ServletException異忱趁唬或者UnavailableException異常來通知容器。ServletException異常用于指明一般的初始化失敗屈芜,例如沒有找到初始化參數(shù)郊愧;而

UnavailableException異常用于通知容器該Servlet實(shí)例不可用朴译。例如井佑,數(shù)據(jù)庫服務(wù)器沒有啟動(dòng),數(shù)據(jù)庫連接無法建立眠寿,Servlet就可以拋出

UnavailableException異常向容器指出它暫時(shí)或永久不可用躬翁。


I.如何配置Servlet的初始化參數(shù)?

?? 在web.xml中該Servlet的定義標(biāo)記中盯拱,比如:

TimeServlet

com.allanlxf.servlet.basic.TimeServlet

user

username

blog

http://盒发。。狡逢。

配置了兩個(gè)初始化參數(shù)user和blog它們的值分別為usernamehttp://宁舰。。奢浑。蛮艰, 這樣以后要修改用戶名和博客的地址不需要修改Servlet代碼,只需修改配置文件即可雀彼。

II.如何讀取Servlet的初始化參數(shù)壤蚜?

?????? ServletConfig中定義了如下的方法用來讀取初始化參數(shù)的信息:

?????? public String getInitParameter(String name)

參數(shù):初始化參數(shù)的名稱即寡。

返回:初始化參數(shù)的值,如果沒有配置袜刷,返回null聪富。

III.init(ServletConfig)方法執(zhí)行次數(shù)

?????? 在Servlet的生命周期中,該方法執(zhí)行一次著蟹。

IV.init(ServletConfig)方法與線程

?????該方法執(zhí)行在單線程的環(huán)境下墩蔓,因此開發(fā)者不用考慮線程安全的問題。

V.init(ServletConfig)方法與異常

???該方法在執(zhí)行過程中可以拋出ServletException來通知Web服務(wù)器Servlet實(shí)例初始化失敗草则。一旦ServletException拋出钢拧,Web服務(wù)器不會(huì)將客戶端請(qǐng)求交給該Servlet實(shí)例來處理,而是報(bào)告初始化失敗異常信息給客戶端炕横,該Servlet實(shí)例將被從內(nèi)存中銷毀源内。如果在來新的請(qǐng)求,Web服務(wù)器會(huì)創(chuàng)建新的Servlet實(shí)例份殿,并執(zhí)行新實(shí)例的初始化操作



3.請(qǐng)求處理

  Servlet容器調(diào)用Servlet的service()方法對(duì)請(qǐng)求進(jìn)行處理膜钓。要注意的是,在service()方法調(diào)用之前卿嘲,init()方法必須成功執(zhí)行颂斜。在service()方法中,

Servlet實(shí)例通過ServletRequest對(duì)象得到客戶端的相關(guān)信息和請(qǐng)求信息拾枣,在對(duì)請(qǐng)求進(jìn)行處理后沃疮,調(diào)用ServletResponse對(duì)象的方法設(shè)置響應(yīng)信息。在service

()方法執(zhí)行期間梅肤,如果發(fā)生錯(cuò)誤司蔬,Servlet實(shí)例可以拋出ServletException異常或者UnavailableException異常姨蝴。如果UnavailableException異常指示了該實(shí)

例永久不可用俊啼,Servlet容器將調(diào)用實(shí)例的destroy()方法,釋放該實(shí)例左医。此后對(duì)該實(shí)例的任何請(qǐng)求授帕,都將收到容器發(fā)送的HTTP 404(請(qǐng)求的資源不可用)響應(yīng)

。如果UnavailableException異常指示了該實(shí)例暫時(shí)不可用浮梢,那么在暫時(shí)不可用的時(shí)間段內(nèi)跛十,對(duì)該實(shí)例的任何請(qǐng)求,都將收到容器發(fā)送的HTTP 503(服務(wù)器暫

時(shí)忙秕硝,不能處理請(qǐng)求)響應(yīng)芥映。

I.?service()方法的職責(zé)

???? service()方法為Servlet的核心方法,客戶端的業(yè)務(wù)邏輯應(yīng)該在該方法內(nèi)執(zhí)行,典型的服務(wù)方法的開發(fā)流程為:

??? 解析客戶端請(qǐng)求-〉執(zhí)行業(yè)務(wù)邏輯-〉輸出響應(yīng)頁面到客戶端

II.service()方法與線程

???? 為了提高效率屏轰,Servlet規(guī)范要求一個(gè)Servlet實(shí)例必須能夠同時(shí)服務(wù)于多個(gè)客戶端請(qǐng)求颊郎,即service()方法運(yùn)行在多線程的環(huán)境下,Servlet開發(fā)者必須保證該方法的線程安全性霎苗。

III.service()方法與異常

service()方法在執(zhí)行的過程中可以拋出ServletException和IOException姆吭。其中ServletException可以在處理客戶端請(qǐng)求的過程中拋出,比如請(qǐng)求的資源不可用唁盏、數(shù)據(jù)庫不可用等内狸。一旦該異常拋出,容器必須回收請(qǐng)求對(duì)象厘擂,并報(bào)告客戶端該異常信息昆淡。IOException表示輸入輸出的錯(cuò)誤,編程者不必關(guān)心該異常刽严,直接由容器報(bào)告給客戶端即可昂灵。

編程注意事項(xiàng)說明:

1) 當(dāng)Server Thread線程執(zhí)行Servlet實(shí)例的init()方法時(shí),所有的Client Service Thread線程都不能執(zhí)行該實(shí)例的service()方法舞萄,更沒有線程能夠執(zhí)行該實(shí)例的destroy()方法眨补,因此Servlet的init()方法是工作在單線程的環(huán)境下,開發(fā)者不必考慮任何線程安全的問題倒脓。

2) 當(dāng)服務(wù)器接收到來自客戶端的多個(gè)請(qǐng)求時(shí)撑螺,服務(wù)器會(huì)在單獨(dú)的Client Service Thread線程中執(zhí)行Servlet實(shí)例的service()方法服務(wù)于每個(gè)客戶端。此時(shí)會(huì)有多個(gè)線程同時(shí)執(zhí)行同一個(gè)Servlet實(shí)例的service()方法崎弃,因此必須考慮線程安全的問題甘晤。

3) 請(qǐng)大家注意,雖然service()方法運(yùn)行在多線程的環(huán)境下饲做,并不一定要同步該方法线婚。而是要看這個(gè)方法在執(zhí)行過程中訪問的資源類型及對(duì)資源的訪問方式。分析如下:

???? i. 如果service()方法沒有訪問Servlet的成員變量也沒有訪問全局的資源比如靜態(tài)變量艇炎、文件酌伊、數(shù)據(jù)庫連接等腾窝,而是只使用了當(dāng)前線程自己的資源缀踪,比如非指向全局資源的臨時(shí)變量、request和response對(duì)象等虹脯。該方法本身就是線程安全的驴娃,不必進(jìn)行任何的同步控制。

????? ii. 如果service()方法訪問了Servlet的成員變量循集,但是對(duì)該變量的操作是只讀操作唇敞,該方法本身就是線程安全的,不必進(jìn)行任何的同步控制。

????? iii. 如果service()方法訪問了Servlet的成員變量疆柔,并且對(duì)該變量的操作既有讀又有寫咒精,通常需要加上同步控制語句。

????? iv. 如果service()方法訪問了全局的靜態(tài)變量旷档,如果同一時(shí)刻系統(tǒng)中也可能有其它線程訪問該靜態(tài)變量模叙,如果既有讀也有寫的操作,通常需要加上同步控制語句鞋屈。

????? v. 如果service()方法訪問了全局的資源范咨,比如文件、數(shù)據(jù)庫連接等厂庇,通常需要加上同步控制語句渠啊。



4.服務(wù)終止

  當(dāng)容器檢測(cè)到一個(gè)Servlet實(shí)例應(yīng)該從服務(wù)中被移除的時(shí)候,容器就會(huì)調(diào)用實(shí)例的destroy()方法权旷,以便讓該實(shí)例可以釋放它所使用的資源替蛉,保存數(shù)據(jù)到持久存

儲(chǔ)設(shè)備中。當(dāng)需要釋放內(nèi)存或者容器關(guān)閉時(shí)拄氯,容器就會(huì)調(diào)用Servlet實(shí)例的destroy()方法灭返。在destroy()方法調(diào)用之后,容器會(huì)釋放這個(gè)Servlet實(shí)例坤邪,該實(shí)例

隨后會(huì)被Java的垃圾收集器所回收熙含。如果再次需要這個(gè)Servlet處理請(qǐng)求,Servlet容器會(huì)創(chuàng)建一個(gè)新的Servlet實(shí)例艇纺。

在整個(gè)Servlet的生命周期過程中怎静,創(chuàng)建Servlet實(shí)例、調(diào)用實(shí)例的init()和destroy()方法都只進(jìn)行一次黔衡,當(dāng)初始化完成后蚓聘,Servlet容器會(huì)將該實(shí)例保存在內(nèi)存中,通過調(diào)用它的service()方法盟劫,為接收到的請(qǐng)求服務(wù)夜牡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侣签,隨后出現(xiàn)的幾起案子塘装,更是在濱河造成了極大的恐慌,老刑警劉巖影所,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦肴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猴娩,警方通過查閱死者的電腦和手機(jī)阴幌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門勺阐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矛双,你說我怎么就攤上這事渊抽。” “怎么了议忽?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵腰吟,是天一觀的道長。 經(jīng)常有香客問我徙瓶,道長毛雇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任侦镇,我火速辦了婚禮灵疮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壳繁。我一直安慰自己震捣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布闹炉。 她就那樣靜靜地躺著蒿赢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渣触。 梳的紋絲不亂的頭發(fā)上羡棵,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音嗅钻,去河邊找鬼皂冰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛养篓,可吹牛的內(nèi)容都是我干的秃流。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼柳弄,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舶胀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碧注,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嚣伐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后应闯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纤控,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挂捻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年碉纺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骨田,死狀恐怖耿导,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情态贤,我是刑警寧澤舱呻,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站悠汽,受9級(jí)特大地震影響箱吕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柿冲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一茬高、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧假抄,春花似錦怎栽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谬以,卻和暖如春强饮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背为黎。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工胡陪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍舍。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓柠座,卻偏偏與公主長得像,于是被迫代替她去往敵國和親片橡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妈经,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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