web容器啟動(dòng)
在 WEB 容器啟動(dòng)后,會(huì)讀取 Servlet 設(shè)置信息,將 Servlet 類加載并實(shí)例化,并為每個(gè) Servlet 設(shè)置信息產(chǎn)生一個(gè)
ServletConfig 對(duì)象,而后調(diào)用 Servlet 接口的 init() 方法,并將產(chǎn)生的 ServletConfig 對(duì)象當(dāng)作參數(shù)傳入。
Servlet接口
- init(),在第一次請(qǐng)求servlet時(shí)會(huì)被調(diào)用,且整個(gè)生命周期只會(huì)被調(diào)用一次。一般來(lái)說(shuō),初始化時(shí)servlet容器會(huì)通過(guò)init()方法將一個(gè)ServletConfig對(duì)象傳遞給相應(yīng)的內(nèi)部成員變量,以供后續(xù)getXXX調(diào)用。
- service(),每當(dāng)有請(qǐng)求到來(lái),就調(diào)用這個(gè)方法。
- HttpServlet中繼承了抽象類GenericServlet,而GenericServlet實(shí)現(xiàn)了接口Servlet, ServletConfig,所以HttpServlet中需要繼承并重寫(xiě)servlet方法,里面封裝了GET、POST、PUT等多個(gè)HTTP方法,所以當(dāng)編寫(xiě)自己的httpservlet時(shí),只需要重寫(xiě)相應(yīng)的http方法。Servlet容器會(huì)通過(guò)調(diào)用service()方法,從而調(diào)用到自己重寫(xiě)的http方法。
- destory(),關(guān)閉Servlet容器或者卸載應(yīng)用程序時(shí)調(diào)用,一般在這個(gè)方法中編寫(xiě)清除代碼。
- getServletConfig(),返回一個(gè)ServletConfig對(duì)象
- getServletInfo(),返回一個(gè)字符串對(duì)象,可以自己定義。
ServletConfig
- getServletContext(),ServletContext是一個(gè)接口,表示Servlet應(yīng)用程序,每個(gè)Web應(yīng)用程序只有一個(gè)上下文,在將一個(gè)應(yīng)用程序不熟到多個(gè)容器的分布式環(huán)境中,每臺(tái)Java虛擬機(jī)只有一個(gè)ServletContext對(duì)象。
- getInitParameter(),可以取得@WebServlet或者 部署描述符 中的配置信息。(@WebServlet還需要配合@WebInitParam來(lái)使用)
- getInitParameterNames(); 取得所有配置信息的名稱
- getServletName(),取得servlet的名稱。
GenericServlet
- 同時(shí)implements Servlet, ServletConfig
- 主要作用:實(shí)現(xiàn)了ServletConfig中的所有方法
- 實(shí)現(xiàn)了Servlet中除service外的所有方法。
- 最重要的是,實(shí)現(xiàn)了Servlet中的init方法中要求的“將ServletConfig對(duì)象賦予類中的成員變量,以便getXXX調(diào)用,但是又沒(méi)有占據(jù)原本的無(wú)參init()方法,所以后面如果有需要,還是可以自己重現(xiàn)init()方法來(lái)實(shí)現(xiàn)自己的初始化,這個(gè)無(wú)參方法 會(huì)在
public void init(ServletConfig config)中被調(diào)用。
HttpServlet
- 繼承自GenericServlet,實(shí)現(xiàn)了GenericServlet唯一的抽象方法service();
- 所有繼承HttpServlet的類,已經(jīng)可以分別調(diào)用
http.getServletConfig()和http.getServletContext();,一般來(lái)說(shuō)我們也不需要重寫(xiě)這兩個(gè)方法。
部署描述符web.xml
- 放在WEB-INF目錄下
- 優(yōu)點(diǎn):如果需要修改配置值,如Servlet路徑,則不需要重現(xiàn)編譯Servlet類。
- 優(yōu)點(diǎn)2:可以將初始參數(shù)傳給一個(gè)Servlet,不需要重新編譯Servlet類,就可以對(duì)它們進(jìn)行編輯。
- 如果同時(shí)在@WebServlet和部署描述符上定義值,則部署描述符的優(yōu)先級(jí)更高。