servlet的生命周期是servlet相關(guān)知識(shí)中很重要的一部分藕甩。
servlet從被加載到銷毀經(jīng)歷了多個(gè)階段雷逆,其中需要我們十分了解每個(gè)階段的意義作用晦攒,才能更好地編寫相關(guān)的servlet程序狐肢。
servlet的生命周期詳解
下圖很好的說明了servlet的各個(gè)階段
- 首先弃秆,容器加載servlet類丧诺,從class字節(jié)碼加載類
- 隨后初始化servlet入桂,使之成為一個(gè)對(duì)象!servlet的無參構(gòu)造函數(shù)運(yùn)行驳阎,這里不需要我們自己寫構(gòu)造函數(shù)抗愁,只需要使用編譯器的提供的默認(rèn)構(gòu)造函數(shù)即可(** 相當(dāng)于new操作 ,成為一個(gè)對(duì)象)呵晚,值得注意的是蜘腌,此處的只是一個(gè)普通的對(duì)象,還不具備成為一個(gè)完整servlet的一些信息和功能饵隙,所以我們要進(jìn)行下一步撮珠,也就是init()方法。**
- 調(diào)用init()方法金矛,此方法只在servlet的一生中調(diào)用一次芯急,而且必須在容器調(diào)用service()之前完成。這一步主要是讓上一步對(duì)象加上一些東西驶俊,使之不再是一個(gè)普通的對(duì)象志于,而是一個(gè)特殊的servlet對(duì)象。
- 調(diào)用service()方法废睦,servlet的一生主要都在這里度過伺绽,處理用戶請(qǐng)求,每個(gè)請(qǐng)求在一個(gè)單獨(dú)的線程里運(yùn)行嗜湃。
- 調(diào)用destroy()方法奈应,容器調(diào)用這個(gè)方法,從而在servlet被殺死之前有機(jī)會(huì)清理資源购披。與init一樣杖挣,destroy也只能調(diào)用一次。
servlet生命周期中三大重要的時(shí)刻
init()
何時(shí)調(diào)用:servlet實(shí)例創(chuàng)建后刚陡,并在servlet能為客戶請(qǐng)求提供service服務(wù)前惩妇,容器要對(duì)servlet調(diào)用init株汉。
作用: 使你在servlet處理客戶請(qǐng)求之前有機(jī)會(huì)對(duì)其進(jìn)行初始化
是否覆蓋: 有可能。如果由初始化代碼(如得到一個(gè)數(shù)據(jù)庫(kù)連接)歌殃,就要調(diào)用init()方法service()
何時(shí)調(diào)用:
第一個(gè)客戶請(qǐng)求到來時(shí)乔妈,容器會(huì)開始一個(gè)新線程,或者從線程池分配一個(gè)線程氓皱,并調(diào)用servlet的service()方法路召。
作用:
這個(gè)方法會(huì)查看請(qǐng)求,確定http方法
是否覆蓋:
不太可能doGet或者doPost
何時(shí)調(diào)用:
service方法根據(jù)請(qǐng)求的http方法調(diào)用doGet或者doPost波材。
作用:
要在這里寫代碼股淡,你的web需要實(shí)現(xiàn)的業(yè)務(wù)邏輯等
是否覆蓋:
一定要覆蓋其中之一。
** 每個(gè)請(qǐng)求在一個(gè)單獨(dú)的線程里運(yùn)行廷区。容器不關(guān)心是誰的請(qǐng)求唯灵,每個(gè)到來的請(qǐng)求意味著一個(gè)新的線程。