servlet的生命周期一般包含4個(gè)階段
1、加載和實(shí)例化
servlet容器負(fù)責(zé)加載和實(shí)例化 servlet
2、初始化
init() 方法初始化servlet 對(duì)象,只能調(diào)用一次
3、處理請(qǐng)求
servlet 容器調(diào)用service()方法處理請(qǐng)求悟耘,request 方法獲取客戶端相關(guān)信息和請(qǐng)求信息,response 方法設(shè)置響應(yīng)信息织狐。
由service方法調(diào)用對(duì)應(yīng)的方法如doGet 暂幼、doPost
4、服務(wù)終止
destroy 方法移迫,釋放該servlet實(shí)例所使用的資源旺嬉,只能調(diào)用一次
注意事項(xiàng)
1、不要使用servlet實(shí)例變量起意,否則坑你產(chǎn)生線程安全問(wèn)題鹰服。
2、不要用init()方法獲取數(shù)據(jù)庫(kù)連接
3、@WebServlet(urlPatterns = "/ServletOne",loadOnStartup = -1)
Java EE中 loadOnStartup默認(rèn)為-1悲酷;即servlet 不隨容器啟動(dòng)而加載
loadOnStartup 為非負(fù)數(shù)時(shí)套菜,servlet 歲容器啟動(dòng)而加載,且數(shù)字越小優(yōu)先級(jí)越高设易。
關(guān)于servlet的service() 方法
在學(xué)習(xí)Servlet的過(guò)程中逗柴,我們大多時(shí)候編碼都是直接繼承HttpServlet這個(gè)類,并且重寫(xiě)doGet 顿肺,doPost戏溺,但是查看Api時(shí)我們會(huì)發(fā)現(xiàn)Servlet接口 ,GenericSevlet抽象類 以及HttpServlet類中都有service方法屠尊,那么為什么我們繼承HttpSevlet類時(shí)不要重寫(xiě)service 而要重寫(xiě)doGet doPost呢旷祸?service的作用是什么捏?讼昆?
Servlet中托享,service方法是一直存在的,因?yàn)樽罡邔拥慕涌赟ervlet(像HttpServlet等具體的servlet都是直接或者間接實(shí)現(xiàn)了這個(gè)接口)里面就有這個(gè)方法浸赫,所以不管是怎樣的servlet類闰围,都有service方法,沒(méi)有service就不能稱為一個(gè)Servlet了既峡。
而對(duì)于service方法羡榴,一般來(lái)說(shuō)這個(gè)方法是不需要重寫(xiě)的,因?yàn)樵贖ttpServlet中已經(jīng)有了很好的實(shí)現(xiàn)运敢,它會(huì)根據(jù)請(qǐng)求的方式校仑,調(diào)用doGet,doPos以及其他的doXXXt方法者冤,也就是說(shuō)service是用來(lái)轉(zhuǎn)向的肤视,所以我們一般寫(xiě)一個(gè)servlet,只需要重寫(xiě)doGet或者doPost就可以了涉枫。如果重寫(xiě)了service方法,那么servlet容器就會(huì)把請(qǐng)求交給這個(gè)方法來(lái)處理腐螟,倘若你重寫(xiě)的service方法沒(méi)有調(diào)用doXXX愿汰,即使你在Servlet中又重寫(xiě)了其他doGet doPost等也是不回被調(diào)用的 因?yàn)镾ervlet的service被自動(dòng)調(diào)用(就像init destory一樣)惋鹅,所以如果你由于某種需要啤咽,需要重寫(xiě)service方法,并且更具不同的method調(diào)用doPost doGet等時(shí)搀擂,就要在末尾加上一句super.service(),這樣就可以解決問(wèn)題了汽绢。
參考鏈接