分為啟動(加載web應(yīng)用的有關(guān)數(shù)據(jù)拴孤,創(chuàng)建ServletContext對象放闺,對Filter和一些Servlet初始化)爷速、運(yùn)行時(主要是Servlet容器調(diào)用service(方法))和終止(釋放資源)三個階段双泪。
該過程可通過Tomcat的管理應(yīng)用來控制應(yīng)用的生命周期:
Reload操作: 相當(dāng)于先stop當(dāng)前web應(yīng)用坞古,再start梆惯。
Undeploy操作: 從Tomcat卸除酱鸭,web文件被刪除。
## Servlet生命周期
就是Servlet容器控制的Servlet接口提供的init垛吗、service凹髓、destroy三個方法。
在Servlet的生命周期中怯屉,初始化和銷毀只會發(fā)生一次扁誓,即init()和destroy()方法只會被Servlet容器調(diào)用一次。service()取決于客戶端請求的次數(shù)蚀之。
實踐驗證:寫一個繼承于GenericServlet類的xxxservlet蝗敢,設(shè)置三個全局變量分別在三個方法中打印,看結(jié)果足删,即可寿谴。
并且,可以有多個xxxservlet對象對應(yīng)同一個xxxServlet類失受,盡管類代碼一模一樣讶泰,但屬于不同的servlet咏瑟,互相沒有關(guān)系!痪署!
——————
## ServletContext與Web應(yīng)用范圍
Servlet容器在啟動一個web應(yīng)用時码泞,會為它創(chuàng)建唯一的ServletContext對象,終止時銷毀狼犯。
因此余寥,ServletContext對象與web應(yīng)用具有同樣的生命周期。而且悯森,ServletContext對象可以被web應(yīng)用中的所有web組件共享宋舷。因此,可以利用該對象來存取web應(yīng)用范圍內(nèi)的共享數(shù)據(jù)(可以是任意類型)瓢姻。
實踐驗證: 實現(xiàn)web統(tǒng)計訪問次數(shù)的功能祝蝠。先寫一個Counter類,將其放入servletContext對象幻碱。(這里有一種技巧绎狭,就是怎么放?褥傍?你總不能每次請求都放一次吧坟岔!所以,先從servletContext獲取該對象摔桦,如果為null則將其放入社付,所以第二次以后都只是取,不會再執(zhí)行放入的邏輯了邻耕,if不符合了啊鸥咖,當(dāng)且僅當(dāng)?shù)谝淮尾欧?。
——————
更進(jìn)一步兄世,將計數(shù)寫入文件啼辣,當(dāng)web重啟時仍然能夠繼續(xù)計數(shù)。那么御滩,什么時候?qū)懭肱概。裁磿r候讀取呢?削解?
我們已經(jīng)知道富弦,ServletContext對象最早被創(chuàng)建,最晚被銷毀氛驮。那么我們的Counter是放到ServletContext對象中的腕柜,生命周期隨著ServletContext一樣。這個時候,就需要ServletContextListner出馬了盏缤,顧名思義砰蠢,它是來監(jiān)聽ServletContext的。只需要寫一個實現(xiàn)該接口的類就可以了唉铜,在contextInitialized()和contextDestroyd()方法寫讀取和寫入文件的邏輯即可台舱。思想如下:
——————
提一下Servlet的異常,ServletException和IOException潭流,前者由Servlet容器捕獲竞惋,給客戶端響應(yīng)。后者表示io操作時異常幻枉。
——————
防止頁面被客戶端緩存:
在響應(yīng)時設(shè)置一些header。